From 33eb10710121590326e9ad0627a85581a81a0c69 Mon Sep 17 00:00:00 2001 From: armingol Date: Tue, 23 Sep 2025 07:04:02 +0000 Subject: [PATCH 001/111] Refactor IPoWDM and E2E service handling: update data structures, add L3VPN service generation, and implement frequency patching --- proto/ipowdm.proto | 24 +-- .../drivers/ietf_l3vpn/templates/tools.py | 155 ++++++++++++------ src/nbi/service/e2e_services/Resources.py | 70 +++++--- 3 files changed, 166 insertions(+), 83 deletions(-) diff --git a/proto/ipowdm.proto b/proto/ipowdm.proto index ca8f48d25..0f0a1f601 100644 --- a/proto/ipowdm.proto +++ b/proto/ipowdm.proto @@ -10,33 +10,21 @@ message RuleEndpoint { message DigitalSubCarrierId { int32 sub_carrier_id = 1; - bool active = 2; + string active = 2; } message DigitalSubCarriersGroup { int32 digital_sub_carriers_group_id = 1; - int32 number_of_digital_subcarriers = 2; - int32 digital_sub_carrier_group_size = 3; repeated DigitalSubCarrierId digital_sub_carrier_id = 4; } -message OpticalChannelConfig { - float frequency = 1; - float target_output_power = 2; - int32 operational_mode = 3; - string line_port = 4; - int32 total_number_of_digital_sub_carriers = 5; - int32 digital_sub_carrier_spacing = 6; - repeated DigitalSubCarriersGroup digital_sub_carriers_group = 7; -} - -message OpticalChannel { - OpticalChannelConfig config = 1; -} - message Component { string name = 1; - OpticalChannel optical_channel = 2; + float frequency = 2; + float target_output_power = 3; + int32 operational_mode = 4; + repeated DigitalSubCarriersGroup digital_sub_carriers_group = 5; + string operation = 6; } message Transceiver { diff --git a/src/device/service/drivers/ietf_l3vpn/templates/tools.py b/src/device/service/drivers/ietf_l3vpn/templates/tools.py index 817c0ea0a..90e853eba 100644 --- a/src/device/service/drivers/ietf_l3vpn/templates/tools.py +++ b/src/device/service/drivers/ietf_l3vpn/templates/tools.py @@ -11,15 +11,82 @@ # 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 types import SimpleNamespace -import os import json import logging - import requests LOGGER = logging.getLogger(__name__) +HEADERS = { + "Accept": "application/yang-data+json", + "Content-Type": "application/yang-data+json" +} + +site_template = { + "site-id": "", + "devices": { + "device": [ + { + "device-id": "", + "location": "" + } + ] + }, + "site-network-accesses": { + "site-network-access": [ + { + "site-network-access-id": "", + "device-reference": "", + "ip-connection": { + "ipv4": { + "address-allocation-type": "ietf-l3vpn-svc:static-address", + "addresses": { + "provider-address": "", + "customer-address": "", + "prefix-length": "" + } + } + }, + "vpn-attachment": { + "vpn-id": "vpn-p2mp" + }, + "site-network-access-type": "ietf-l3vpn-svc:multipoint" + } + ] + } +} + +def generate_p2mp_l3vpn_service(sites_data): + sites = [] + for idx, site in enumerate(sites_data): + site_entry = json.loads(json.dumps(site_template)) + site_entry["site-id"] = site["uuid"] + site_entry["devices"]["device"][0]["device-id"] = site["ip_address"] + site_entry["devices"]["device"][0]["location"] = site.get("location", f"site-{idx+1}") + site_entry["site-network-accesses"]["site-network-access"][0]["site-network-access-id"] = f"access-{site['uuid']}" + site_entry["site-network-accesses"]["site-network-access"][0]["device-reference"] = site["ip_address"] + site_entry["site-network-accesses"]["site-network-access"][0]["ip-connection"]["ipv4"]["addresses"]["provider-address"] = site["ip_address"] + site_entry["site-network-accesses"]["site-network-access"][0]["ip-connection"]["ipv4"]["addresses"]["customer-address"] = site["ip_address"] + site_entry["site-network-accesses"]["site-network-access"][0]["ip-connection"]["ipv4"]["addresses"]["prefix-length"] = site["ip_mask"] + sites.append(site_entry) + + service = { + "ietf-l3vpn-svc:l3vpn-svc": { + "sites": { + "site": sites + }, + "vpn-services": { + "vpn-service": [ + { + "vpn-id": "vpn-p2mp", + "vpn-service-topology": "ietf-l3vpn-svc:multipoint" + } + ] + } + } + } + return json.dumps(service, indent=2) + def create_request(resource_value): """ Create and send HTTP request based on a JSON template and provided resource value. The JSON template is expected to be in the same directory as this script, named 'ipowdm.json'. @@ -41,52 +108,48 @@ def create_request(resource_value): LOGGER.info("Creating request for resource_value: %s", resource_value) - data = resource_value[1]['rule_set']['transceiver'] + node_src = resource_value[1]['rule_set']['src'][0] + src = [{ + 'uuid': node_src["uuid"], + 'ip_address': node_src["ip_address"], + 'ip_mask': node_src["ip_mask"], + 'vlan_id': node_src["vlan_id"] + }] + dst_list = resource_value[1]['rule_set']['dst'] + dst = [] + for node in dst_list: + dst.append({ + 'uuid': node["uuid"], + 'ip_address': node["ip_address"], + 'ip_mask': node["ip_mask"], + 'vlan_id': node["vlan_id"] + }) + + sites_input = src + dst + + components = resource_value[1]['rule_set']['transceiver']['components'] + for i, device in enumerate(components): + name = sites_input[i]['uuid'] - LOGGER.info("Sending POST DSTINATION request with payload: %s", json.dumps(data, indent=2)) + if name == "T2.1":device["frequency"]= 195000000 + if name == "T1.1":device["frequency"]= 195006250 + if name == "T1.2":device["frequency"]= 195018750 + if name == "T1.3":device["frequency"]= 195031250 - response = FakeResponse() + LOGGER.debug(f"NODE DATA: \n{name}: {json.dumps(device, indent=2)}") + response = patch_optical_channel_frequency(device, name) + LOGGER.debug(f"RESPONSE :\n {response}") + p2mp_json = generate_p2mp_l3vpn_service(sites_input) + LOGGER.debug(f"Generated L3VPN P2MP service JSON:\n{p2mp_json}") return response -class FakeResponse: - """_Fake response object for testing purposes.""" - def __init__(self): - self.ok = True - self.status_code = 200 - self.text = '{"message": "OK"}' +def patch_optical_channel_frequency(data, DEVICE_ID): + encoded_path = f"http://192.168.202.254:80/restconf/data/device={DEVICE_ID}/openconfig-platform:components/component=channel-1/optical-channel/config" - def json(self): - """Return a sample JSON response.""" - return {"message": "OK"} -def tfs_post(request): - """ - Send a POST request to the TeraFlow Service Orchestrator. - - Args: - ip (str): IP address of the TeraFlow Service Orchestrator. - request (dict): The request payload to be sent. - - Returns: - dict: The response from the TeraFlow Service Orchestrator. - """ - user="admin" - password="admin" - token="" - session = requests.Session() - session.auth = (user, password) - url=f'http://10.95.86.62/webui' - response=session.get(url=url) - for item in response.iter_lines(): - if"csrf_token" in str(item): - string=str(item).split('= len(nodes): + LOGGER.warning(f"Index {i} exceeds nodes list length {len(nodes)}") + break + name = nodes[i] + if name == "T2.1":device["frequency"]= 195000000 + if name == "T1.1":device["frequency"]= 195006250 + if name == "T1.2":device["frequency"]= 195018750 + if name == "T1.3":device["frequency"]= 195031250 + + LOGGER.debug(f"NODE DATA: \n{name}:{device}") + response = test_patch_optical_channel_frequency(device, name) + LOGGER.debug(f"RESPONSE :\n {response}") + else: LOGGER.error("Unknown service type for allocationId: %s", allocationId) return { @@ -47,13 +66,26 @@ class E2EInfoDelete(Resource): 'message': 'Unknown service type', }, 400 - - LOGGER.info("Mock DELETE request sent to URL: %s", url) - LOGGER.info("Allocation ID: %s", allocationId) - service_id = grpc_service_id(DEFAULT_CONTEXT_NAME, allocationId) + service_id = grpc_service_id(DEFAULT_CONTEXT_NAME, service_id) self.service_client.DeleteService(service_id) return { 'status': 'Service deleted', 'allocationId': allocationId, - }, 200 \ No newline at end of file + }, 200 + +def test_patch_optical_channel_frequency(data, DEVICE_ID): + """Test PATCH to update optical channel frequency.""" + # Use simple path with / and encode manually for component name + encoded_path = f"http://192.168.202.254:80/restconf/data/device={DEVICE_ID}/openconfig-platform:components/component=channel-1/optical-channel/config" + + # Update frequency + patch_data = data + + response = requests.patch(f"{encoded_path}", + json=patch_data, + headers=HEADERS) + assert response.status_code == 200 + + # Validate restoration + return response \ No newline at end of file -- GitLab From 859ea3561ca21913d3f7df18516538482556a604 Mon Sep 17 00:00:00 2001 From: armingol Date: Thu, 2 Oct 2025 10:10:57 +0000 Subject: [PATCH 002/111] Implement L3VPN service deletion in E2EInfoDelete and refactor logging for clarity --- .../drivers/ietf_l3vpn/templates/tools.py | 214 +++++++++++++++--- src/nbi/service/e2e_services/Resources.py | 10 +- 2 files changed, 194 insertions(+), 30 deletions(-) diff --git a/src/device/service/drivers/ietf_l3vpn/templates/tools.py b/src/device/service/drivers/ietf_l3vpn/templates/tools.py index 90e853eba..e6e388448 100644 --- a/src/device/service/drivers/ietf_l3vpn/templates/tools.py +++ b/src/device/service/drivers/ietf_l3vpn/templates/tools.py @@ -56,36 +56,179 @@ site_template = { } } -def generate_p2mp_l3vpn_service(sites_data): - sites = [] - for idx, site in enumerate(sites_data): - site_entry = json.loads(json.dumps(site_template)) - site_entry["site-id"] = site["uuid"] - site_entry["devices"]["device"][0]["device-id"] = site["ip_address"] - site_entry["devices"]["device"][0]["location"] = site.get("location", f"site-{idx+1}") - site_entry["site-network-accesses"]["site-network-access"][0]["site-network-access-id"] = f"access-{site['uuid']}" - site_entry["site-network-accesses"]["site-network-access"][0]["device-reference"] = site["ip_address"] - site_entry["site-network-accesses"]["site-network-access"][0]["ip-connection"]["ipv4"]["addresses"]["provider-address"] = site["ip_address"] - site_entry["site-network-accesses"]["site-network-access"][0]["ip-connection"]["ipv4"]["addresses"]["customer-address"] = site["ip_address"] - site_entry["site-network-accesses"]["site-network-access"][0]["ip-connection"]["ipv4"]["addresses"]["prefix-length"] = site["ip_mask"] - sites.append(site_entry) - - service = { +def generate_l3vpn_template_pair(src, dst, vpn_id): + + return { "ietf-l3vpn-svc:l3vpn-svc": { - "sites": { - "site": sites - }, "vpn-services": { - "vpn-service": [ + "vpn-service": [{"vpn-id": vpn_id}] + }, + "sites": { + "site": [ + { + "site-id": src["uuid"], + "management": {"type": "ietf-l3vpn-svc:provider-managed"}, + "locations": {"location": [{"location-id": f"location-{src['uuid']}"}]}, + "devices": {"device": [{ + "device-id": "10.0.30.1", + "location": f"location-{src['uuid']}" + }]}, + "routing-protocols": {"routing-protocol": [{ + "type": "ietf-l3vpn-svc:static", + "static": { + "cascaded-lan-prefixes": { + "ipv4-lan-prefixes": [ + { + "lan": "128.32.10.1/24", + "lan-tag": f"vlan{src['vlan_id']}", + "next-hop": "10.0.30.10" + } + ] + } + } + }]}, + "site-network-accesses": { + "site-network-access": [{ + "site-network-access-id": f"{src['vlan_id']}", + "site-network-access-type": "ietf-l3vpn-svc:multipoint", + "device-reference": "10.0.30.1", + "vpn-attachment": { + "vpn-id": vpn_id, "site-role": "ietf-l3vpn-svc:spoke-role" + }, + "ip-connection": { + "ipv4": { + "address-allocation-type": "ietf-l3vpn-svc:static-address", + "addresses": { + "provider-address": "10.0.30.254", + "customer-address": "10.0.30.10", + "prefix-length": 24 + } + } + }, + "routing-protocols": {"routing-protocol": [{ + "type": "ietf-l3vpn-svc:static", + "static": { + "cascaded-lan-prefixes": { + "ipv4-lan-prefixes": [ + { + "lan": "172.1.101.1/24", + "lan-tag": "vlan100", + "next-hop": "10.0.30.254" + } + ] + } + } + }]}, + "service": { + "svc-mtu": 1500, + "svc-input-bandwidth": 1000000000, + "svc-output-bandwidth": 1000000000, + "qos": { + "qos-profile": { + "classes": { + "class": [ + { + "class-id": "qos-realtime", + "direction": "ietf-l3vpn-svc:both", + "latency": { + "latency-boundary": 10 + }, + "bandwidth": { + "guaranteed-bw-percent": 100 + } + } + ] + } + } + } + } + }] + } + }, { - "vpn-id": "vpn-p2mp", - "vpn-service-topology": "ietf-l3vpn-svc:multipoint" + "site-id": dst["uuid"], + "management": {"type": "ietf-l3vpn-svc:provider-managed"}, + "locations": {"location": [{"location-id": f"location-{dst['uuid']}"}]}, + "devices": {"device": [{ + "device-id": "10.0.20.1", + "location": f"location-{dst['uuid']}" + }]}, + "routing-protocols": {"routing-protocol": [{ + "type": "ietf-l3vpn-svc:static", + "static": { + "cascaded-lan-prefixes": { + "ipv4-lan-prefixes": [ + { + "lan": "172.1.101.1/24", + "lan-tag": "vlan200", + "next-hop": "172.10.33.2" + } + ] + } + } + }]}, + "site-network-accesses": { + "site-network-access": [{ + "site-network-access-id": f"{dst['vlan_id']}", + "site-network-access-type": "ietf-l3vpn-svc:multipoint", + "device-reference": "10.0.20.1", + "vpn-attachment": { + "vpn-id": vpn_id, "site-role": "ietf-l3vpn-svc:hub-role" + }, + "ip-connection": { + "ipv4": { + "address-allocation-type": "ietf-l3vpn-svc:static-address", + "addresses": { + "provider-address": "172.10.33.254", + "customer-address": "172.10.33.2", + "prefix-length": 24 + } + } + }, + "routing-protocols": {"routing-protocol": [{ + "type": "ietf-l3vpn-svc:static", + "static": { + "cascaded-lan-prefixes": { + "ipv4-lan-prefixes": [ + { + "lan": "128.32.10.1/24", + "lan-tag": "vlan200", + "next-hop": "172.10.33.254" + } + ] + } + } + }]}, + "service": { + "svc-mtu": 1500, + "svc-input-bandwidth": 1000000000, + "svc-output-bandwidth": 1000000000, + "qos": { + "qos-profile": { + "classes": { + "class": [ + { + "class-id": "qos-realtime", + "direction": "ietf-l3vpn-svc:both", + "latency": { + "latency-boundary": 10 + }, + "bandwidth": { + "guaranteed-bw-percent": 100 + } + } + ] + } + } + } + } + }] + } } ] } } } - return json.dumps(service, indent=2) def create_request(resource_value): """ Create and send HTTP request based on a JSON template and provided resource value. @@ -116,16 +259,16 @@ def create_request(resource_value): 'vlan_id': node_src["vlan_id"] }] dst_list = resource_value[1]['rule_set']['dst'] - dst = [] + dsts = [] for node in dst_list: - dst.append({ + dsts.append({ 'uuid': node["uuid"], 'ip_address': node["ip_address"], 'ip_mask': node["ip_mask"], 'vlan_id': node["vlan_id"] }) - sites_input = src + dst + sites_input = src + dsts components = resource_value[1]['rule_set']['transceiver']['components'] for i, device in enumerate(components): @@ -136,13 +279,26 @@ def create_request(resource_value): if name == "T1.2":device["frequency"]= 195018750 if name == "T1.3":device["frequency"]= 195031250 - LOGGER.debug(f"NODE DATA: \n{name}: {json.dumps(device, indent=2)}") + LOGGER.debug(f"NODE TO CONFIGURE: \n{name}: {json.dumps(device, indent=2)}") response = patch_optical_channel_frequency(device, name) LOGGER.debug(f"RESPONSE :\n {response}") + templates = [] + for dst in dsts: + vpn = "L3VPN_"+src[0]['uuid']+"_"+dst['uuid'] + templates.append(generate_l3vpn_template_pair(src[0], dst,vpn)) - p2mp_json = generate_p2mp_l3vpn_service(sites_input) - LOGGER.debug(f"Generated L3VPN P2MP service JSON:\n{p2mp_json}") - return response + url = "http://192.168.202.254:80/restconf/data/ietf-l3vpn-svc:l3vpn-svc/vpn-services" + headers = { + 'accept': 'application/json', + 'Content-Type': 'application/json' + } + + for template in templates: + LOGGER.info("Generated L3VPN P2MP service JSON:\n%s", json.dumps(template, indent=2)) + + response = requests.post(url = url, headers= headers, json=template) + LOGGER.debug(response) + return None def patch_optical_channel_frequency(data, DEVICE_ID): encoded_path = f"http://192.168.202.254:80/restconf/data/device={DEVICE_ID}/openconfig-platform:components/component=channel-1/optical-channel/config" diff --git a/src/nbi/service/e2e_services/Resources.py b/src/nbi/service/e2e_services/Resources.py index 6dff5243c..ad6eac8ed 100644 --- a/src/nbi/service/e2e_services/Resources.py +++ b/src/nbi/service/e2e_services/Resources.py @@ -45,6 +45,14 @@ class E2EInfoDelete(Resource): data = json.loads(data_str) components = data.get("components", []) + src = nodes[0] + dst_list = nodes[1:] + services = [f"L3VPN_{src}_{dst}" for dst in dst_list] + for service in services: + url = f"http://192.168.202.254:80/restconf/data/ietf-l3vpn-svc:l3vpn-svc/vpn-services/vpn-service={service}" + response = requests.delete(url=url) + LOGGER.debug(f"RESPONSE :\n {response}") + for i, device in enumerate(components): if i >= len(nodes): LOGGER.warning(f"Index {i} exceeds nodes list length {len(nodes)}") @@ -55,7 +63,7 @@ class E2EInfoDelete(Resource): if name == "T1.2":device["frequency"]= 195018750 if name == "T1.3":device["frequency"]= 195031250 - LOGGER.debug(f"NODE DATA: \n{name}:{device}") + LOGGER.debug(f"NODE TO DELETE: \n{name}:{device}") response = test_patch_optical_channel_frequency(device, name) LOGGER.debug(f"RESPONSE :\n {response}") -- GitLab From 422a27ca2d99435206ba8ce29f5722cd29559682 Mon Sep 17 00:00:00 2001 From: mansoca Date: Tue, 21 Oct 2025 11:11:45 +0000 Subject: [PATCH 003/111] Add DSCM NBI plugin along with RESTful API for DSCM pluggables configuration - Implemented a file-backed JSON datastore for managing device configurations. (to be replaced with DSCM component) - Created a DSCM plugin to handle device-specific configurations using NetConf. - Added RESTful routes for CRUD operations on device configurations. - Introduced header enforcement for content negotiation in API requests. - Developed error handling responses for YANG data formats. - Implemented path resolution for RESTCONF data paths. - Added unit tests for the DSCM REST API, including GET, POST, PATCH, and DELETE operations. - Included requirements for Flask and testing libraries in the requirements.txt. --- .dockerignore | 1 + .gitignore | 1 + deploy/all.sh | 2 +- manifests/contextservice.yaml | 2 +- proto/context.proto | 1 + scripts/run_tests_locally-nbi-dscm.sh | 12 + src/common/DeviceTypes.py | 1 + src/nbi/Dockerfile | 2 + src/nbi/requirements.in | 18 +- src/nbi/service/ietf_l3vpn/Handlers.py | 11 +- .../nbi_plugins/dscm_oc/__init__.py | 9 + .../dscm_oc/datamodels/__init__.py | 0 .../dscm_oc/datamodels/device_dscm-1.json | 710 ++++++++++++++++++ .../dscm_oc/datamodels/device_dscm-2.json | 668 ++++++++++++++++ .../dscm_oc/datamodels/device_hub.json | 1 + .../dscm_oc/datamodels/dscm_store.json | 668 ++++++++++++++++ .../nbi_plugins/dscm_oc/datastore.py | 251 +++++++ .../rest_server/nbi_plugins/dscm_oc/dscm.py | 45 ++ .../nbi_plugins/dscm_oc/enforce_header.py | 26 + .../rest_server/nbi_plugins/dscm_oc/error.py | 17 + .../nbi_plugins/dscm_oc/path_resolver.py | 128 ++++ .../nbi_plugins/dscm_oc/requirements.txt | 5 + .../rest_server/nbi_plugins/dscm_oc/routes.py | 133 ++++ src/nbi/tests/DSCM_MockWebServer.py | 61 ++ src/nbi/tests/test_dscm_restconf.py | 289 +++++++ src/nbi/tests/test_l3vpn_ecoc25.py | 48 ++ 26 files changed, 3097 insertions(+), 13 deletions(-) create mode 100755 scripts/run_tests_locally-nbi-dscm.sh create mode 100644 src/nbi/service/rest_server/nbi_plugins/dscm_oc/__init__.py create mode 100644 src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/__init__.py create mode 100644 src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/device_dscm-1.json create mode 100644 src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/device_dscm-2.json create mode 100644 src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/device_hub.json create mode 100644 src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/dscm_store.json create mode 100644 src/nbi/service/rest_server/nbi_plugins/dscm_oc/datastore.py create mode 100644 src/nbi/service/rest_server/nbi_plugins/dscm_oc/dscm.py create mode 100644 src/nbi/service/rest_server/nbi_plugins/dscm_oc/enforce_header.py create mode 100644 src/nbi/service/rest_server/nbi_plugins/dscm_oc/error.py create mode 100644 src/nbi/service/rest_server/nbi_plugins/dscm_oc/path_resolver.py create mode 100644 src/nbi/service/rest_server/nbi_plugins/dscm_oc/requirements.txt create mode 100644 src/nbi/service/rest_server/nbi_plugins/dscm_oc/routes.py create mode 100644 src/nbi/tests/DSCM_MockWebServer.py create mode 100644 src/nbi/tests/test_dscm_restconf.py create mode 100644 src/nbi/tests/test_l3vpn_ecoc25.py diff --git a/.dockerignore b/.dockerignore index d10e3e7b8..8785e66f3 100644 --- a/.dockerignore +++ b/.dockerignore @@ -15,6 +15,7 @@ # Avoid including these folders when building the components .git/ .gitlab/ +.github/ .vscode/ coverage/ data/ diff --git a/.gitignore b/.gitignore index 7635bb0d2..c5eb3ab2b 100644 --- a/.gitignore +++ b/.gitignore @@ -172,6 +172,7 @@ cython_debug/ # Other /tmp +.github # Sqlite *.db diff --git a/deploy/all.sh b/deploy/all.sh index 93018d3ce..43a8a9be1 100755 --- a/deploy/all.sh +++ b/deploy/all.sh @@ -216,7 +216,7 @@ export GRAF_EXT_PORT_HTTP=${GRAF_EXT_PORT_HTTP:-"3000"} ./deploy/kafka.sh #Deploy Monitoring (Prometheus, Mimir, Grafana) -./deploy/monitoring.sh +# ./deploy/monitoring.sh # Expose Dashboard ./deploy/expose_dashboard.sh diff --git a/manifests/contextservice.yaml b/manifests/contextservice.yaml index 5592864d6..33b5f89b2 100644 --- a/manifests/contextservice.yaml +++ b/manifests/contextservice.yaml @@ -46,7 +46,7 @@ spec: - name: ALLOW_EXPLICIT_ADD_LINK_TO_TOPOLOGY value: "FALSE" - name: CRDB_DATABASE - value: "tfs_context" + value: "tfs_ip_context" envFrom: - secretRef: name: crdb-data diff --git a/proto/context.proto b/proto/context.proto index b33750e80..52e20021e 100644 --- a/proto/context.proto +++ b/proto/context.proto @@ -232,6 +232,7 @@ enum DeviceDriverEnum { DEVICEDRIVER_SMARTNIC = 16; DEVICEDRIVER_MORPHEUS = 17; DEVICEDRIVER_RYU = 18; + DRVICEDRIVER_NETCONF_DSCM = 19; } enum DeviceOperationalStatusEnum { diff --git a/scripts/run_tests_locally-nbi-dscm.sh b/scripts/run_tests_locally-nbi-dscm.sh new file mode 100755 index 000000000..baa6d51bb --- /dev/null +++ b/scripts/run_tests_locally-nbi-dscm.sh @@ -0,0 +1,12 @@ + + +PROJECTDIR=`pwd` + +cd $PROJECTDIR/src +# RCFILE=$PROJECTDIR/coverage/.coveragerc + +# export KFK_SERVER_ADDRESS='127.0.0.1:9092' + +python3 -m pytest --log-level=INFO --log-cli-level=INFO --verbose \ + nbi/tests/test_dscm_restconf.py::test_patch_optical_channel_frequency + \ No newline at end of file diff --git a/src/common/DeviceTypes.py b/src/common/DeviceTypes.py index 7698097f8..d357337c6 100644 --- a/src/common/DeviceTypes.py +++ b/src/common/DeviceTypes.py @@ -53,6 +53,7 @@ class DeviceTypeEnum(Enum): OPEN_ROADM = 'openroadm' MORPHEUS = 'morpheus' OPENFLOW_RYU_CONTROLLER = 'openflow-ryu-controller' + DSCM_NODE = 'dscm' # ETSI TeraFlowSDN controller TERAFLOWSDN_CONTROLLER = 'teraflowsdn' diff --git a/src/nbi/Dockerfile b/src/nbi/Dockerfile index 63556432b..af390adc1 100644 --- a/src/nbi/Dockerfile +++ b/src/nbi/Dockerfile @@ -77,6 +77,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/device/service/drivers/netconf_dscm/. device/service/drivers/netconf_dscm/ +COPY src/device/service/driver_api/_Driver.py device/service/driver_api/_Driver.py COPY src/service/__init__.py service/__init__.py COPY src/service/client/. service/client/ COPY src/slice/__init__.py slice/__init__.py diff --git a/src/nbi/requirements.in b/src/nbi/requirements.in index 6c176e3f0..1f1b7a9f4 100644 --- a/src/nbi/requirements.in +++ b/src/nbi/requirements.in @@ -12,26 +12,28 @@ # See the License for the specific language governing permissions and # limitations under the License. +#gevent-websocket==0.10.1 +#gevent==24.11.1 +#greenlet==3.1.1 +#websockets==12.0 deepdiff==6.7.* deepmerge==1.1.* eventlet==0.39.0 -Flask==2.1.3 Flask-HTTPAuth==4.5.0 Flask-RESTful==0.3.9 flask-socketio==5.5.1 -#gevent==24.11.1 -#gevent-websocket==0.10.1 -#greenlet==3.1.1 +Flask==2.1.3 +git+https://github.com/robshakir/pyangbind.git gunicorn==23.0.0 -jsonschema==4.4.0 +Jinja2==3.0.3 +jsonschema==4.4.0 # 3.2.0 is incompatible kafka-python==2.0.6 libyang==2.8.4 netaddr==0.9.0 +netconf-console2==3.0.1 pyang==2.6.0 -git+https://github.com/robshakir/pyangbind.git pydantic==2.6.3 python-socketio==5.12.1 requests==2.27.* -werkzeug==2.3.7 -#websockets==12.0 websocket-client==1.8.0 # used by socketio to upgrate to websocket +werkzeug==2.3.7 diff --git a/src/nbi/service/ietf_l3vpn/Handlers.py b/src/nbi/service/ietf_l3vpn/Handlers.py index 61736db53..d4704a02d 100644 --- a/src/nbi/service/ietf_l3vpn/Handlers.py +++ b/src/nbi/service/ietf_l3vpn/Handlers.py @@ -58,7 +58,7 @@ def update_service_endpoint( vlan_tag : int, ipv4_address : str, neighbor_ipv4_address : str, ipv4_prefix_length : int, capacity_gbps : Optional[float] = None, e2e_latency_ms : Optional[float] = None, availability : Optional[float] = None, mtu : Optional[int] = None, - static_routing : Optional[Dict[Tuple[str, str], str]] = None, + static_routing : Optional[Dict[Tuple[str, int, int], str]] = None, context_uuid : Optional[str] = DEFAULT_CONTEXT_NAME, ) -> Optional[Exception]: context_client = ContextClient() @@ -111,11 +111,12 @@ def update_service_endpoint( return e def process_site_network_access( - site_id : str, network_access : Dict, site_static_routing : Dict[Tuple[str, str], str], errors : List[Dict] + site_id : str, network_access : Dict, site_static_routing : Dict[Tuple[str, int, int], str], errors : List[Dict] ) -> None: endpoint_uuid = network_access['site-network-access-id'] if network_access['site-network-access-type'] != 'ietf-l3vpn-svc:multipoint': + # if network_access['site-network-access-type'] != 'multipoint': MSG = 'Site Network Access Type: {:s}' raise NotImplementedError(MSG.format(str(network_access['site-network-access-type']))) @@ -130,6 +131,7 @@ def process_site_network_access( ipv4_allocation = network_access['ip-connection']['ipv4'] if ipv4_allocation['address-allocation-type'] != 'ietf-l3vpn-svc:static-address': + # if ipv4_allocation['address-allocation-type'] != 'static-address': MSG = 'Site Network Access IPv4 Allocation Type: {:s}' raise NotImplementedError(MSG.format(str(ipv4_allocation['address-allocation-type']))) ipv4_allocation_addresses = ipv4_allocation['addresses'] @@ -172,6 +174,7 @@ def process_site_network_access( raise NotImplementedError(MSG.format(str(qos_profile_class['class-id']))) if qos_profile_class['direction'] != 'ietf-l3vpn-svc:both': + # if qos_profile_class['direction'] != 'both': MSG = 'Site Network Access QoS Class Direction: {:s}' raise NotImplementedError(MSG.format(str(qos_profile_class['direction']))) @@ -190,15 +193,17 @@ def process_site(site : Dict, errors : List[Dict]) -> None: site_id = site['site-id'] if site['management']['type'] != 'ietf-l3vpn-svc:provider-managed': + # if site['management']['type'] == 'customer-managed': MSG = 'Site Management Type: {:s}' raise NotImplementedError(MSG.format(str(site['management']['type']))) # site_static_routing: (lan-range, lan-prefix-len, lan-tag) => next-hop - site_static_routing : Dict[Tuple[str, str], str] = {} + site_static_routing : Dict[Tuple[str, int, int], str] = {} site_routing_protocols : Dict = site.get('routing-protocols', dict()) site_routing_protocol : List = site_routing_protocols.get('routing-protocol', list()) for rt_proto in site_routing_protocol: if rt_proto['type'] != 'ietf-l3vpn-svc:static': + # if rt_proto['type'] != 'static': MSG = 'Site Routing Protocol Type: {:s}' raise NotImplementedError(MSG.format(str(rt_proto['type']))) diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/__init__.py b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/__init__.py new file mode 100644 index 000000000..8285a6342 --- /dev/null +++ b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/__init__.py @@ -0,0 +1,9 @@ + + +from .routes import blueprint +from nbi.service.rest_server.RestServer import RestServer + +# NBI service calls this in main.py file to register blueprints. +def register_dscm_oc(rest_server : RestServer): + nbi_flask_app = rest_server.app + nbi_flask_app.register_blueprint(blueprint, url_prefix='/restconf/data') diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/__init__.py b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/device_dscm-1.json b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/device_dscm-1.json new file mode 100644 index 000000000..e3661ccbe --- /dev/null +++ b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/device_dscm-1.json @@ -0,0 +1,710 @@ +{ + "openconfig-terminal-device:terminal-device": { + "config": {}, + "state": {}, + "logical-channels": { + "channel": [ + { + "index": 1, + "config": { + "index": 1, + "description": "Updated 100G client channel", + "admin-state": "DISABLED", + "rate-class": "openconfig-transport-types:TRIB_RATE_100G", + "trib-protocol": "openconfig-transport-types:PROT_100GE", + "logical-channel-type": "openconfig-transport-types:PROT_ETHERNET", + "loopback-mode": "NONE", + "test-signal": false + }, + "state": { + "index": 1, + "description": "100G client channel", + "admin-state": "ENABLED", + "rate-class": "openconfig-transport-types:TRIB_RATE_100G", + "trib-protocol": "openconfig-transport-types:PROT_100GE", + "logical-channel-type": "openconfig-transport-types:PROT_ETHERNET", + "loopback-mode": "NONE", + "test-signal": false, + "link-state": "UP" + }, + "ethernet": { + "config": { + "client-als": "ETHERNET", + "als-delay": 0 + }, + "state": { + "client-als": "ETHERNET", + "als-delay": 0, + "in-frames": 50000, + "out-frames": 48000, + "in-pcs-bip-errors": 0, + "out-pcs-bip-errors": 0, + "in-pcs-errored-seconds": 0, + "in-pcs-severely-errored-seconds": 0, + "in-pcs-unavailable-seconds": 0, + "out-crc-errors": 0, + "out-block-errors": 0, + "fec-uncorrectable-blocks": 0, + "pre-fec-ber": { + "instant": 1e-16, + "avg": 2e-16, + "min": 1e-16, + "max": 5e-16 + }, + "post-fec-ber": { + "instant": 0.0, + "avg": 0.0, + "min": 0.0, + "max": 0.0 + }, + "q-value": { + "instant": 12.5, + "avg": 12.3, + "min": 12.0, + "max": 12.8 + }, + "esnr": { + "instant": 15.2, + "avg": 15.0, + "min": 14.8, + "max": 15.5 + } + }, + "lldp": { + "config": { + "enabled": false, + "snooping": false + }, + "state": { + "enabled": false, + "snooping": false, + "frame-in": 0, + "frame-out": 0, + "frame-error-in": 0, + "frame-discard": 0, + "tlv-discard": 0, + "tlv-unknown": 0, + "entries-aged-out": 0 + }, + "neighbors": {} + } + }, + "ingress": { + "config": { + "transceiver": "transceiver-1/1" + }, + "state": { + "transceiver": "transceiver-1/1" + } + }, + "logical-channel-assignments": { + "assignment": [ + null, + { + "index": 1, + "config": { + "index": 1, + "description": "Assignment to optical channel", + "assignment-type": "OPTICAL_CHANNEL", + "optical-channel": "optical-channel-1/1/1", + "allocation": 100.0 + }, + "state": { + "index": 1, + "description": "Assignment to optical channel", + "assignment-type": "OPTICAL_CHANNEL", + "optical-channel": "optical-channel-1/1/1", + "allocation": 100.0 + } + } + ] + } + }, + { + "index": 2, + "config": { + "index": 2, + "description": "400G optical channel", + "admin-state": "ENABLED", + "rate-class": "openconfig-transport-types:TRIB_RATE_400G", + "trib-protocol": "openconfig-transport-types:PROT_400GE", + "logical-channel-type": "openconfig-transport-types:PROT_OTN", + "loopback-mode": "NONE", + "test-signal": false + }, + "state": { + "index": 2, + "description": "400G optical channel", + "admin-state": "ENABLED", + "rate-class": "openconfig-transport-types:TRIB_RATE_400G", + "trib-protocol": "openconfig-transport-types:PROT_400GE", + "logical-channel-type": "openconfig-transport-types:PROT_OTN", + "loopback-mode": "NONE", + "test-signal": false, + "link-state": "UP" + }, + "otn": { + "config": { + "tti-msg-transmit": "TERM-DEV-1", + "tti-msg-expected": "TERM-DEV-2", + "tti-msg-auto": false, + "tributary-slot-granularity": "openconfig-transport-types:TRIB_SLOT_5G" + }, + "state": { + "tti-msg-transmit": "TERM-DEV-1", + "tti-msg-expected": "TERM-DEV-2", + "tti-msg-auto": false, + "tributary-slot-granularity": "openconfig-transport-types:TRIB_SLOT_5G", + "tti-msg-recv": "TERM-DEV-2", + "rdi-msg": "", + "errored-seconds": 0, + "severely-errored-seconds": 0, + "unavailable-seconds": 0, + "code-violations": 0, + "errored-blocks": 0, + "fec-uncorrectable-words": 0, + "fec-corrected-bytes": 1000, + "fec-corrected-bits": 8000, + "background-block-errors": 0, + "fec-uncorrectable-blocks": 0, + "pre-fec-ber": { + "instant": 1e-16, + "avg": 2e-16, + "min": 1e-16, + "max": 5e-16 + }, + "post-fec-ber": { + "instant": 0.0, + "avg": 0.0, + "min": 0.0, + "max": 0.0 + }, + "q-value": { + "instant": 12.5, + "avg": 12.3, + "min": 12.0, + "max": 12.8 + }, + "esnr": { + "instant": 15.2, + "avg": 15.0, + "min": 14.8, + "max": 15.5 + } + } + }, + "logical-channel-assignments": { + "assignment": [] + } + } + ] + }, + "operational-modes": { + "mode": [ + { + "mode-id": 1, + "state": { + "mode-id": 1, + "description": "100G DP-QPSK", + "vendor-id": "ACME-OPTICAL" + } + }, + { + "mode-id": 2, + "state": { + "mode-id": 2, + "description": "400G DP-16QAM", + "vendor-id": "ACME-OPTICAL" + } + }, + { + "mode-id": 3, + "state": { + "mode-id": 3, + "description": "400G DP-8QAM with digital subcarriers", + "vendor-id": "ACME-OPTICAL" + } + } + ] + } + }, + "openconfig-platform:components": { + "component": [ + { + "name": "optical-channel-1/1/1", + "config": { + "name": "optical-channel-1/1/1", + "type": "openconfig-platform-types:OPTICAL_CHANNEL" + }, + "state": { + "name": "optical-channel-1/1/1", + "type": "openconfig-platform-types:OPTICAL_CHANNEL", + "oper-status": "ACTIVE" + }, + "optical-channel": { + "config": { + "frequency": "195000000", + "target-output-power": 1.5, + "operational-mode": 1, + "line-port": "port-1/1/1", + "digital-subcarrier-spacing": 75.0, + "digital-subcarriers-group": [ + { + "digital-subcarriers-group-id": 1, + "number-of-digital-subcarriers": 4, + "digital-subcarrier-group-size": 100, + "digital-subcarrier-id": [ + { + "digital-subcarrier-id": 1, + "active": true, + "digital-subcarrier-output-power": -2.5 + }, + { + "digital-subcarrier-id": 2, + "active": true, + "digital-subcarrier-output-power": -2.3 + }, + { + "digital-subcarrier-id": 3, + "active": true, + "digital-subcarrier-output-power": -2.4 + }, + { + "digital-subcarrier-id": 4, + "active": true, + "digital-subcarrier-output-power": -2.6 + } + ] + } + ], + "name": "channel-1", + "target_output_power": "-3.0", + "operational_mode": "1", + "operation": "merge", + "digital_subcarriers_groups": [ + { + "group_id": 1, + "digital-subcarrier-id": [ + { + "subcarrier-id": 1, + "active": true + } + ] + }, + { + "group_id": 2, + "digital-subcarrier-id": [ + { + "subcarrier-id": 2, + "active": true + } + ] + }, + { + "group_id": 3, + "digital-subcarrier-id": [ + { + "subcarrier-id": 3, + "active": true + } + ] + }, + { + "group_id": 4, + "digital-subcarrier-id": [ + { + "subcarrier-id": 4, + "active": true + } + ] + } + ] + }, + "state": { + "frequency": 196100000, + "target-output-power": 0.0, + "operational-mode": 1, + "line-port": "port-1/1/1", + "input-power": { + "instant": -5.2, + "avg": -5.1, + "min": -5.5, + "max": -4.8 + }, + "output-power": { + "instant": 0.1, + "avg": 0.0, + "min": -0.2, + "max": 0.3 + }, + "total-number-of-digital-subcarriers": 4, + "digital-subcarrier-spacing": 75.0, + "digital-subcarriers-group": [ + { + "digital-subcarriers-group-id": 1, + "number-of-digital-subcarriers": 4, + "digital-subcarrier-group-size": 100, + "digital-subcarrier-id": [ + { + "digital-subcarrier-id": 1, + "active": true, + "digital-subcarrier-output-power": -2.5 + }, + { + "digital-subcarrier-id": 2, + "active": true, + "digital-subcarrier-output-power": -2.3 + }, + { + "digital-subcarrier-id": 3, + "active": true, + "digital-subcarrier-output-power": -2.4 + }, + { + "digital-subcarrier-id": 4, + "active": true, + "digital-subcarrier-output-power": -2.6 + } + ], + "chromatic-dispersion": { + "instant": 150.25, + "avg": 149.8, + "min": 148.5, + "max": 151.0 + }, + "polarization-mode-dispersion": { + "instant": 0.15, + "avg": 0.14, + "min": 0.12, + "max": 0.17 + }, + "second-order-polarization-mode-dispersion": { + "instant": 0.025, + "avg": 0.023, + "min": 0.02, + "max": 0.028 + }, + "polarization-dependent-loss": { + "instant": 0.8, + "avg": 0.75, + "min": 0.7, + "max": 0.9 + }, + "modulator-bias-xi": { + "instant": 50.25, + "avg": 50.0, + "min": 49.5, + "max": 50.8 + }, + "modulator-bias-xq": { + "instant": 49.75, + "avg": 50.0, + "min": 49.2, + "max": 50.5 + }, + "modulator-bias-yi": { + "instant": 50.1, + "avg": 50.0, + "min": 49.8, + "max": 50.3 + }, + "modulator-bias-yq": { + "instant": 49.9, + "avg": 50.0, + "min": 49.7, + "max": 50.2 + }, + "modulator-bias-x-phase": { + "instant": 0.5, + "avg": 0.4, + "min": 0.2, + "max": 0.7 + }, + "modulator-bias-y-phase": { + "instant": 0.3, + "avg": 0.4, + "min": 0.1, + "max": 0.6 + }, + "osnr": { + "instant": 25.5, + "avg": 25.2, + "min": 24.8, + "max": 25.8 + }, + "carrier-frequency-offset": { + "instant": 1.2, + "avg": 1.1, + "min": 0.8, + "max": 1.5 + }, + "sop-roc": { + "instant": 12.5, + "avg": 12.0, + "min": 11.5, + "max": 13.0 + }, + "modulation-error-ratio": { + "instant": -25.3, + "avg": -25.5, + "min": -26.0, + "max": -25.0 + }, + "fec-uncorrectable-blocks": 0, + "pre-fec-ber": { + "instant": 1e-15, + "avg": 2e-15, + "min": 1e-15, + "max": 5e-15 + }, + "post-fec-ber": { + "instant": 0.0, + "avg": 0.0, + "min": 0.0, + "max": 0.0 + }, + "q-value": { + "instant": 12.5, + "avg": 12.3, + "min": 12.0, + "max": 12.8 + }, + "esnr": { + "instant": 15.2, + "avg": 15.0, + "min": 14.8, + "max": 15.5 + } + } + ] + } + } + }, + { + "name": "optical-channel-1/1/2", + "config": { + "name": "optical-channel-1/1/2", + "type": "openconfig-platform-types:OPTICAL_CHANNEL" + }, + "state": { + "name": "optical-channel-1/1/2", + "type": "openconfig-platform-types:OPTICAL_CHANNEL", + "oper-status": "ACTIVE" + }, + "optical-channel": { + "config": { + "frequency": 196200000, + "target-output-power": 2.0, + "operational-mode": 3, + "line-port": "port-1/1/2", + "digital-subcarrier-spacing": 50.0, + "digital-subcarriers-group": [ + null, + { + "digital-subcarriers-group-id": 1, + "number-of-digital-subcarriers": 8, + "digital-subcarrier-group-size": 200, + "digital-subcarrier-id": [ + { + "digital-subcarrier-id": 1, + "active": true, + "digital-subcarrier-output-power": 1.8 + }, + { + "digital-subcarrier-id": 2, + "active": true, + "digital-subcarrier-output-power": 1.9 + }, + { + "digital-subcarrier-id": 3, + "active": true, + "digital-subcarrier-output-power": 1.7 + }, + { + "digital-subcarrier-id": 4, + "active": true, + "digital-subcarrier-output-power": 2.0 + }, + { + "digital-subcarrier-id": 5, + "active": true, + "digital-subcarrier-output-power": 1.8 + }, + { + "digital-subcarrier-id": 6, + "active": true, + "digital-subcarrier-output-power": 1.9 + }, + { + "digital-subcarrier-id": 7, + "active": false, + "digital-subcarrier-output-power": 0.0 + }, + { + "digital-subcarrier-id": 8, + "active": false, + "digital-subcarrier-output-power": 0.0 + } + ] + } + ] + }, + "state": { + "frequency": 196200000, + "target-output-power": 2.0, + "operational-mode": 3, + "line-port": "port-1/1/2", + "input-power": { + "instant": -3.2, + "avg": -3.1, + "min": -3.5, + "max": -2.8 + }, + "output-power": { + "instant": 2.1, + "avg": 2.0, + "min": 1.8, + "max": 2.3 + }, + "total-number-of-digital-subcarriers": 12, + "digital-subcarrier-spacing": 50.0, + "digital-subcarriers-group": [ + { + "digital-subcarriers-group-id": 1, + "number-of-digital-subcarriers": 8, + "digital-subcarrier-group-size": 200, + "digital-subcarrier-id": [ + { + "digital-subcarrier-id": 1, + "active": true, + "digital-subcarrier-output-power": 1.8 + }, + { + "digital-subcarrier-id": 2, + "active": true, + "digital-subcarrier-output-power": 1.9 + }, + { + "digital-subcarrier-id": 3, + "active": true, + "digital-subcarrier-output-power": 1.7 + }, + { + "digital-subcarrier-id": 4, + "active": true, + "digital-subcarrier-output-power": 2.0 + }, + { + "digital-subcarrier-id": 5, + "active": true, + "digital-subcarrier-output-power": 1.8 + }, + { + "digital-subcarrier-id": 6, + "active": true, + "digital-subcarrier-output-power": 1.9 + }, + { + "digital-subcarrier-id": 7, + "active": false, + "digital-subcarrier-output-power": 0.0 + }, + { + "digital-subcarrier-id": 8, + "active": false, + "digital-subcarrier-output-power": 0.0 + } + ] + }, + { + "digital-subcarriers-group-id": 2, + "number-of-digital-subcarriers": 4, + "digital-subcarrier-group-size": 200, + "digital-subcarrier-id": [ + { + "digital-subcarrier-id": 9, + "active": true, + "digital-subcarrier-output-power": 1.5 + }, + { + "digital-subcarrier-id": 10, + "active": true, + "digital-subcarrier-output-power": 1.6 + }, + { + "digital-subcarrier-id": 11, + "active": true, + "digital-subcarrier-output-power": 1.4 + }, + { + "digital-subcarrier-id": 12, + "active": true, + "digital-subcarrier-output-power": 1.7 + } + ] + } + ] + } + } + }, + { + "name": "transceiver-1/1", + "config": { + "name": "transceiver-1/1", + "type": "openconfig-platform-types:TRANSCEIVER" + }, + "state": { + "name": "transceiver-1/1", + "type": "openconfig-platform-types:TRANSCEIVER", + "oper-status": "ACTIVE", + "description": "100G QSFP28 transceiver", + "mfg-name": "ACME Optics", + "part-no": "QSFP28-100G-LR4", + "serial-no": "AC123456789" + } + }, + { + "name": "transceiver-1/2", + "config": { + "name": "transceiver-1/2", + "type": "openconfig-platform-types:TRANSCEIVER" + }, + "state": { + "name": "transceiver-1/2", + "type": "openconfig-platform-types:TRANSCEIVER", + "oper-status": "ACTIVE", + "description": "400G QSFP-DD coherent transceiver", + "mfg-name": "ACME Optics", + "part-no": "QSFPDD-400G-ZR", + "serial-no": "AC987654321" + } + }, + { + "name": "port-1/1/1", + "config": { + "name": "port-1/1/1", + "type": "openconfig-platform-types:PORT" + }, + "state": { + "name": "port-1/1/1", + "type": "openconfig-platform-types:PORT", + "oper-status": "ACTIVE", + "description": "Line port for 100G channel" + } + }, + { + "name": "port-1/1/2", + "config": { + "name": "port-1/1/2", + "type": "openconfig-platform-types:PORT" + }, + "state": { + "name": "port-1/1/2", + "type": "openconfig-platform-types:PORT", + "oper-status": "ACTIVE", + "description": "Line port for 400G channel with digital subcarriers" + } + } + ] + } +} \ No newline at end of file diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/device_dscm-2.json b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/device_dscm-2.json new file mode 100644 index 000000000..2f268e60f --- /dev/null +++ b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/device_dscm-2.json @@ -0,0 +1,668 @@ +{ + "openconfig-terminal-device:terminal-device": { + "config": {}, + "state": {}, + "logical-channels": { + "channel": [ + { + "index": 1, + "config": { + "index": 1, + "description": "Updated 100G client channel", + "admin-state": "DISABLED", + "rate-class": "openconfig-transport-types:TRIB_RATE_100G", + "trib-protocol": "openconfig-transport-types:PROT_100GE", + "logical-channel-type": "openconfig-transport-types:PROT_ETHERNET", + "loopback-mode": "NONE", + "test-signal": false + }, + "state": { + "index": 1, + "description": "100G client channel", + "admin-state": "ENABLED", + "rate-class": "openconfig-transport-types:TRIB_RATE_100G", + "trib-protocol": "openconfig-transport-types:PROT_100GE", + "logical-channel-type": "openconfig-transport-types:PROT_ETHERNET", + "loopback-mode": "NONE", + "test-signal": false, + "link-state": "UP" + }, + "ethernet": { + "config": { + "client-als": "ETHERNET", + "als-delay": 0 + }, + "state": { + "client-als": "ETHERNET", + "als-delay": 0, + "in-frames": 50000, + "out-frames": 48000, + "in-pcs-bip-errors": 0, + "out-pcs-bip-errors": 0, + "in-pcs-errored-seconds": 0, + "in-pcs-severely-errored-seconds": 0, + "in-pcs-unavailable-seconds": 0, + "out-crc-errors": 0, + "out-block-errors": 0, + "fec-uncorrectable-blocks": 0, + "pre-fec-ber": { + "instant": 1e-16, + "avg": 2e-16, + "min": 1e-16, + "max": 5e-16 + }, + "post-fec-ber": { + "instant": 0.0, + "avg": 0.0, + "min": 0.0, + "max": 0.0 + }, + "q-value": { + "instant": 12.5, + "avg": 12.3, + "min": 12.0, + "max": 12.8 + }, + "esnr": { + "instant": 15.2, + "avg": 15.0, + "min": 14.8, + "max": 15.5 + } + }, + "lldp": { + "config": { + "enabled": false, + "snooping": false + }, + "state": { + "enabled": false, + "snooping": false, + "frame-in": 0, + "frame-out": 0, + "frame-error-in": 0, + "frame-discard": 0, + "tlv-discard": 0, + "tlv-unknown": 0, + "entries-aged-out": 0 + }, + "neighbors": {} + } + }, + "ingress": { + "config": { + "transceiver": "transceiver-1/1" + }, + "state": { + "transceiver": "transceiver-1/1" + } + }, + "logical-channel-assignments": { + "assignment": [ + null, + { + "index": 1, + "config": { + "index": 1, + "description": "Assignment to optical channel", + "assignment-type": "OPTICAL_CHANNEL", + "optical-channel": "optical-channel-1/1/1", + "allocation": 100.0 + }, + "state": { + "index": 1, + "description": "Assignment to optical channel", + "assignment-type": "OPTICAL_CHANNEL", + "optical-channel": "optical-channel-1/1/1", + "allocation": 100.0 + } + } + ] + } + }, + { + "index": 2, + "config": { + "index": 2, + "description": "400G optical channel", + "admin-state": "ENABLED", + "rate-class": "openconfig-transport-types:TRIB_RATE_400G", + "trib-protocol": "openconfig-transport-types:PROT_400GE", + "logical-channel-type": "openconfig-transport-types:PROT_OTN", + "loopback-mode": "NONE", + "test-signal": false + }, + "state": { + "index": 2, + "description": "400G optical channel", + "admin-state": "ENABLED", + "rate-class": "openconfig-transport-types:TRIB_RATE_400G", + "trib-protocol": "openconfig-transport-types:PROT_400GE", + "logical-channel-type": "openconfig-transport-types:PROT_OTN", + "loopback-mode": "NONE", + "test-signal": false, + "link-state": "UP" + }, + "otn": { + "config": { + "tti-msg-transmit": "TERM-DEV-1", + "tti-msg-expected": "TERM-DEV-2", + "tti-msg-auto": false, + "tributary-slot-granularity": "openconfig-transport-types:TRIB_SLOT_5G" + }, + "state": { + "tti-msg-transmit": "TERM-DEV-1", + "tti-msg-expected": "TERM-DEV-2", + "tti-msg-auto": false, + "tributary-slot-granularity": "openconfig-transport-types:TRIB_SLOT_5G", + "tti-msg-recv": "TERM-DEV-2", + "rdi-msg": "", + "errored-seconds": 0, + "severely-errored-seconds": 0, + "unavailable-seconds": 0, + "code-violations": 0, + "errored-blocks": 0, + "fec-uncorrectable-words": 0, + "fec-corrected-bytes": 1000, + "fec-corrected-bits": 8000, + "background-block-errors": 0, + "fec-uncorrectable-blocks": 0, + "pre-fec-ber": { + "instant": 1e-16, + "avg": 2e-16, + "min": 1e-16, + "max": 5e-16 + }, + "post-fec-ber": { + "instant": 0.0, + "avg": 0.0, + "min": 0.0, + "max": 0.0 + }, + "q-value": { + "instant": 12.5, + "avg": 12.3, + "min": 12.0, + "max": 12.8 + }, + "esnr": { + "instant": 15.2, + "avg": 15.0, + "min": 14.8, + "max": 15.5 + } + } + }, + "logical-channel-assignments": { + "assignment": [] + } + } + ] + }, + "operational-modes": { + "mode": [ + { + "mode-id": 1, + "state": { + "mode-id": 1, + "description": "100G DP-QPSK", + "vendor-id": "ACME-OPTICAL" + } + }, + { + "mode-id": 2, + "state": { + "mode-id": 2, + "description": "400G DP-16QAM", + "vendor-id": "ACME-OPTICAL" + } + }, + { + "mode-id": 3, + "state": { + "mode-id": 3, + "description": "400G DP-8QAM with digital subcarriers", + "vendor-id": "ACME-OPTICAL" + } + } + ] + } + }, + "openconfig-platform:components": { + "component": [ + { + "name": "optical-channel-1/1/1", + "config": { + "name": "optical-channel-1/1/1", + "type": "openconfig-platform-types:OPTICAL_CHANNEL" + }, + "state": { + "name": "optical-channel-1/1/1", + "type": "openconfig-platform-types:OPTICAL_CHANNEL", + "oper-status": "ACTIVE" + }, + "optical-channel": { + "config": { + "frequency": 196150000, + "target-output-power": 1.5, + "operational-mode": 1, + "line-port": "port-1/1/1", + "digital-subcarrier-spacing": 75.0, + "digital-subcarriers-group": [ + { + "digital-subcarriers-group-id": 1, + "number-of-digital-subcarriers": 4, + "digital-subcarrier-group-size": 100, + "digital-subcarrier-id": [ + { + "digital-subcarrier-id": 1, + "active": true, + "digital-subcarrier-output-power": -2.5 + }, + { + "digital-subcarrier-id": 2, + "active": true, + "digital-subcarrier-output-power": -2.3 + }, + { + "digital-subcarrier-id": 3, + "active": true, + "digital-subcarrier-output-power": -2.4 + }, + { + "digital-subcarrier-id": 4, + "active": true, + "digital-subcarrier-output-power": -2.6 + } + ] + } + ] + }, + "state": { + "frequency": 196100000, + "target-output-power": 0.0, + "operational-mode": 1, + "line-port": "port-1/1/1", + "input-power": { + "instant": -5.2, + "avg": -5.1, + "min": -5.5, + "max": -4.8 + }, + "output-power": { + "instant": 0.1, + "avg": 0.0, + "min": -0.2, + "max": 0.3 + }, + "total-number-of-digital-subcarriers": 4, + "digital-subcarrier-spacing": 75.0, + "digital-subcarriers-group": [ + { + "digital-subcarriers-group-id": 1, + "number-of-digital-subcarriers": 4, + "digital-subcarrier-group-size": 100, + "digital-subcarrier-id": [ + { + "digital-subcarrier-id": 1, + "active": true, + "digital-subcarrier-output-power": -2.5 + }, + { + "digital-subcarrier-id": 2, + "active": true, + "digital-subcarrier-output-power": -2.3 + }, + { + "digital-subcarrier-id": 3, + "active": true, + "digital-subcarrier-output-power": -2.4 + }, + { + "digital-subcarrier-id": 4, + "active": true, + "digital-subcarrier-output-power": -2.6 + } + ], + "chromatic-dispersion": { + "instant": 150.25, + "avg": 149.8, + "min": 148.5, + "max": 151.0 + }, + "polarization-mode-dispersion": { + "instant": 0.15, + "avg": 0.14, + "min": 0.12, + "max": 0.17 + }, + "second-order-polarization-mode-dispersion": { + "instant": 0.025, + "avg": 0.023, + "min": 0.02, + "max": 0.028 + }, + "polarization-dependent-loss": { + "instant": 0.8, + "avg": 0.75, + "min": 0.7, + "max": 0.9 + }, + "modulator-bias-xi": { + "instant": 50.25, + "avg": 50.0, + "min": 49.5, + "max": 50.8 + }, + "modulator-bias-xq": { + "instant": 49.75, + "avg": 50.0, + "min": 49.2, + "max": 50.5 + }, + "modulator-bias-yi": { + "instant": 50.1, + "avg": 50.0, + "min": 49.8, + "max": 50.3 + }, + "modulator-bias-yq": { + "instant": 49.9, + "avg": 50.0, + "min": 49.7, + "max": 50.2 + }, + "modulator-bias-x-phase": { + "instant": 0.5, + "avg": 0.4, + "min": 0.2, + "max": 0.7 + }, + "modulator-bias-y-phase": { + "instant": 0.3, + "avg": 0.4, + "min": 0.1, + "max": 0.6 + }, + "osnr": { + "instant": 25.5, + "avg": 25.2, + "min": 24.8, + "max": 25.8 + }, + "carrier-frequency-offset": { + "instant": 1.2, + "avg": 1.1, + "min": 0.8, + "max": 1.5 + }, + "sop-roc": { + "instant": 12.5, + "avg": 12.0, + "min": 11.5, + "max": 13.0 + }, + "modulation-error-ratio": { + "instant": -25.3, + "avg": -25.5, + "min": -26.0, + "max": -25.0 + }, + "fec-uncorrectable-blocks": 0, + "pre-fec-ber": { + "instant": 1e-15, + "avg": 2e-15, + "min": 1e-15, + "max": 5e-15 + }, + "post-fec-ber": { + "instant": 0.0, + "avg": 0.0, + "min": 0.0, + "max": 0.0 + }, + "q-value": { + "instant": 12.5, + "avg": 12.3, + "min": 12.0, + "max": 12.8 + }, + "esnr": { + "instant": 15.2, + "avg": 15.0, + "min": 14.8, + "max": 15.5 + } + } + ] + } + } + }, + { + "name": "optical-channel-1/1/2", + "config": { + "name": "optical-channel-1/1/2", + "type": "openconfig-platform-types:OPTICAL_CHANNEL" + }, + "state": { + "name": "optical-channel-1/1/2", + "type": "openconfig-platform-types:OPTICAL_CHANNEL", + "oper-status": "ACTIVE" + }, + "optical-channel": { + "config": { + "frequency": 196200000, + "target-output-power": 2.0, + "operational-mode": 3, + "line-port": "port-1/1/2", + "digital-subcarrier-spacing": 50.0, + "digital-subcarriers-group": [ + null, + { + "digital-subcarriers-group-id": 1, + "number-of-digital-subcarriers": 8, + "digital-subcarrier-group-size": 200, + "digital-subcarrier-id": [ + { + "digital-subcarrier-id": 1, + "active": true, + "digital-subcarrier-output-power": 1.8 + }, + { + "digital-subcarrier-id": 2, + "active": true, + "digital-subcarrier-output-power": 1.9 + }, + { + "digital-subcarrier-id": 3, + "active": true, + "digital-subcarrier-output-power": 1.7 + }, + { + "digital-subcarrier-id": 4, + "active": true, + "digital-subcarrier-output-power": 2.0 + }, + { + "digital-subcarrier-id": 5, + "active": true, + "digital-subcarrier-output-power": 1.8 + }, + { + "digital-subcarrier-id": 6, + "active": true, + "digital-subcarrier-output-power": 1.9 + }, + { + "digital-subcarrier-id": 7, + "active": false, + "digital-subcarrier-output-power": 0.0 + }, + { + "digital-subcarrier-id": 8, + "active": false, + "digital-subcarrier-output-power": 0.0 + } + ] + } + ] + }, + "state": { + "frequency": 196200000, + "target-output-power": 2.0, + "operational-mode": 3, + "line-port": "port-1/1/2", + "input-power": { + "instant": -3.2, + "avg": -3.1, + "min": -3.5, + "max": -2.8 + }, + "output-power": { + "instant": 2.1, + "avg": 2.0, + "min": 1.8, + "max": 2.3 + }, + "total-number-of-digital-subcarriers": 12, + "digital-subcarrier-spacing": 50.0, + "digital-subcarriers-group": [ + { + "digital-subcarriers-group-id": 1, + "number-of-digital-subcarriers": 8, + "digital-subcarrier-group-size": 200, + "digital-subcarrier-id": [ + { + "digital-subcarrier-id": 1, + "active": true, + "digital-subcarrier-output-power": 1.8 + }, + { + "digital-subcarrier-id": 2, + "active": true, + "digital-subcarrier-output-power": 1.9 + }, + { + "digital-subcarrier-id": 3, + "active": true, + "digital-subcarrier-output-power": 1.7 + }, + { + "digital-subcarrier-id": 4, + "active": true, + "digital-subcarrier-output-power": 2.0 + }, + { + "digital-subcarrier-id": 5, + "active": true, + "digital-subcarrier-output-power": 1.8 + }, + { + "digital-subcarrier-id": 6, + "active": true, + "digital-subcarrier-output-power": 1.9 + }, + { + "digital-subcarrier-id": 7, + "active": false, + "digital-subcarrier-output-power": 0.0 + }, + { + "digital-subcarrier-id": 8, + "active": false, + "digital-subcarrier-output-power": 0.0 + } + ] + }, + { + "digital-subcarriers-group-id": 2, + "number-of-digital-subcarriers": 4, + "digital-subcarrier-group-size": 200, + "digital-subcarrier-id": [ + { + "digital-subcarrier-id": 9, + "active": true, + "digital-subcarrier-output-power": 1.5 + }, + { + "digital-subcarrier-id": 10, + "active": true, + "digital-subcarrier-output-power": 1.6 + }, + { + "digital-subcarrier-id": 11, + "active": true, + "digital-subcarrier-output-power": 1.4 + }, + { + "digital-subcarrier-id": 12, + "active": true, + "digital-subcarrier-output-power": 1.7 + } + ] + } + ] + } + } + }, + { + "name": "transceiver-1/1", + "config": { + "name": "transceiver-1/1", + "type": "openconfig-platform-types:TRANSCEIVER" + }, + "state": { + "name": "transceiver-1/1", + "type": "openconfig-platform-types:TRANSCEIVER", + "oper-status": "ACTIVE", + "description": "100G QSFP28 transceiver", + "mfg-name": "ACME Optics", + "part-no": "QSFP28-100G-LR4", + "serial-no": "AC123456789" + } + }, + { + "name": "transceiver-1/2", + "config": { + "name": "transceiver-1/2", + "type": "openconfig-platform-types:TRANSCEIVER" + }, + "state": { + "name": "transceiver-1/2", + "type": "openconfig-platform-types:TRANSCEIVER", + "oper-status": "ACTIVE", + "description": "400G QSFP-DD coherent transceiver", + "mfg-name": "ACME Optics", + "part-no": "QSFPDD-400G-ZR", + "serial-no": "AC987654321" + } + }, + { + "name": "port-1/1/1", + "config": { + "name": "port-1/1/1", + "type": "openconfig-platform-types:PORT" + }, + "state": { + "name": "port-1/1/1", + "type": "openconfig-platform-types:PORT", + "oper-status": "ACTIVE", + "description": "Line port for 100G channel" + } + }, + { + "name": "port-1/1/2", + "config": { + "name": "port-1/1/2", + "type": "openconfig-platform-types:PORT" + }, + "state": { + "name": "port-1/1/2", + "type": "openconfig-platform-types:PORT", + "oper-status": "ACTIVE", + "description": "Line port for 400G channel with digital subcarriers" + } + } + ] + } +} \ No newline at end of file diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/device_hub.json b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/device_hub.json new file mode 100644 index 000000000..9e26dfeeb --- /dev/null +++ b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/device_hub.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/dscm_store.json b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/dscm_store.json new file mode 100644 index 000000000..2f268e60f --- /dev/null +++ b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/dscm_store.json @@ -0,0 +1,668 @@ +{ + "openconfig-terminal-device:terminal-device": { + "config": {}, + "state": {}, + "logical-channels": { + "channel": [ + { + "index": 1, + "config": { + "index": 1, + "description": "Updated 100G client channel", + "admin-state": "DISABLED", + "rate-class": "openconfig-transport-types:TRIB_RATE_100G", + "trib-protocol": "openconfig-transport-types:PROT_100GE", + "logical-channel-type": "openconfig-transport-types:PROT_ETHERNET", + "loopback-mode": "NONE", + "test-signal": false + }, + "state": { + "index": 1, + "description": "100G client channel", + "admin-state": "ENABLED", + "rate-class": "openconfig-transport-types:TRIB_RATE_100G", + "trib-protocol": "openconfig-transport-types:PROT_100GE", + "logical-channel-type": "openconfig-transport-types:PROT_ETHERNET", + "loopback-mode": "NONE", + "test-signal": false, + "link-state": "UP" + }, + "ethernet": { + "config": { + "client-als": "ETHERNET", + "als-delay": 0 + }, + "state": { + "client-als": "ETHERNET", + "als-delay": 0, + "in-frames": 50000, + "out-frames": 48000, + "in-pcs-bip-errors": 0, + "out-pcs-bip-errors": 0, + "in-pcs-errored-seconds": 0, + "in-pcs-severely-errored-seconds": 0, + "in-pcs-unavailable-seconds": 0, + "out-crc-errors": 0, + "out-block-errors": 0, + "fec-uncorrectable-blocks": 0, + "pre-fec-ber": { + "instant": 1e-16, + "avg": 2e-16, + "min": 1e-16, + "max": 5e-16 + }, + "post-fec-ber": { + "instant": 0.0, + "avg": 0.0, + "min": 0.0, + "max": 0.0 + }, + "q-value": { + "instant": 12.5, + "avg": 12.3, + "min": 12.0, + "max": 12.8 + }, + "esnr": { + "instant": 15.2, + "avg": 15.0, + "min": 14.8, + "max": 15.5 + } + }, + "lldp": { + "config": { + "enabled": false, + "snooping": false + }, + "state": { + "enabled": false, + "snooping": false, + "frame-in": 0, + "frame-out": 0, + "frame-error-in": 0, + "frame-discard": 0, + "tlv-discard": 0, + "tlv-unknown": 0, + "entries-aged-out": 0 + }, + "neighbors": {} + } + }, + "ingress": { + "config": { + "transceiver": "transceiver-1/1" + }, + "state": { + "transceiver": "transceiver-1/1" + } + }, + "logical-channel-assignments": { + "assignment": [ + null, + { + "index": 1, + "config": { + "index": 1, + "description": "Assignment to optical channel", + "assignment-type": "OPTICAL_CHANNEL", + "optical-channel": "optical-channel-1/1/1", + "allocation": 100.0 + }, + "state": { + "index": 1, + "description": "Assignment to optical channel", + "assignment-type": "OPTICAL_CHANNEL", + "optical-channel": "optical-channel-1/1/1", + "allocation": 100.0 + } + } + ] + } + }, + { + "index": 2, + "config": { + "index": 2, + "description": "400G optical channel", + "admin-state": "ENABLED", + "rate-class": "openconfig-transport-types:TRIB_RATE_400G", + "trib-protocol": "openconfig-transport-types:PROT_400GE", + "logical-channel-type": "openconfig-transport-types:PROT_OTN", + "loopback-mode": "NONE", + "test-signal": false + }, + "state": { + "index": 2, + "description": "400G optical channel", + "admin-state": "ENABLED", + "rate-class": "openconfig-transport-types:TRIB_RATE_400G", + "trib-protocol": "openconfig-transport-types:PROT_400GE", + "logical-channel-type": "openconfig-transport-types:PROT_OTN", + "loopback-mode": "NONE", + "test-signal": false, + "link-state": "UP" + }, + "otn": { + "config": { + "tti-msg-transmit": "TERM-DEV-1", + "tti-msg-expected": "TERM-DEV-2", + "tti-msg-auto": false, + "tributary-slot-granularity": "openconfig-transport-types:TRIB_SLOT_5G" + }, + "state": { + "tti-msg-transmit": "TERM-DEV-1", + "tti-msg-expected": "TERM-DEV-2", + "tti-msg-auto": false, + "tributary-slot-granularity": "openconfig-transport-types:TRIB_SLOT_5G", + "tti-msg-recv": "TERM-DEV-2", + "rdi-msg": "", + "errored-seconds": 0, + "severely-errored-seconds": 0, + "unavailable-seconds": 0, + "code-violations": 0, + "errored-blocks": 0, + "fec-uncorrectable-words": 0, + "fec-corrected-bytes": 1000, + "fec-corrected-bits": 8000, + "background-block-errors": 0, + "fec-uncorrectable-blocks": 0, + "pre-fec-ber": { + "instant": 1e-16, + "avg": 2e-16, + "min": 1e-16, + "max": 5e-16 + }, + "post-fec-ber": { + "instant": 0.0, + "avg": 0.0, + "min": 0.0, + "max": 0.0 + }, + "q-value": { + "instant": 12.5, + "avg": 12.3, + "min": 12.0, + "max": 12.8 + }, + "esnr": { + "instant": 15.2, + "avg": 15.0, + "min": 14.8, + "max": 15.5 + } + } + }, + "logical-channel-assignments": { + "assignment": [] + } + } + ] + }, + "operational-modes": { + "mode": [ + { + "mode-id": 1, + "state": { + "mode-id": 1, + "description": "100G DP-QPSK", + "vendor-id": "ACME-OPTICAL" + } + }, + { + "mode-id": 2, + "state": { + "mode-id": 2, + "description": "400G DP-16QAM", + "vendor-id": "ACME-OPTICAL" + } + }, + { + "mode-id": 3, + "state": { + "mode-id": 3, + "description": "400G DP-8QAM with digital subcarriers", + "vendor-id": "ACME-OPTICAL" + } + } + ] + } + }, + "openconfig-platform:components": { + "component": [ + { + "name": "optical-channel-1/1/1", + "config": { + "name": "optical-channel-1/1/1", + "type": "openconfig-platform-types:OPTICAL_CHANNEL" + }, + "state": { + "name": "optical-channel-1/1/1", + "type": "openconfig-platform-types:OPTICAL_CHANNEL", + "oper-status": "ACTIVE" + }, + "optical-channel": { + "config": { + "frequency": 196150000, + "target-output-power": 1.5, + "operational-mode": 1, + "line-port": "port-1/1/1", + "digital-subcarrier-spacing": 75.0, + "digital-subcarriers-group": [ + { + "digital-subcarriers-group-id": 1, + "number-of-digital-subcarriers": 4, + "digital-subcarrier-group-size": 100, + "digital-subcarrier-id": [ + { + "digital-subcarrier-id": 1, + "active": true, + "digital-subcarrier-output-power": -2.5 + }, + { + "digital-subcarrier-id": 2, + "active": true, + "digital-subcarrier-output-power": -2.3 + }, + { + "digital-subcarrier-id": 3, + "active": true, + "digital-subcarrier-output-power": -2.4 + }, + { + "digital-subcarrier-id": 4, + "active": true, + "digital-subcarrier-output-power": -2.6 + } + ] + } + ] + }, + "state": { + "frequency": 196100000, + "target-output-power": 0.0, + "operational-mode": 1, + "line-port": "port-1/1/1", + "input-power": { + "instant": -5.2, + "avg": -5.1, + "min": -5.5, + "max": -4.8 + }, + "output-power": { + "instant": 0.1, + "avg": 0.0, + "min": -0.2, + "max": 0.3 + }, + "total-number-of-digital-subcarriers": 4, + "digital-subcarrier-spacing": 75.0, + "digital-subcarriers-group": [ + { + "digital-subcarriers-group-id": 1, + "number-of-digital-subcarriers": 4, + "digital-subcarrier-group-size": 100, + "digital-subcarrier-id": [ + { + "digital-subcarrier-id": 1, + "active": true, + "digital-subcarrier-output-power": -2.5 + }, + { + "digital-subcarrier-id": 2, + "active": true, + "digital-subcarrier-output-power": -2.3 + }, + { + "digital-subcarrier-id": 3, + "active": true, + "digital-subcarrier-output-power": -2.4 + }, + { + "digital-subcarrier-id": 4, + "active": true, + "digital-subcarrier-output-power": -2.6 + } + ], + "chromatic-dispersion": { + "instant": 150.25, + "avg": 149.8, + "min": 148.5, + "max": 151.0 + }, + "polarization-mode-dispersion": { + "instant": 0.15, + "avg": 0.14, + "min": 0.12, + "max": 0.17 + }, + "second-order-polarization-mode-dispersion": { + "instant": 0.025, + "avg": 0.023, + "min": 0.02, + "max": 0.028 + }, + "polarization-dependent-loss": { + "instant": 0.8, + "avg": 0.75, + "min": 0.7, + "max": 0.9 + }, + "modulator-bias-xi": { + "instant": 50.25, + "avg": 50.0, + "min": 49.5, + "max": 50.8 + }, + "modulator-bias-xq": { + "instant": 49.75, + "avg": 50.0, + "min": 49.2, + "max": 50.5 + }, + "modulator-bias-yi": { + "instant": 50.1, + "avg": 50.0, + "min": 49.8, + "max": 50.3 + }, + "modulator-bias-yq": { + "instant": 49.9, + "avg": 50.0, + "min": 49.7, + "max": 50.2 + }, + "modulator-bias-x-phase": { + "instant": 0.5, + "avg": 0.4, + "min": 0.2, + "max": 0.7 + }, + "modulator-bias-y-phase": { + "instant": 0.3, + "avg": 0.4, + "min": 0.1, + "max": 0.6 + }, + "osnr": { + "instant": 25.5, + "avg": 25.2, + "min": 24.8, + "max": 25.8 + }, + "carrier-frequency-offset": { + "instant": 1.2, + "avg": 1.1, + "min": 0.8, + "max": 1.5 + }, + "sop-roc": { + "instant": 12.5, + "avg": 12.0, + "min": 11.5, + "max": 13.0 + }, + "modulation-error-ratio": { + "instant": -25.3, + "avg": -25.5, + "min": -26.0, + "max": -25.0 + }, + "fec-uncorrectable-blocks": 0, + "pre-fec-ber": { + "instant": 1e-15, + "avg": 2e-15, + "min": 1e-15, + "max": 5e-15 + }, + "post-fec-ber": { + "instant": 0.0, + "avg": 0.0, + "min": 0.0, + "max": 0.0 + }, + "q-value": { + "instant": 12.5, + "avg": 12.3, + "min": 12.0, + "max": 12.8 + }, + "esnr": { + "instant": 15.2, + "avg": 15.0, + "min": 14.8, + "max": 15.5 + } + } + ] + } + } + }, + { + "name": "optical-channel-1/1/2", + "config": { + "name": "optical-channel-1/1/2", + "type": "openconfig-platform-types:OPTICAL_CHANNEL" + }, + "state": { + "name": "optical-channel-1/1/2", + "type": "openconfig-platform-types:OPTICAL_CHANNEL", + "oper-status": "ACTIVE" + }, + "optical-channel": { + "config": { + "frequency": 196200000, + "target-output-power": 2.0, + "operational-mode": 3, + "line-port": "port-1/1/2", + "digital-subcarrier-spacing": 50.0, + "digital-subcarriers-group": [ + null, + { + "digital-subcarriers-group-id": 1, + "number-of-digital-subcarriers": 8, + "digital-subcarrier-group-size": 200, + "digital-subcarrier-id": [ + { + "digital-subcarrier-id": 1, + "active": true, + "digital-subcarrier-output-power": 1.8 + }, + { + "digital-subcarrier-id": 2, + "active": true, + "digital-subcarrier-output-power": 1.9 + }, + { + "digital-subcarrier-id": 3, + "active": true, + "digital-subcarrier-output-power": 1.7 + }, + { + "digital-subcarrier-id": 4, + "active": true, + "digital-subcarrier-output-power": 2.0 + }, + { + "digital-subcarrier-id": 5, + "active": true, + "digital-subcarrier-output-power": 1.8 + }, + { + "digital-subcarrier-id": 6, + "active": true, + "digital-subcarrier-output-power": 1.9 + }, + { + "digital-subcarrier-id": 7, + "active": false, + "digital-subcarrier-output-power": 0.0 + }, + { + "digital-subcarrier-id": 8, + "active": false, + "digital-subcarrier-output-power": 0.0 + } + ] + } + ] + }, + "state": { + "frequency": 196200000, + "target-output-power": 2.0, + "operational-mode": 3, + "line-port": "port-1/1/2", + "input-power": { + "instant": -3.2, + "avg": -3.1, + "min": -3.5, + "max": -2.8 + }, + "output-power": { + "instant": 2.1, + "avg": 2.0, + "min": 1.8, + "max": 2.3 + }, + "total-number-of-digital-subcarriers": 12, + "digital-subcarrier-spacing": 50.0, + "digital-subcarriers-group": [ + { + "digital-subcarriers-group-id": 1, + "number-of-digital-subcarriers": 8, + "digital-subcarrier-group-size": 200, + "digital-subcarrier-id": [ + { + "digital-subcarrier-id": 1, + "active": true, + "digital-subcarrier-output-power": 1.8 + }, + { + "digital-subcarrier-id": 2, + "active": true, + "digital-subcarrier-output-power": 1.9 + }, + { + "digital-subcarrier-id": 3, + "active": true, + "digital-subcarrier-output-power": 1.7 + }, + { + "digital-subcarrier-id": 4, + "active": true, + "digital-subcarrier-output-power": 2.0 + }, + { + "digital-subcarrier-id": 5, + "active": true, + "digital-subcarrier-output-power": 1.8 + }, + { + "digital-subcarrier-id": 6, + "active": true, + "digital-subcarrier-output-power": 1.9 + }, + { + "digital-subcarrier-id": 7, + "active": false, + "digital-subcarrier-output-power": 0.0 + }, + { + "digital-subcarrier-id": 8, + "active": false, + "digital-subcarrier-output-power": 0.0 + } + ] + }, + { + "digital-subcarriers-group-id": 2, + "number-of-digital-subcarriers": 4, + "digital-subcarrier-group-size": 200, + "digital-subcarrier-id": [ + { + "digital-subcarrier-id": 9, + "active": true, + "digital-subcarrier-output-power": 1.5 + }, + { + "digital-subcarrier-id": 10, + "active": true, + "digital-subcarrier-output-power": 1.6 + }, + { + "digital-subcarrier-id": 11, + "active": true, + "digital-subcarrier-output-power": 1.4 + }, + { + "digital-subcarrier-id": 12, + "active": true, + "digital-subcarrier-output-power": 1.7 + } + ] + } + ] + } + } + }, + { + "name": "transceiver-1/1", + "config": { + "name": "transceiver-1/1", + "type": "openconfig-platform-types:TRANSCEIVER" + }, + "state": { + "name": "transceiver-1/1", + "type": "openconfig-platform-types:TRANSCEIVER", + "oper-status": "ACTIVE", + "description": "100G QSFP28 transceiver", + "mfg-name": "ACME Optics", + "part-no": "QSFP28-100G-LR4", + "serial-no": "AC123456789" + } + }, + { + "name": "transceiver-1/2", + "config": { + "name": "transceiver-1/2", + "type": "openconfig-platform-types:TRANSCEIVER" + }, + "state": { + "name": "transceiver-1/2", + "type": "openconfig-platform-types:TRANSCEIVER", + "oper-status": "ACTIVE", + "description": "400G QSFP-DD coherent transceiver", + "mfg-name": "ACME Optics", + "part-no": "QSFPDD-400G-ZR", + "serial-no": "AC987654321" + } + }, + { + "name": "port-1/1/1", + "config": { + "name": "port-1/1/1", + "type": "openconfig-platform-types:PORT" + }, + "state": { + "name": "port-1/1/1", + "type": "openconfig-platform-types:PORT", + "oper-status": "ACTIVE", + "description": "Line port for 100G channel" + } + }, + { + "name": "port-1/1/2", + "config": { + "name": "port-1/1/2", + "type": "openconfig-platform-types:PORT" + }, + "state": { + "name": "port-1/1/2", + "type": "openconfig-platform-types:PORT", + "oper-status": "ACTIVE", + "description": "Line port for 400G channel with digital subcarriers" + } + } + ] + } +} \ No newline at end of file diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datastore.py b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datastore.py new file mode 100644 index 000000000..ba084a095 --- /dev/null +++ b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datastore.py @@ -0,0 +1,251 @@ +# src/nbi/service/testconf_dscm/datastore.py +import json +import os +import threading +from typing import Any, Dict, List + +DEFAULT_PATH = os.environ.get( + "DSCM_DATASTORE", + os.path.join(os.path.dirname(__file__), "datamodels", "dscm_store.json") +) + +class Store: + """ + Simple file-backed JSON store. + - Thread-safe (single lock). + - Access by JSON Pointer (RFC 6901) produced by path_resolver. + - Semantics: + get(ptr) -> value or None + create(ptr, obj) -> creates at ptr if not exists (for POST) + replace(ptr, obj) -> replaces/creates (for PUT) + merge(ptr, obj) -> deep merge dicts (for PATCH) + delete(ptr) + """ + def __init__(self, filepath: str = DEFAULT_PATH): + self.filepath = filepath + self._lock = threading.RLock() + os.makedirs(os.path.dirname(self.filepath), exist_ok=True) + if not os.path.exists(self.filepath): + with open(self.filepath, "w", encoding="utf-8") as f: + json.dump({}, f) + + def _read(self) -> Dict[str, Any]: + with open(self.filepath, "r", encoding="utf-8") as f: + return json.load(f) + + def _write(self, data: Dict[str, Any]): + tmp = self.filepath + ".tmp" + with open(tmp, "w", encoding="utf-8") as f: + json.dump(data, f, ensure_ascii=False, indent=2) + os.replace(tmp, self.filepath) + + # --- JSON Pointer helpers --- + @staticmethod + def _walk(root: Any, tokens: List[str], create_missing=False): + cur = root + for i, tok in enumerate(tokens[:-1]): + if isinstance(cur, list): + # For YANG lists, search for item with matching key field + # Common key fields: 'index', 'name', 'id', etc. + found = False + for item in cur: + if isinstance(item, dict): + # Try common YANG list key fields + key_fields = ['index', 'name', 'id', 'mode-id', 'digital-subcarriers-group-id', 'digital-subcarrier-id'] + for key_field in key_fields: + if key_field in item: + # Convert both to strings for comparison + if str(item[key_field]) == str(tok): + cur = item + found = True + break + if found: + break + if not found: + if create_missing: + # For lists, we can't create missing items without knowing the structure + raise KeyError(f"Cannot create missing list item '{tok}' without context") + else: + raise KeyError(f"List item with key '{tok}' not found") + else: + if tok not in cur: + if create_missing: + cur[tok] = {} + else: + raise KeyError(f"Missing key '{tok}'") + cur = cur[tok] + return cur, tokens[-1] if tokens else None + + @staticmethod + def _split(ptr: str) -> List[str]: + if not ptr or ptr == "/": + return [] + if ptr[0] != "/": + raise KeyError("Pointer must start with '/'") + tokens = ptr.split("/")[1:] + # Unescape per RFC 6901 + return [t.replace("~1", "/").replace("~0", "~") for t in tokens] + + def get_root(self): + with self._lock: + return self._read() + + def get(self, ptr: str): + with self._lock: + data = self._read() + tokens = self._split(ptr) + if not tokens: + return data + cur = data + for i, tok in enumerate(tokens): + if isinstance(cur, list): + # For YANG lists, search for item with matching key field + # Common key fields: 'index', 'name', 'id', etc. + found = False + for item in cur: + if isinstance(item, dict): + # Try common YANG list key fields + key_fields = ['index', 'name', 'id', 'mode-id', 'digital-subcarriers-group-id', 'digital-subcarrier-id'] + for key_field in key_fields: + if key_field in item: + # Convert both to strings for comparison + if str(item[key_field]) == str(tok): + cur = item + found = True + break + if found: + break + if not found: + return None + else: + if tok not in cur: + return None + cur = cur[tok] + return cur + + def create(self, ptr: str, obj: Any): + with self._lock: + data = self._read() + tokens = self._split(ptr) + if not tokens: + # POST at root merges keys if not exist + if not isinstance(obj, dict): + raise ValueError("Root create expects an object") + for k in obj: + if k in data: + raise ValueError(f"Key '{k}' exists") + data.update(obj) + self._write(data) + return obj + + parent, leaf = self._walk(data, tokens, create_missing=True) + if isinstance(parent, list): + if leaf != "-": + raise ValueError("For lists, use '-' to append") + if not isinstance(obj, (dict, list)): + raise ValueError("Append expects object or list item") + parent.append(obj) + else: + if leaf in parent: + raise ValueError(f"Key '{leaf}' exists") + parent[leaf] = obj + self._write(data) + return obj + + def replace(self, ptr: str, obj: Any): + with self._lock: + data = self._read() + tokens = self._split(ptr) + if not tokens: + if not isinstance(obj, dict): + raise ValueError("Root replace expects an object") + self._write(obj) + return obj + parent, leaf = self._walk(data, tokens, create_missing=True) + if isinstance(parent, list): + idx = int(leaf) + while idx >= len(parent): + parent.append(None) + parent[idx] = obj + else: + parent[leaf] = obj + self._write(data) + return obj + + def merge(self, ptr: str, obj: Any): + def deep_merge(a, b): + if isinstance(a, dict) and isinstance(b, dict): + for k, v in b.items(): + a[k] = deep_merge(a.get(k), v) if k in a else v + return a + return b + + with self._lock: + data = self._read() + tokens = self._split(ptr) + if not tokens: + if not isinstance(obj, dict): + raise ValueError("Root merge expects an object") + merged = deep_merge(data, obj) + self._write(merged) + return merged + parent, leaf = self._walk(data, tokens, create_missing=True) + if isinstance(parent, list): + # Try to interpret as integer index first + try: + idx = int(leaf) + while idx >= len(parent): + parent.append({}) + parent[idx] = deep_merge(parent[idx], obj) + target = parent[idx] + except ValueError: + # If not an integer, search for matching key in list items + found = False + for i, item in enumerate(parent): + if isinstance(item, dict) and item.get('name') == leaf: + parent[i] = deep_merge(item, obj) + target = parent[i] + found = True + break + if not found: + raise KeyError(f"List item with name '{leaf}' not found for merge") + else: + cur = parent.get(leaf, {}) + parent[leaf] = deep_merge(cur, obj) + target = parent[leaf] + self._write(data) + return target + + def delete(self, ptr: str): + with self._lock: + data = self._read() + tokens = self._split(ptr) + if not tokens: + # wipe root + self._write({}) + return + parent, leaf = self._walk(data, tokens) + if isinstance(parent, list): + # For YANG lists, find the item with matching key field + found_index = None + for i, item in enumerate(parent): + if isinstance(item, dict): + # Try common YANG list key fields + key_fields = ['index', 'name', 'id', 'mode-id', 'digital-subcarriers-group-id', 'digital-subcarrier-id'] + for key_field in key_fields: + if key_field in item: + # Convert both to strings for comparison + if str(item[key_field]) == str(leaf): + found_index = i + break + if found_index is not None: + break + if found_index is not None: + del parent[found_index] + else: + raise KeyError(f"List item with key '{leaf}' not found") + else: + if leaf not in parent: + raise KeyError("Missing key") + del parent[leaf] + self._write(data) diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/dscm.py b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/dscm.py new file mode 100644 index 000000000..88c2d1b42 --- /dev/null +++ b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/dscm.py @@ -0,0 +1,45 @@ +import logging +import re +from typing import Dict +from device.service.drivers.netconf_dscm.NetConfDriver import NetConfDriver + +LOGGER = logging.getLogger(__name__) +logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') + +DEVICES = { + 'T2.1': {'address': '10.30.7.7', 'port': 2023, 'settings': {}}, + 'T1.1': {'address': '10.30.7.8', 'port': 2023, 'settings': {}}, + 'T1.2': {'address': '10.30.7.8', 'port': 2023, 'settings': {}}, + 'T1.3': {'address': '10.30.7.8', 'port': 2023, 'settings': {}} + } + +# NODES = {'T2.1': 'hub', 'T1.1': 'leaves', 'T1.2': 'leaves', 'T1.3': 'leaves'} + +class DscmPlugin: + def __init__(self, device_id : str): + self.device_id = device_id #NODES.get(device_id) + # if not self.device_id: + # LOGGER.error(f"Device ID {self.device_id} not found in NODES mapping.") + # raise ValueError(f"Unknown device ID: {self.device_id}") + device_config = DEVICES.get(self.device_id) + if not device_config: + LOGGER.error(f"Device ID {self.device_id} not found in configuration.") + raise ValueError(f"Unknown device ID: {device_id}") + self.driver = NetConfDriver( + device_config['address'], device_config['port'], **(device_config['settings']) + ) + LOGGER.info(f"Initialized DscmPlugin for device {self.device_id} with following config: {device_config}") + + def Configure_pluaggable(self, config : Dict) -> bool: + LOGGER.info(f"Configuring pluggable for device {self.device_id} with config: {config}. Config type: {type(config)}") + try: + result_config = self.driver.SetConfig([(self.device_id, config)]) + if isinstance(result_config[0], bool): + LOGGER.info(f"SetConfig successful for device {self.device_id}. Response: {result_config}") + return True + else: + LOGGER.error(f"SBI failed for configure device {self.device_id}. Response: {result_config}") + return False + except Exception as e: + LOGGER.error(f"SetConfig exception for device {self.device_id}: {str(e)}") + return False diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/enforce_header.py b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/enforce_header.py new file mode 100644 index 000000000..f1395663b --- /dev/null +++ b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/enforce_header.py @@ -0,0 +1,26 @@ +# src/nbi/service/testconf_dscm/enforce_header.py +from functools import wraps +from flask import request +from .error import yang_error + +def require_accept(allowed): + def deco(fn): + @wraps(fn) + def _wrap(*args, **kwargs): + accept = request.headers.get("Accept", "") + if not any(a in accept or accept == "*/*" for a in allowed): + return yang_error({"error-message": f"Accept not supported. Use one of {allowed}"}, status=406) + return fn(*args, **kwargs) + return _wrap + return deco + +def require_content_type(allowed): + def deco(fn): + @wraps(fn) + def _wrap(*args, **kwargs): + ctype = request.headers.get("Content-Type", "") + if not any(a in ctype for a in allowed): + return yang_error({"error-message": f"Content-Type not supported. Use one of {allowed}"}, status=415) + return fn(*args, **kwargs) + return _wrap + return deco diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/error.py b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/error.py new file mode 100644 index 000000000..04ec6b7b7 --- /dev/null +++ b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/error.py @@ -0,0 +1,17 @@ +import json +from flask import Response + +YANG_JSON = "application/yang-data+json" +ERR_JSON = "application/yang-errors+json" + + +def yang_json(data, status=200): + return Response(json.dumps(data, ensure_ascii=False), status=status, mimetype=YANG_JSON) + +def yang_error(err_dict, status=400): + body = {"errors": {"error": [err_dict]}} + return Response(json.dumps(body, ensure_ascii=False), status=status, mimetype=ERR_JSON) + +def _bad_request(msg, path=None): + return yang_error({"error-type": "protocol", "error-tag": "operation-failed", + "error-message": msg, **({"error-path": path} if path else {})}, status=400) \ No newline at end of file diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/path_resolver.py b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/path_resolver.py new file mode 100644 index 000000000..55b65221e --- /dev/null +++ b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/path_resolver.py @@ -0,0 +1,128 @@ +import re + +class RestconfPath: + """ + Parses RESTCONF data paths into a JSON Pointer. + Very lightweight: assumes RFC 8040 JSON encoding already used in your JSON. + Examples: + rc: openconfig-terminal-device:terminal-devices/device[name=dev1]/... + -> /openconfig-terminal-device/terminal-devices/device/dev1/... + Notes: + - list keys become path segments (common for simple JSON stores) + - module prefix ':' becomes '/' + """ + + def __init__(self, raw: str): + self.raw = raw.strip().strip("/") + self.tokens = self._parse(self.raw) + + def json_pointer(self) -> str: + if not self.tokens: + return "/" + # Escape ~ and / per RFC 6901 + esc = [t.replace("~", "~0").replace("/", "~1") for t in self.tokens] + return "/" + "/".join(esc) + + @staticmethod + def _parse(raw: str): + # Strip optional 'data/' if someone passes the whole tail + if raw.startswith("data/"): + raw = raw[5:] + + # Special handling for paths that contain component= with slashes + # This handles the case where Flask has already URL-decoded %2F to / + # Look for patterns like "component=something/with/slashes/more-stuff" + + # Split on / but be smart about component= assignments + parts = [] + remaining = raw + + while remaining: + # Find the next / that's not part of a component= value + if "component=" in remaining: + # Find where component= starts + comp_start = remaining.find("component=") + if comp_start >= 0: + # Add everything before component= as separate parts + if comp_start > 0: + before_comp = remaining[:comp_start].rstrip("/") + if before_comp: + parts.extend(before_comp.split("/")) + + # Now handle the component= part + comp_part = remaining[comp_start:] + + # Find the next / that starts a new path segment (not part of component name) + # Look for pattern that indicates start of new segment (like /config, /state, /optical-channel) + next_segment_match = re.search(r'/(?:config|state|optical-channel|ingress|ethernet|otn)', comp_part) + + if next_segment_match: + # Split at the next major segment + comp_value = comp_part[:next_segment_match.start()] + remaining = comp_part[next_segment_match.start()+1:] + else: + # No more segments, take the whole thing + comp_value = comp_part + remaining = "" + + parts.append(comp_value) + else: + # No component= found, split normally + next_slash = remaining.find("/") + if next_slash >= 0: + parts.append(remaining[:next_slash]) + remaining = remaining[next_slash+1:] + else: + parts.append(remaining) + remaining = "" + else: + # No component= in remaining, split normally on / + if "/" in remaining: + next_slash = remaining.find("/") + parts.append(remaining[:next_slash]) + remaining = remaining[next_slash+1:] + else: + parts.append(remaining) + remaining = "" + + tokens = [] + for part in parts: + if not part: # Skip empty parts + continue + + if ":" in part: + # For YANG modules, keep the module:container format for JSON keys + # e.g., openconfig-platform:components stays as openconfig-platform:components + pass + + # Convert list key syntax [k=v] into segments ...// + # Also handle direct assignment: list=value -> list/value + # e.g., device[name=dev1] -> device/dev1 + # e.g., component=optical-channel-1/1/1 -> component/optical-channel-1/1/1 + + # Check for direct assignment first (RFC 8040 syntax) + if "=" in part and "[" not in part: + list_name, key_value = part.split("=", 1) + tokens.append(list_name) + # No need to URL decode again since Flask already did it + tokens.append(key_value) + continue + + # Handle bracket syntax [k=v] + m = re.match(r"^([A-Za-z0-9\-\_]+)(\[(.+?)\])?$", part) + if not m: + tokens.append(part) + continue + + base = m.group(1) + tokens.append(base) + + kvs = m.group(3) + if kvs: + # support single key or multi-key; take values in order + # e.g., [name=dev1][index=0] -> /dev1/0 + for each in re.findall(r"([^\]=]+)=([^\]]+)", kvs): + # No need to URL decode again since Flask already did it + key_value = each[1] + tokens.append(key_value) + return tokens diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/requirements.txt b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/requirements.txt new file mode 100644 index 000000000..7bc9e27b1 --- /dev/null +++ b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/requirements.txt @@ -0,0 +1,5 @@ +flask>=3.0.0 +pytest>=8.4.1 +pytest-cov>=6.2.1 +requests>=2.31.0 +flask-socketio==5.5.1 \ No newline at end of file diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/routes.py b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/routes.py new file mode 100644 index 000000000..c955ae85b --- /dev/null +++ b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/routes.py @@ -0,0 +1,133 @@ +from flask import Blueprint, request, Response, abort +import logging +from .datastore import Store +from .path_resolver import RestconfPath +from .enforce_header import require_accept, require_content_type +from .error import _bad_request, yang_json +from .dscm import DscmPlugin + +LOGGER = logging.getLogger(__name__) +logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') + +blueprint = Blueprint("testconf_dscm", __name__) + +YANG_JSON = "application/yang-data+json" +ERR_JSON = "application/yang-errors+json" + +# -- Global store instance -- +store = Store() + +# -- Temporary solution for device-specific stores -- +# TODO: This should be replaced with Context get_device method. +def get_device_store(device_uuid=None): + """Get store instance, optionally scoped to a specific device.""" + if device_uuid: + # Use device-specific datastore + LOGGER.info(f"Using device-specific store for device UUID: {device_uuid}") + import os + device_path = os.environ.get( + "DSCM_DATASTORE_DIR", + os.path.join(os.path.dirname(__file__), "datamodels") + ) + device_file = os.path.join(device_path, f"device_{device_uuid}.json") + return Store(device_file) + return store + +# Root endpoints (both prefixes) +@blueprint.route("/device=/", methods=["GET"]) +@blueprint.route("/", methods=["GET"], defaults={'device_uuid': None}) +@require_accept([YANG_JSON]) +def list_root(device_uuid=None): + """List top-level modules/containers available.""" + device_store = get_device_store(device_uuid) + return yang_json(device_store.get_root()) + +# Data manipulation endpoints (both prefixes) +@blueprint.route("/device=/", methods=["GET"]) +@require_accept([YANG_JSON]) +def rc_get(rc_path, device_uuid=None): + LOGGER.info(f"GET request for path: {rc_path} on device UUID: {device_uuid}") + try: + device_store = get_device_store(device_uuid) + p = RestconfPath(rc_path) + val = device_store.get(p.json_pointer()) + if val is None: + abort(404) + return yang_json(val) + except KeyError: + abort(404) + except Exception as e: + from werkzeug.exceptions import HTTPException + if isinstance(e, HTTPException): + raise e + return _bad_request(f"Internal error: {str(e)}", path=rc_path) + +@blueprint.route("/device=/", methods=["POST"]) +@require_accept([YANG_JSON]) +@require_content_type([YANG_JSON]) +def rc_post(rc_path, device_uuid=None): + device_store = get_device_store(device_uuid) + p = RestconfPath(rc_path) + payload = request.get_json(force=True, silent=True) + if payload is None: + return _bad_request("Invalid or empty JSON payload.", path=p.raw) + + try: + created = device_store.create(p.json_pointer(), payload) + except KeyError as e: + return _bad_request(str(e), path=p.raw) + except ValueError as e: + return _bad_request(str(e), path=p.raw) + + return yang_json(created, status=201) + +@blueprint.route("/device=/", methods=["PUT"]) +@require_accept([YANG_JSON]) +@require_content_type([YANG_JSON]) +def rc_put(rc_path, device_uuid=None): + device_store = get_device_store(device_uuid) + p = RestconfPath(rc_path) + payload = request.get_json(force=True, silent=True) + if payload is None: + return _bad_request("Invalid or empty JSON payload.", path=p.raw) + + try: + updated = device_store.replace(p.json_pointer(), payload) + except KeyError as e: + return _bad_request(str(e), path=p.raw) + return yang_json(updated, status=200) + +@blueprint.route("/device=/", methods=["PATCH"]) +@require_accept([YANG_JSON]) +@require_content_type([YANG_JSON]) +def rc_patch(rc_path, device_uuid=None): + if device_uuid is None: + return _bad_request("Device UUID must be specified for PATCH requests.", path=rc_path) + Pluggable = DscmPlugin(device_id=device_uuid) + response = Pluggable.Configure_pluaggable(request.get_json()) + if not response: + return _bad_request("Failed to configure pluggable device.", path=rc_path) + return yang_json({"result": response}, status=200) + + # device_store = get_device_store(device_uuid) + # p = RestconfPath(rc_path) + # payload = request.get_json(force=True, silent=True) + # if payload is None: + # return _bad_request("Invalid or empty JSON payload.", path=p.raw) + + # try: + # merged = device_store.merge(p.json_pointer(), payload) + # except KeyError as e: + # return _bad_request(str(e), path=p.raw) + # return yang_json(merged, status=200) + +@blueprint.route("/device=/", methods=["DELETE"]) +@require_accept([YANG_JSON]) +def rc_delete(rc_path, device_uuid=None): + device_store = get_device_store(device_uuid) + p = RestconfPath(rc_path) + try: + device_store.delete(p.json_pointer()) + except KeyError: + abort(404) + return Response(status=204) diff --git a/src/nbi/tests/DSCM_MockWebServer.py b/src/nbi/tests/DSCM_MockWebServer.py new file mode 100644 index 000000000..757753361 --- /dev/null +++ b/src/nbi/tests/DSCM_MockWebServer.py @@ -0,0 +1,61 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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, time +from common.Constants import ServiceNameEnum +from common.Settings import ( + ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_HTTP, + get_env_var_name, get_service_baseurl_http, get_service_port_http +) +from nbi.service.rest_server.RestServer import RestServer +from nbi.service.rest_server.nbi_plugins.dscm_oc import register_dscm_oc +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 + + +LOCAL_HOST = '127.0.0.1' +MOCKSERVICE_PORT = 10000 +NBI_SERVICE_PORT = MOCKSERVICE_PORT + get_service_port_http(ServiceNameEnum.NBI) # avoid privileged ports +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) + +@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 : MockService_Dependencies): # pylint: disable=redefined-outer-name, unused-argument + _rest_server = RestServer() + 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) + register_dscm_oc(_rest_server) + + _rest_server.start() + time.sleep(1) # bring time for the server to start + yield _rest_server + _rest_server.shutdown() + _rest_server.join() diff --git a/src/nbi/tests/test_dscm_restconf.py b/src/nbi/tests/test_dscm_restconf.py new file mode 100644 index 000000000..ea873b860 --- /dev/null +++ b/src/nbi/tests/test_dscm_restconf.py @@ -0,0 +1,289 @@ + +from nbi.service.rest_server import RestServer +from typing import Dict +from urllib.parse import quote +import pytest, time, logging, os +import requests +from .DSCM_MockWebServer import nbi_service_rest, mock_service + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +# Test configuration +BASE_URL = "http://192.168.202.254:80/restconf/data/" +# BASE_URL = "http://127.0.0.1:18080/restconf/data/" + + +HEADERS = { + "Accept": "application/yang-data+json", + "Content-Type": "application/yang-data+json" +} +RAW_DEVICE_ID = "T2.1/" # Only have a single value for hub +# RAW_DEVICE_ID = "T1.3/" # Can be Changed to "T1.1/" and "T1.2" to test other leaves +DEVICE_ID = f"device={RAW_DEVICE_ID}" + +@pytest.fixture(autouse=True) +def log_each(request): + LOGGER.info(f">>>>>> START {request.node.name} >>>>>>") + yield + LOGGER.info(f"<<<<<< END {request.node.name} <<<<<<") + +def get_default_hub_set_config() -> Dict: + return { + "name" : "channel-1", + "frequency" : "195000000", + "target_output_power": "-3.0", + "operational_mode" : "1", + "operation" : "merge", + "digital_subcarriers_groups": [ + { "group_id": 1, "digital-subcarrier-id": [{ "subcarrier-id": 1, "active": True}, ]}, + { "group_id": 2, "digital-subcarrier-id": [{ "subcarrier-id": 2, "active": True}, ]}, + { "group_id": 3, "digital-subcarrier-id": [{ "subcarrier-id": 3, "active": True}, ]}, + { "group_id": 4, "digital-subcarrier-id": [{ "subcarrier-id": 4, "active": True}, ]}, + ], + } + +def get_default_config_leaf() -> Dict: + return { + "operation": "merge", + "channels": + [{ + "name" : "channel-1", + "frequency" : "195006250", + "target_output_power" : "-99.0", + "operational_mode" : "1", + "digital_subcarriers_groups": [{ "group_id": 1 }] + }, + { + "name" : "channel-3", + "frequency" : "195018750", + "target_output_power" : "-99.0", + "operational_mode" : "1", + "digital_subcarriers_groups": [{ "group_id": 1 }] + }, + { + "name" : "channel-5", + "frequency" : "195031250", + "target_output_power" : "-99.0", + "operational_mode" : "1", + "digital_subcarriers_groups": [{ "group_id": 1 }] + }] + } + +def get_config_by_device_id(device_id: str) -> Dict: + if device_id == "T2.1": + return get_default_hub_set_config() + elif device_id in ["T1.1", "T1.2", "T1.3"]: + return get_default_config_leaf() + else: + raise ValueError("Unknown device_id") + +def test_patch_optical_channel_frequency(nbi_service_rest: RestServer): + """Test PATCH to update optical channel frequency.""" + # Use simple path with / and encode manually for component name + # TODO: What is the purpose of PATH variable here? as we have XML template for each device. with device_id we can get the template + component_name = "optical-channel-1/1/1" + encoded_path = f"{DEVICE_ID}openconfig-platform:components/component={quote(component_name, safe='')}/optical-channel/config" + + # Get and save original values + # response = requests.get(f"{BASE_URL}{encoded_path}", headers={"Accept": "application/yang-data+json"}) + # assert response.status_code == 200 + # original = response.json() + + # Update frequency + # patch_data = { "frequency": 196150000, "target-output-power": 1.5 } + patch_data = get_config_by_device_id(RAW_DEVICE_ID.strip('/')) + response = requests.patch(f"{BASE_URL}{encoded_path}", + json=patch_data, + headers=HEADERS) + assert response.status_code == 200 + + # # Verify update + # updated = response.json() + # assert updated["frequency"] == '195000000' + # assert updated["target_output_power"] == '-3.0' + + # # Restore original values + # restore_data = { + # "frequency": original["frequency"], + # "target-output-power": original["target-output-power"] + # } + + # response = requests.patch(f"{BASE_URL}{encoded_path}", + # json=restore_data, + # headers=HEADERS) + # assert response.status_code == 200 + + # # Validate restoration + # restored = response.json() + # assert restored["frequency"] == original["frequency"] + # assert restored["target-output-power"] == original["target-output-power"] + +# def test_get_root_data(nbi_service_rest: RestServer): +# """Test GET {DEVICE_ID}restconf/data/ - should return top-level modules.""" +# # response = requests.get(f"{BASE_URL}{DEVICE_ID}restconf/data/openconfig-terminal-device:terminal-device/logical-channels/channel=1", headers={"Accept": "application/yang-data+json"}) +# response = requests.get(f"{BASE_URL}{DEVICE_ID}restconf/data/", headers={"Accept": "application/yang-data+json"}) +# assert response.status_code == 200 +# assert response.headers["Content-Type"] == "application/yang-data+json" + +# data = response.json() +# assert "openconfig-terminal-device:terminal-device" in data +# assert "openconfig-platform:components" in data + +# def test_get_specific_device_config(nbi_service_rest: RestServer): +# # path = "http://127.0.0.1:8000/device=dscm-1/restconf/data/openconfig-terminal-device:terminal-device/logical-channels/channel=1" +# # path = "http://127.0.0.1:8000/restconf/data/openconfig-terminal-device:terminal-device/config" +# response = requests.get(f"{BASE_URL}{DEVICE_ID}restconf/data/openconfig-terminal-device:terminal-device/logical-channels/channel=1", headers={"Accept": "application/yang-data+json"}) + +# # response = requests.get(f"{path}", headers={"Accept": "application/yang-data+json"}) + +# assert response.status_code == 200 +# data = response.json() +# assert data["index"] == 1 +# assert data["config"]["description"] == "Updated 100G client channel" +# assert data["state"]["link-state"] == "UP" + +# def test_get_logical_channels(nbi_service_rest: RestServer): +# """Test GET for logical channels list.""" +# path = f"{DEVICE_ID}restconf/data/openconfig-terminal-device:terminal-device/logical-channels" +# response = requests.get(f"{BASE_URL}{path}", headers={"Accept": "application/yang-data+json"}) + +# assert response.status_code == 200 +# data = response.json() +# assert "channel" in data +# assert len(data["channel"]) >= 2 # Should have at least 2 channels from datastore + +# def test_get_specific_logical_channel(nbi_service_rest: RestServer): +# """Test GET for specific logical channel by index.""" +# path = f"{DEVICE_ID}restconf/data/openconfig-terminal-device:terminal-device/logical-channels/channel=1" +# response = requests.get(f"{BASE_URL}{path}", headers={"Accept": "application/yang-data+json"}) + +# assert response.status_code == 200 +# data = response.json() +# assert data["index"] == 1 +# assert data["config"]["description"] == "Updated 100G client channel" +# assert data["state"]["link-state"] == "UP" + +# def test_get_optical_channel_component(nbi_service_rest: RestServer): +# """Test GET for specific optical channel component.""" +# # Use simple path with / and let requests handle URL encoding +# component_name = "optical-channel-1/1/1" +# encoded_path = f"{DEVICE_ID}restconf/data/openconfig-platform:components/component={quote(component_name, safe='')}" +# response = requests.get(f"{BASE_URL}{encoded_path}", headers={"Accept": "application/yang-data+json"}) + +# assert response.status_code == 200 +# data = response.json() +# assert data["name"] == "optical-channel-1/1/1" +# assert data["state"]["oper-status"] == "ACTIVE" +# assert "optical-channel" in data + +# def test_get_nonexistent_resource(nbi_service_rest: RestServer): +# """Test GET for non-existent resource returns 404.""" +# path = "/data/openconfig-terminal-device:terminal-device/logical-channels/channel=999" +# response = requests.get(f"{BASE_URL}{path}", headers={"Accept": "application/yang-data+json"}) + +# assert response.status_code == 404 + +# def test_patch_logical_channel_config(nbi_service_rest: RestServer): +# """Test PATCH to update logical channel configuration.""" +# path = f"{DEVICE_ID}restconf/data/openconfig-terminal-device:terminal-device/logical-channels/channel=1/config" + +# # First get and save original state +# response = requests.get(f"{BASE_URL}{path}", headers={"Accept": "application/yang-data+json"}) +# assert response.status_code == 200 +# original = response.json() + +# # Update description via PATCH +# patch_data = { +# "description": "Updated 100G client channel", +# "admin-state": "DISABLED" +# } + +# response = requests.patch(f"{BASE_URL}{path}", +# json=patch_data, +# headers=HEADERS) +# assert response.status_code == 200 + +# # Verify the merge happened correctly +# updated = response.json() +# assert updated["description"] == "Updated 100G client channel" +# assert updated["admin-state"] == "DISABLED" +# assert updated["index"] == original["index"] # Should preserve other fields +# assert updated["rate-class"] == original["rate-class"] + +# # Restore original values +# restore_data = { +# "description": original["description"], +# "admin-state": original["admin-state"] +# } + +# response = requests.patch(f"{BASE_URL}{path}", +# json=restore_data, +# headers=HEADERS) +# assert response.status_code == 200 + +# # Validate restoration +# restored = response.json() +# assert restored["description"] == original["description"] +# assert restored["admin-state"] == original["admin-state"] + +# def test_delete_digital_subcarrier(nbi_service_rest: RestServer): +# """Test DELETE of a digital subcarrier from optical channel.""" +# # Use simple path with / and encode component name +# component_name = "optical-channel-1/1/2" +# base_path = f"{DEVICE_ID}restconf/data/openconfig-platform:components/component={quote(component_name, safe='')}/optical-channel/config/digital-subcarriers-group=1" + +# # First get and save the subcarrier data +# response = requests.get(f"{BASE_URL}{base_path}", headers={"Accept": "application/yang-data+json"}) +# assert response.status_code == 200 +# original_data = response.json() + +# # Delete the second digital subcarriers group +# response = requests.delete(f"{BASE_URL}{base_path}", headers={"Accept": "application/yang-data+json"}) +# assert response.status_code == 204 + +# # Verify it's gone +# response = requests.get(f"{BASE_URL}{base_path}", headers={"Accept": "application/yang-data+json"}) +# assert response.status_code == 404 + +# # Restore the deleted data using PUT +# response = requests.put(f"{BASE_URL}{base_path}", +# json=original_data, +# headers=HEADERS) +# assert response.status_code in [200, 201] + +# # Validate restoration +# response = requests.get(f"{BASE_URL}{base_path}", headers={"Accept": "application/yang-data+json"}) +# assert response.status_code == 200 +# restored = response.json() +# assert restored == original_data + +# def test_delete_logical_channel_assignment(nbi_service_rest: RestServer): +# """Test DELETE of logical channel assignment.""" +# path = f"{DEVICE_ID}restconf/data/openconfig-terminal-device:terminal-device/logical-channels/channel=1/logical-channel-assignments/assignment=1" + +# # Get and save original assignment data +# response = requests.get(f"{BASE_URL}{path}", headers={"Accept": "application/yang-data+json"}) +# assert response.status_code == 200 +# original_data = response.json() + +# # Delete the assignment +# response = requests.delete(f"{BASE_URL}{path}", headers={"Accept": "application/yang-data+json"}) +# assert response.status_code == 204 + +# # Verify deletion +# response = requests.get(f"{BASE_URL}{path}", headers={"Accept": "application/yang-data+json"}) +# assert response.status_code == 404 + +# # Restore the deleted assignment using PUT +# response = requests.put(f"{BASE_URL}{path}", +# json=original_data, +# headers=HEADERS) +# assert response.status_code in [200, 201] + +# # Validate restoration +# response = requests.get(f"{BASE_URL}{path}", headers={"Accept": "application/yang-data+json"}) +# assert response.status_code == 200 +# restored = response.json() +# assert restored == original_data + diff --git a/src/nbi/tests/test_l3vpn_ecoc25.py b/src/nbi/tests/test_l3vpn_ecoc25.py new file mode 100644 index 000000000..fec3819b1 --- /dev/null +++ b/src/nbi/tests/test_l3vpn_ecoc25.py @@ -0,0 +1,48 @@ + +from nbi.service.rest_server import RestServer +from typing import Dict +from urllib.parse import quote +import pytest, time, logging, os +import requests +from .DSCM_MockWebServer import nbi_service_rest, mock_service +import json + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + +# Test configuration +# BASE_URL = "http://192.168.202.254:80/restconf/data/" +BASE_URL = "http://127.0.0.1:18080/restconf/data" + +PATH = "/ietf-l3vpn-svc:l3vpn-svc/vpn-services" + + +@pytest.fixture(autouse=True) +def log_each(request): + LOGGER.info(f">>>>>> START {request.node.name} >>>>>>") + yield + LOGGER.info(f"<<<<<< END {request.node.name} <<<<<<") + +def test_post_service(nbi_service_rest: RestServer): + + # service_file = 'descriptors/pablo_request.json' + service_file = 'nbi/tests/ietf_l3vpn_req_my_topology.json' + # service_file = 'descriptors/ietf_l3vpn_req_my_topology.json' + + with open(service_file, 'r') as file: + json_data = json.load(file) + headers = { + 'Content-Type': 'application/json', + 'Accept': 'application/json' + } + + URL = f"{BASE_URL}{PATH}" + LOGGER.info(f"POST {URL}") + LOGGER.info("--------------") + response = requests.post(URL, headers=headers, json=json_data) + time.sleep(10) + LOGGER.info(response.status_code) + LOGGER.info("--------------") + LOGGER.info(response.text) + + \ No newline at end of file -- GitLab From 9080f0f86118ec151eb9ca7f19f1807efc337d1e Mon Sep 17 00:00:00 2001 From: mansoca Date: Tue, 21 Oct 2025 11:26:00 +0000 Subject: [PATCH 004/111] Add DSCM NetConf Driver and associated test scripts - Implemented NetConfDriver for managing device configurations via NETCONF protocol. - Created run_tests_locally-device-netconf-dscm.sh script for local testing of driver functionalities. - Added Jinja2 templates for generating configuration XML for hub and leaf devices. - Developed test cases in test_dscm_netconf_hub_leaf.py to validate configuration retrieval and setting for hub and leaf devices. - Added example XML files for expected configurations and actual results for testing purposes. --- .../run_tests_locally-device-netconf-dscm.sh | 27 ++ .../drivers/netconf_dscm/NetConfDriver.py | 130 ++++++++++ .../service/drivers/netconf_dscm/__init__.py | 14 + .../templates/edit_config_hub_template.xml | 31 +++ .../templates/edit_config_leaf_template.xml | 31 +++ .../netconf_dscm/templates/edit_dscm_hub.xml | 99 +++++++ .../templates/edit_dscm_leaves.xml | 101 ++++++++ .../templates/test_hub_template.xml | 39 +++ .../component/config/edit_config.xml | 14 + .../templates/components/component/get.xml | 3 + .../component/optical_channel/get.xml | 11 + src/device/tests/dscm/Fixtures.py | 58 +++++ src/device/tests/dscm/__init__.py | 13 + src/device/tests/dscm/actual_hub.xml | 21 ++ src/device/tests/dscm/rendered_hub.xml | 60 +++++ .../tests/dscm/test_dscm_netconf_hub_leaf.py | 243 ++++++++++++++++++ 16 files changed, 895 insertions(+) create mode 100755 scripts/run_tests_locally-device-netconf-dscm.sh create mode 100644 src/device/service/drivers/netconf_dscm/NetConfDriver.py create mode 100644 src/device/service/drivers/netconf_dscm/__init__.py create mode 100644 src/device/service/drivers/netconf_dscm/templates/edit_config_hub_template.xml create mode 100644 src/device/service/drivers/netconf_dscm/templates/edit_config_leaf_template.xml create mode 100644 src/device/service/drivers/netconf_dscm/templates/edit_dscm_hub.xml create mode 100644 src/device/service/drivers/netconf_dscm/templates/edit_dscm_leaves.xml create mode 100644 src/device/service/drivers/netconf_dscm/templates/test_hub_template.xml create mode 100644 src/device/service/drivers/openconfig/templates/components/component/config/edit_config.xml create mode 100644 src/device/service/drivers/openconfig/templates/components/component/get.xml create mode 100644 src/device/service/drivers/openconfig/templates/components/component/optical_channel/get.xml create mode 100644 src/device/tests/dscm/Fixtures.py create mode 100644 src/device/tests/dscm/__init__.py create mode 100644 src/device/tests/dscm/actual_hub.xml create mode 100644 src/device/tests/dscm/rendered_hub.xml create mode 100644 src/device/tests/dscm/test_dscm_netconf_hub_leaf.py diff --git a/scripts/run_tests_locally-device-netconf-dscm.sh b/scripts/run_tests_locally-device-netconf-dscm.sh new file mode 100755 index 000000000..e01667e33 --- /dev/null +++ b/scripts/run_tests_locally-device-netconf-dscm.sh @@ -0,0 +1,27 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 + +python3 -m pytest --log-level=DEBUG --log-cli-level=INFO --verbose \ + device/tests/dscm/test_dscm_netconf_hub_leaf.py::test_get_default_hub_config + +python3 -m pytest --log-level=DEBUG --log-cli-level=INFO --verbose \ + device/tests/dscm/test_dscm_netconf_hub_leaf.py::test_get_default_leaves_config + +# python3 -m pytest --log-level=DEBUG --log-cli-level=INFO --verbose \ +# device/tests/dscm/test_dscm_netconf_hub_leaf.py::test_get_and_remove_topology_context diff --git a/src/device/service/drivers/netconf_dscm/NetConfDriver.py b/src/device/service/drivers/netconf_dscm/NetConfDriver.py new file mode 100644 index 000000000..20fcab5f8 --- /dev/null +++ b/src/device/service/drivers/netconf_dscm/NetConfDriver.py @@ -0,0 +1,130 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 ast import Dict +from common.method_wrappers.Decorator import MetricsPool +from device.service.driver_api._Driver import _Driver +from jinja2 import Environment, FileSystemLoader +from typing import Any, List, Tuple, Union +import logging +import os +import subprocess + +DRIVER_NAME = 'dscm-netconf' +METRICS_POOL = MetricsPool('Device', 'Driver', labels={'driver': DRIVER_NAME}) +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.INFO) + +class NetConfDriver(_Driver): + def __init__(self, address : str, port : int, **settings) -> None: + super().__init__(DRIVER_NAME, address, port, **settings) + + def GetConfig(self, resources: List[str]) -> List[Tuple[str, Union[Any, None, Exception]]]: # pyright: ignore[reportIncompatibleMethodOverride] + results = [] + for resource_path in resources: + if not resource_path.startswith('/'): + raise ValueError(f"Invalid resource path: {resource_path}. Must start with '/'") + command = [ + "netconf-console2", + f"--host={self.address}", + f"--port={self.port}", + "--tcp", + "--get-config", + f"{resource_path}" + ] + LOGGER.info(f"Executing command: {' '.join(command)}") + try: + result = subprocess.run(command, capture_output=True, text=True, timeout=10) + if result.returncode == 0: + LOGGER.info(f"Get-config successful for {resource_path}") + # LOGGER.info(result.stdout) + results.append(result.stdout) + else: + MSG = 'Exception retrieving {:s}: {:s}' + LOGGER.exception(f"Get-config failed for {resource_path}: {result.stderr}") + results.append(Exception(MSG.format(resource_path, result.stderr))) + except Exception as e: + LOGGER.exception("Command timed out") + results.append(e) + return results + + def SetConfig(self, resources: List[Tuple[str, Any]]) -> List[Union[bool, Exception]]: + results = [] + for node, config in resources: + # rendered_config = self.populated_xml_template(node, config) + self.populated_xml_template(node, config) + command = [ + "netconf-console2", + f"--host={self.address}", + f"--port={self.port}", + "--tcp", + "--edit-config", + f"{node}.xml" # rendered_config + ] + LOGGER.info(f"Executing command: {' '.join(command)}") + try: + result = subprocess.run(command, capture_output=True, text=True, timeout=10) + LOGGER.info(f"Command output: {result.stdout}") + if result.returncode == 0: + LOGGER.info(f"Set-config successful for {node}") + results.append(True) + else: + MSG = 'Exception setting {:s}: {:s}' + LOGGER.exception(f"Set-config failed for {node}: {result.stderr}") + results.append(Exception(MSG.format(node, result.stderr))) + except Exception as e: + LOGGER.exception("Command timed out") + results.append(e) + return results + + + def populated_xml_template(self, node : str, config: Dict): + try: + # Get the directory of this file to locate the template + current_dir = os.path.dirname(os.path.abspath(__file__)) + template_dir = os.path.join(current_dir, 'templates') + # template_dir = 'templates/' + LOGGER.info(f"Template directory: {template_dir}") + + # Set up Jinja2 environment + env = Environment(loader=FileSystemLoader(template_dir)) + if node == 'T2.1': + LOGGER.info("Using hub template: edit_config_hub_template.xml") + # template = env.get_template('test_hub_template.xml') + template = env.get_template('edit_config_hub_template.xml') + elif node in ['T1.1', 'T1.2', 'T1.3']: + template = env.get_template('edit_config_leaf_template.xml') + else: + raise ValueError(f"Unknown node: {node}") + + # Render the template with config values + rendered_xml = template.render(**config) + + LOGGER.info(f"Rendered XML:\n{rendered_xml}") + # return rendered_xml + + # Write to file + output_file = f"{node}.xml" + with open(output_file, 'w') as f: + f.write(rendered_xml) + + LOGGER.info(f"XML template populated and saved to {output_file}") + return True + + except Exception as e: + LOGGER.exception(f"Failed to populate XML template: {e}") + # return False + + diff --git a/src/device/service/drivers/netconf_dscm/__init__.py b/src/device/service/drivers/netconf_dscm/__init__.py new file mode 100644 index 000000000..3ccc21c7d --- /dev/null +++ b/src/device/service/drivers/netconf_dscm/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/device/service/drivers/netconf_dscm/templates/edit_config_hub_template.xml b/src/device/service/drivers/netconf_dscm/templates/edit_config_hub_template.xml new file mode 100644 index 000000000..3ef82a186 --- /dev/null +++ b/src/device/service/drivers/netconf_dscm/templates/edit_config_hub_template.xml @@ -0,0 +1,31 @@ + + + {{name}} + + {% if operation is defined and operation != 'delete' %} + + {% if frequency is defined %}{{frequency}}{% endif %} + {% if target_output_power is defined %}{{target_output_power}}{% endif %} + {% if operational_mode is defined %}{{operational_mode}}{% endif %} + + {% if digital_sub_carriers_group is defined and digital_sub_carriers_group %} + {% for group in digital_sub_carriers_group %} + + {{group.digital_sub_carriers_group_id}} + + {% if group.digital_sub_carrier_id is defined and group.digital_sub_carrier_id %} + {% for sub_carrier in group.digital_sub_carrier_id %} + + {{sub_carrier.sub_carrier_id}} + {{sub_carrier.active}} + + {% endfor %} + {% endif %} + + {% endfor %} + {% endif %} + + {% endif %} + + + \ No newline at end of file diff --git a/src/device/service/drivers/netconf_dscm/templates/edit_config_leaf_template.xml b/src/device/service/drivers/netconf_dscm/templates/edit_config_leaf_template.xml new file mode 100644 index 000000000..3ef82a186 --- /dev/null +++ b/src/device/service/drivers/netconf_dscm/templates/edit_config_leaf_template.xml @@ -0,0 +1,31 @@ + + + {{name}} + + {% if operation is defined and operation != 'delete' %} + + {% if frequency is defined %}{{frequency}}{% endif %} + {% if target_output_power is defined %}{{target_output_power}}{% endif %} + {% if operational_mode is defined %}{{operational_mode}}{% endif %} + + {% if digital_sub_carriers_group is defined and digital_sub_carriers_group %} + {% for group in digital_sub_carriers_group %} + + {{group.digital_sub_carriers_group_id}} + + {% if group.digital_sub_carrier_id is defined and group.digital_sub_carrier_id %} + {% for sub_carrier in group.digital_sub_carrier_id %} + + {{sub_carrier.sub_carrier_id}} + {{sub_carrier.active}} + + {% endfor %} + {% endif %} + + {% endfor %} + {% endif %} + + {% endif %} + + + \ No newline at end of file diff --git a/src/device/service/drivers/netconf_dscm/templates/edit_dscm_hub.xml b/src/device/service/drivers/netconf_dscm/templates/edit_dscm_hub.xml new file mode 100644 index 000000000..21eb62ebe --- /dev/null +++ b/src/device/service/drivers/netconf_dscm/templates/edit_dscm_hub.xml @@ -0,0 +1,99 @@ + + + channel-1 + + + 195000000 + -3.0 + 1 + port-1 + 50.0 + + 1 + 4 + 100 + + 1 + true + + + 2 + true + + + 3 + true + + + 4 + true + + + + 2 + 4 + 100 + + 5 + true + + + 6 + true + + + 7 + true + + + 8 + true + 0.0 + + + + 3 + 4 + 100 + + 9 + true + + + 10 + true + + + 11 + true + + + 12 + true + + + + 4 + 4 + 100 + + 13 + true + + + 14 + true + + + 15 + true + + + 16 + true + + + + + + diff --git a/src/device/service/drivers/netconf_dscm/templates/edit_dscm_leaves.xml b/src/device/service/drivers/netconf_dscm/templates/edit_dscm_leaves.xml new file mode 100644 index 000000000..093b25b90 --- /dev/null +++ b/src/device/service/drivers/netconf_dscm/templates/edit_dscm_leaves.xml @@ -0,0 +1,101 @@ + + + channel-1 + + + 195006250 + -99.0 + 1 + port-1 + 50.0 + + 1 + 4 + 100 + + 1 + true + + + 2 + true + + + 3 + true + + + 4 + true + + + + + + + channel-3 + + + 195018750 + -99.0 + 1 + port-3 + 50.0 + + 1 + 4 + 100 + + 1 + true + + + 2 + true + + + 3 + true + + + 4 + true + + + + + + + channel-5 + + + 195031250 + -99.0 + 1 + port-5 + 50.0 + + 1 + 4 + 100 + + 1 + true + + + 2 + true + + + 3 + true + + + 4 + true + + + + + + diff --git a/src/device/service/drivers/netconf_dscm/templates/test_hub_template.xml b/src/device/service/drivers/netconf_dscm/templates/test_hub_template.xml new file mode 100644 index 000000000..19a8d2ea8 --- /dev/null +++ b/src/device/service/drivers/netconf_dscm/templates/test_hub_template.xml @@ -0,0 +1,39 @@ + + + {{ name }} + + {% if operation is defined and operation != 'delete' %} + + {% if frequency is defined %} + {{ frequency }} + {% endif %} + + {% if target_output_power is defined %} + {{ target_output_power }} + {% endif %} + + {% if operational_mode is defined %} + {{ operational_mode }} + {% endif %} + + {% if digital_sub_carriers_group is defined and digital_sub_carriers_group %} + {% for group in digital_sub_carriers_group %} + + {{ group.digital_sub_carriers_group_id }} + + {% if group.digital_sub_carrier_id is defined and group.digital_sub_carrier_id %} + {% for sub_carrier in group.digital_sub_carrier_id %} + + {{ sub_carrier.sub_carrier_id }} + {% if sub_carrier.active %}true{% else %}false{% endif %} + + {% endfor %} + {% endif %} + + {% endfor %} + {% endif %} + + {% endif %} + + + diff --git a/src/device/service/drivers/openconfig/templates/components/component/config/edit_config.xml b/src/device/service/drivers/openconfig/templates/components/component/config/edit_config.xml new file mode 100644 index 000000000..67ed5d1dd --- /dev/null +++ b/src/device/service/drivers/openconfig/templates/components/component/config/edit_config.xml @@ -0,0 +1,14 @@ + + + {{name}} + + {% if operation is defined and operation != 'delete' %} + + {% if frequency is defined %}{{frequency}}{% endif %} + {% if target_output_power is defined %}{{target_output_power}}{% endif %} + {% if operational_mode is defined %}{{operational_mode}}{% endif %} + + {% endif %} + + + diff --git a/src/device/service/drivers/openconfig/templates/components/component/get.xml b/src/device/service/drivers/openconfig/templates/components/component/get.xml new file mode 100644 index 000000000..aa25ed1e3 --- /dev/null +++ b/src/device/service/drivers/openconfig/templates/components/component/get.xml @@ -0,0 +1,3 @@ + + + diff --git a/src/device/service/drivers/openconfig/templates/components/component/optical_channel/get.xml b/src/device/service/drivers/openconfig/templates/components/component/optical_channel/get.xml new file mode 100644 index 000000000..89250f818 --- /dev/null +++ b/src/device/service/drivers/openconfig/templates/components/component/optical_channel/get.xml @@ -0,0 +1,11 @@ + + + {% if component_name %} + {{ component_name }} + {% endif %} + + + + + + diff --git a/src/device/tests/dscm/Fixtures.py b/src/device/tests/dscm/Fixtures.py new file mode 100644 index 000000000..458d0d786 --- /dev/null +++ b/src/device/tests/dscm/Fixtures.py @@ -0,0 +1,58 @@ +# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 pytest +import logging + +from context.client.ContextClient import ContextClient +from device.client.DeviceClient import DeviceClient +from service.client.ServiceClient import ServiceClient +from kpi_manager.client.KpiManagerClient import KpiManagerClient + + +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.DEBUG) + + +@pytest.fixture(scope='session') +def context_client(): + _client = ContextClient(host="10.152.183.127") + _client.connect() + LOGGER.info('Yielding Connected ContextClient...') + yield _client + _client.close() + +@pytest.fixture(scope='session') +def device_client(): + _client = DeviceClient(host="10.152.183.95") + _client.connect() + LOGGER.info('Yielding Connected DeviceClient...') + yield _client + _client.close() + +@pytest.fixture(scope='session') +def service_client(): + _client = ServiceClient(host="10.152.183.47") + _client.connect() + LOGGER.info('Yielding Connected DeviceClient...') + yield _client + _client.close() + +@pytest.fixture(scope='session') +def kpi_manager_client(): + _client = KpiManagerClient(host="10.152.183.118") + LOGGER.info('Yielding Connected KpiManagerClient...') + yield _client + _client.close() + LOGGER.info('Closed KpiManagerClient...') diff --git a/src/device/tests/dscm/__init__.py b/src/device/tests/dscm/__init__.py new file mode 100644 index 000000000..7363515f0 --- /dev/null +++ b/src/device/tests/dscm/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/device/tests/dscm/actual_hub.xml b/src/device/tests/dscm/actual_hub.xml new file mode 100644 index 000000000..5a71bf052 --- /dev/null +++ b/src/device/tests/dscm/actual_hub.xml @@ -0,0 +1,21 @@ + +1 +4 +100 + +1 +false + + +2 +false + + +3 +false + + +4 +false + + \ No newline at end of file diff --git a/src/device/tests/dscm/rendered_hub.xml b/src/device/tests/dscm/rendered_hub.xml new file mode 100644 index 000000000..415ee4744 --- /dev/null +++ b/src/device/tests/dscm/rendered_hub.xml @@ -0,0 +1,60 @@ + + + channel-1 + + + 195000000 + 0.0 + 9 + + 1 + + + 1 + True + + + + 2 + True + + + + 3 + True + + + + 4 + True + + + + + + 1 + + + 5 + True + + + + 6 + True + + + + 7 + True + + + + 8 + True + + + + + + \ No newline at end of file diff --git a/src/device/tests/dscm/test_dscm_netconf_hub_leaf.py b/src/device/tests/dscm/test_dscm_netconf_hub_leaf.py new file mode 100644 index 000000000..7c707a769 --- /dev/null +++ b/src/device/tests/dscm/test_dscm_netconf_hub_leaf.py @@ -0,0 +1,243 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 +from device.service.drivers.netconf_dscm.NetConfDriver import NetConfDriver + +logging.basicConfig(level=logging.DEBUG) +LOGGER = logging.getLogger(__name__) + +DEVICES = { + 'hub': {'address': '10.30.7.7', 'port': 2023, 'settings': {}}, + 'leaf': {'address': '10.30.7.8', 'port': 2023, 'settings': {}} + } + +@pytest.fixture(autouse=True) +def log_each(request): + LOGGER.info(f">>>>>> START {request.node.name} >>>>>>") + yield + LOGGER.info(f"<<<<<< END {request.node.name} <<<<<<") + +@pytest.fixture(scope='session') +def get_driver_hub() -> Tuple[NetConfDriver, None]: # pyright: ignore[reportInvalidTypeForm] + driver = NetConfDriver( + DEVICES['hub']['address'], DEVICES['hub']['port'], **(DEVICES['hub']['settings']) + ) + yield driver # pyright: ignore[reportReturnType] + time.sleep(1) + +@pytest.fixture(scope='session') +def get_driver_leaf() -> Tuple[NetConfDriver, None]: # pyright: ignore[reportInvalidTypeForm] + driver = NetConfDriver( + DEVICES['leaf']['address'], DEVICES['leaf']['port'], **(DEVICES['leaf']['settings']) + ) + yield driver # pyright: ignore[reportReturnType] + time.sleep(1) + + +# --- Directly Testing SBI +def test_get_default_hub_config(get_driver_hub) -> Dict: + data = { + "name": "channel-1", + "frequency": 195000000, + "operational_mode": 1, + "target_output_power": 0.0, + "operation" : "merge", + "digital_sub_carriers_group": [ + { + "digital_sub_carriers_group_id": 1, + "digital_sub_carrier_id": [ + { + "sub_carrier_id": 1, + "active": "true" + }, + { + "sub_carrier_id": 2, + "active": "true" + }, + { + "sub_carrier_id": 3, + "active": "true" + }, + { + "sub_carrier_id": 4, + "active": "true" + } + ] + }, + { + "digital_sub_carriers_group_id": 2, + "digital_sub_carrier_id": [ + { + "sub_carrier_id": 5, + "active": "true" + }, + { + "sub_carrier_id": 6, + "active": "true" + }, + { + "sub_carrier_id": 7, + "active": "true" + }, + { + "sub_carrier_id": 8, + "active": "true" + } + ] + } + ], + } + node = 'T2.1' + result_config = get_driver_hub.SetConfig([(node, data)]) + assert result_config is not None + +def test_get_default_leaves_config(get_driver_leaf) -> Dict: + data = { + "name" : "channel-1", # "channel-1", "channel-3", "channel-5" + "frequency" : 195006250, # "195006250", 195018750, 195031250 + "operational_mode" : 1, + "target_output_power": -99, # should be -99 + "operation" : "merge", + "digital_sub_carriers_group": [ + { + "digital_sub_carriers_group_id": 1, + "digital_sub_carrier_id": [ + { + "sub_carrier_id": 1, + "active": "false" # should be set to false + }, + { + "sub_carrier_id": 2, + "active": "false" + }, + { + "sub_carrier_id": 3, + "active": "false" + }, + { + "sub_carrier_id": 4, + "active": "false" + } + ] + } + ], + } + node = 'T1.1' + result_config = get_driver_leaf.SetConfig([(node, data)]) + assert result_config is not None + +# netconf-console2 --host=10.30.7.7 --port=2023 --tcp --get-config -x '/components/component[name="channel-1"]/optical-channel/state/input-power/instant' + +# def test_get_config(get_driver): +# path = '/components/component[name="channel-1"]/optical-channel/state/input-power/instant' +# result_config = get_driver.GetConfig([path]) +# assert result_config is not None +# LOGGER.info(f"GetConfig result: {result_config}") + +# netconf-console2 --host=10.30.7.7 --port=2023 --tcp --edit-config edit_dscm_hub.xml + +# def test_set_config_hub(get_driver_hub): +# data = { +# "name": "channel-1", +# "frequency": "195000000", +# "target_output_power": "-3.0", +# "operational_mode": "1", +# "operation": "merge", +# "digital_subcarriers_groups": [ +# { "group_id": 1, "digital-subcarrier-id": [{ "subcarrier-id": 1, "active": True}, ]}, +# { "group_id": 2, "digital-subcarrier-id": [{ "subcarrier-id": 2, "active": True}, ]}, +# { "group_id": 3, "digital-subcarrier-id": [{ "subcarrier-id": 3, "active": True}, ]}, +# { "group_id": 4, "digital-subcarrier-id": [{ "subcarrier-id": 4, "active": True}, ]}, +# ], +# } +# node = 'hub' +# result_config = get_driver_hub.SetConfig([(node, data)]) +# assert result_config is not None +# # LOGGER.info(f"SetConfig result: {result_config}") + +# def test_set_config_leaf(get_driver_leaf): +# data = { +# "operation": "merge", +# "channels": +# [ +# { +# "name": "channel-1", +# "frequency": "195006250", +# "target_output_power": "-99.0", +# "operational_mode": "1", +# "digital_subcarriers_groups": +# [{ "group_id": 1 }] +# }, +# { +# "name": "channel-3", +# "frequency": "195018750", +# "target_output_power": "-99.0", +# "operational_mode": "1", +# "digital_subcarriers_groups": +# [{ "group_id": 1 }] +# }, +# { +# "name": "channel-5", +# "frequency": "195031250", +# "target_output_power": "-99.0", +# "operational_mode": "1", +# "digital_subcarriers_groups": +# [{ "group_id": 1 }] +# } +# ] +# } +# node = 'leaf' +# result_config = get_driver_leaf.SetConfig([(node, data)]) +# assert result_config is not None +# # LOGGER.info(f"SetConfig result: {result_config}") + + +# def test_dscm_netconf_hub(drivers): +# path = '/components/component[name="channel-1"]/config' +# data = json.dumps( +# { "name": "channel-1", +# "frequency": "195000000", +# "target_output_power": "-3.0", +# "operational_mode": "1", +# } +# ) +# config_to_set = [(path, data)] +# result_config = drivers['DSCM1'].SetConfig(config_to_set) +# assert result_config is not None +# LOGGER.info(f"SetConfig result: {result_config}") + + + +from common.tools.context_queries.Topology import get_topology +from common.proto.context_pb2 import TopologyId, ContextId +from .Fixtures import context_client +def test_get_and_remove_topology_context(context_client): + response = get_topology(context_client = context_client, topology_uuid = "admin", context_uuid = "admin") + LOGGER.info(f"Topology: {response}") + assert response is not None + # create context_id and topology_id from response + context_id = ContextId() + context_id = response.topology_id.context_id + topology_id = TopologyId() + topology_id = response.topology_id + # Remove Topology + topology_id.context_id.CopyFrom(context_id) + response = context_client.RemoveTopology(topology_id) + LOGGER.info(f"Topology removed Sucessfully") + # Remove Context + response = context_client.RemoveContext(context_id) + LOGGER.info(f"Context removed Sucessfully") -- GitLab From 283dee2252bad0af76ee983d7c32d7d0b069f30b Mon Sep 17 00:00:00 2001 From: mansoca Date: Tue, 21 Oct 2025 11:29:59 +0000 Subject: [PATCH 005/111] Add DSCM NetConf Driver and associated test scripts (2nd commit) - Implemented NetConfDriver for managing device configurations via NETCONF protocol. - Created run_tests_locally-device-netconf-dscm.sh script for local testing of driver functionalities. - Added Jinja2 templates for generating configuration XML for hub and leaf devices. - Developed test cases in test_dscm_netconf_hub_leaf.py to validate configuration retrieval and setting for hub and leaf devices. - Added example XML files for expected configurations and actual results for testing purposes. --- src/device/requirements.in | 1 + src/device/service/drivers/__init__.py | 11 +++++++ .../drivers/openconfig/templates/Namespace.py | 32 ++++++++++--------- 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/src/device/requirements.in b/src/device/requirements.in index 10139bc2c..0a75ac159 100644 --- a/src/device/requirements.in +++ b/src/device/requirements.in @@ -27,6 +27,7 @@ Jinja2==3.0.3 libyang==2.8.4 macaddress ncclient==0.6.15 +netconf-console2==3.0.1 numpy<2.0.0 p4runtime==1.3.0 pandas==1.5.* diff --git a/src/device/service/drivers/__init__.py b/src/device/service/drivers/__init__.py index 788b09edd..c8058f5e3 100644 --- a/src/device/service/drivers/__init__.py +++ b/src/device/service/drivers/__init__.py @@ -252,3 +252,14 @@ if LOAD_ALL_DEVICE_DRIVERS: FilterFieldEnum.DRIVER : DeviceDriverEnum.DEVICEDRIVER_QKD, } ])) + +if LOAD_ALL_DEVICE_DRIVERS: + from .netconf_dscm.NetConfDriver import NetConfDriver # pylint: disable=wrong-import-position + DRIVERS.append( + (NetConfDriver, [ + { + # Real DSCM, specifying NetConf Driver => use NetConfDriver + FilterFieldEnum.DEVICE_TYPE: DeviceTypeEnum.DSCM_NODE, + FilterFieldEnum.DRIVER : DeviceDriverEnum.DRVICEDRIVER_NETCONF_DSCM, + } + ])) diff --git a/src/device/service/drivers/openconfig/templates/Namespace.py b/src/device/service/drivers/openconfig/templates/Namespace.py index 4604481bb..9455ed3b3 100644 --- a/src/device/service/drivers/openconfig/templates/Namespace.py +++ b/src/device/service/drivers/openconfig/templates/Namespace.py @@ -13,22 +13,23 @@ # limitations under the License. -NAMESPACE_NETCONF = 'urn:ietf:params:xml:ns:netconf:base:1.0' +NAMESPACE_NETCONF = 'urn:ietf:params:xml:ns:netconf:base:1.0' -NAMESPACE_ACL = 'http://openconfig.net/yang/acl' -NAMESPACE_BGP_POLICY = 'http://openconfig.net/yang/bgp-policy' -NAMESPACE_INTERFACES = 'http://openconfig.net/yang/interfaces' -NAMESPACE_INTERFACES_IP = 'http://openconfig.net/yang/interfaces/ip' -NAMESPACE_NETWORK_INSTANCE = 'http://openconfig.net/yang/network-instance' -NAMESPACE_NETWORK_INSTANCE_TYPES = 'http://openconfig.net/yang/network-instance-types' -NAMESPACE_OPENCONFIG_TYPES = 'http://openconfig.net/yang/openconfig-types' -NAMESPACE_PLATFORM = 'http://openconfig.net/yang/platform' -NAMESPACE_PLATFORM_PORT = 'http://openconfig.net/yang/platform/port' -NAMESPACE_POLICY_TYPES = 'http://openconfig.net/yang/policy-types' -NAMESPACE_POLICY_TYPES_2 = 'http://openconfig.net/yang/policy_types' -NAMESPACE_ROUTING_POLICY = 'http://openconfig.net/yang/routing-policy' -NAMESPACE_VLAN = 'http://openconfig.net/yang/vlan' -NAMESPACE_PLATFORM_TRANSCEIVER = 'http://openconfig.net/yang/platform/transceiver' +NAMESPACE_ACL = 'http://openconfig.net/yang/acl' +NAMESPACE_BGP_POLICY = 'http://openconfig.net/yang/bgp-policy' +NAMESPACE_INTERFACES = 'http://openconfig.net/yang/interfaces' +NAMESPACE_INTERFACES_IP = 'http://openconfig.net/yang/interfaces/ip' +NAMESPACE_NETWORK_INSTANCE = 'http://openconfig.net/yang/network-instance' +NAMESPACE_NETWORK_INSTANCE_TYPES = 'http://openconfig.net/yang/network-instance-types' +NAMESPACE_OPENCONFIG_TYPES = 'http://openconfig.net/yang/openconfig-types' +NAMESPACE_PLATFORM = 'http://openconfig.net/yang/platform' +NAMESPACE_PLATFORM_PORT = 'http://openconfig.net/yang/platform/port' +NAMESPACE_POLICY_TYPES = 'http://openconfig.net/yang/policy-types' +NAMESPACE_POLICY_TYPES_2 = 'http://openconfig.net/yang/policy_types' +NAMESPACE_ROUTING_POLICY = 'http://openconfig.net/yang/routing-policy' +NAMESPACE_VLAN = 'http://openconfig.net/yang/vlan' +NAMESPACE_PLATFORM_TRANSCEIVER = 'http://openconfig.net/yang/platform/transceiver' +NAMESPACE_TERMINAL_DEVICE_DIGITAL_SUBCARRIERS = 'http://openconfig.net/yang/terminal-device-digital-subcarriers' NAMESPACES = { 'nc' : NAMESPACE_NETCONF, @@ -46,4 +47,5 @@ NAMESPACES = { 'ocrp' : NAMESPACE_ROUTING_POLICY, 'ocv' : NAMESPACE_VLAN, 'ocptr': NAMESPACE_PLATFORM_TRANSCEIVER, + 'octds': NAMESPACE_TERMINAL_DEVICE_DIGITAL_SUBCARRIERS, } -- GitLab From 6d4f771791b29f16a463aed3d9d934f1d661bfb3 Mon Sep 17 00:00:00 2001 From: mansoca Date: Tue, 21 Oct 2025 11:32:58 +0000 Subject: [PATCH 006/111] fix: add missing newline at end of XML files --- .../drivers/netconf_dscm/templates/edit_config_hub_template.xml | 2 +- .../netconf_dscm/templates/edit_config_leaf_template.xml | 2 +- src/device/tests/dscm/actual_hub.xml | 2 +- src/device/tests/dscm/rendered_hub.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/device/service/drivers/netconf_dscm/templates/edit_config_hub_template.xml b/src/device/service/drivers/netconf_dscm/templates/edit_config_hub_template.xml index 3ef82a186..4149bccda 100644 --- a/src/device/service/drivers/netconf_dscm/templates/edit_config_hub_template.xml +++ b/src/device/service/drivers/netconf_dscm/templates/edit_config_hub_template.xml @@ -28,4 +28,4 @@ {% endif %} - \ No newline at end of file + diff --git a/src/device/service/drivers/netconf_dscm/templates/edit_config_leaf_template.xml b/src/device/service/drivers/netconf_dscm/templates/edit_config_leaf_template.xml index 3ef82a186..4149bccda 100644 --- a/src/device/service/drivers/netconf_dscm/templates/edit_config_leaf_template.xml +++ b/src/device/service/drivers/netconf_dscm/templates/edit_config_leaf_template.xml @@ -28,4 +28,4 @@ {% endif %} - \ No newline at end of file + diff --git a/src/device/tests/dscm/actual_hub.xml b/src/device/tests/dscm/actual_hub.xml index 5a71bf052..32067b11e 100644 --- a/src/device/tests/dscm/actual_hub.xml +++ b/src/device/tests/dscm/actual_hub.xml @@ -18,4 +18,4 @@ 4 false - \ No newline at end of file + diff --git a/src/device/tests/dscm/rendered_hub.xml b/src/device/tests/dscm/rendered_hub.xml index 415ee4744..14a9d37d9 100644 --- a/src/device/tests/dscm/rendered_hub.xml +++ b/src/device/tests/dscm/rendered_hub.xml @@ -57,4 +57,4 @@ - \ No newline at end of file + -- GitLab From 49245ae540dd86c42e56d66c5827385890b5569b Mon Sep 17 00:00:00 2001 From: mansoca Date: Tue, 21 Oct 2025 11:49:08 +0000 Subject: [PATCH 007/111] fix: update copyright headers and clean up test script --- scripts/run_tests_locally-nbi-dscm.sh | 4 ---- .../rest_server/nbi_plugins/dscm_oc/__init__.py | 13 +++++++++++++ .../nbi_plugins/dscm_oc/datamodels/__init__.py | 14 ++++++++++++++ .../dscm_oc/datamodels/device_hub.json | 2 +- .../rest_server/nbi_plugins/dscm_oc/datastore.py | 16 +++++++++++++++- .../rest_server/nbi_plugins/dscm_oc/dscm.py | 15 +++++++++++++++ .../nbi_plugins/dscm_oc/enforce_header.py | 16 +++++++++++++++- .../rest_server/nbi_plugins/dscm_oc/error.py | 16 +++++++++++++++- .../nbi_plugins/dscm_oc/path_resolver.py | 15 +++++++++++++++ .../rest_server/nbi_plugins/dscm_oc/routes.py | 14 ++++++++++++++ src/nbi/tests/test_dscm_restconf.py | 14 ++++++++++++++ src/nbi/tests/test_l3vpn_ecoc25.py | 16 ++++++++++++++-- 12 files changed, 145 insertions(+), 10 deletions(-) diff --git a/scripts/run_tests_locally-nbi-dscm.sh b/scripts/run_tests_locally-nbi-dscm.sh index baa6d51bb..634939cfd 100755 --- a/scripts/run_tests_locally-nbi-dscm.sh +++ b/scripts/run_tests_locally-nbi-dscm.sh @@ -3,10 +3,6 @@ PROJECTDIR=`pwd` cd $PROJECTDIR/src -# RCFILE=$PROJECTDIR/coverage/.coveragerc - -# export KFK_SERVER_ADDRESS='127.0.0.1:9092' python3 -m pytest --log-level=INFO --log-cli-level=INFO --verbose \ nbi/tests/test_dscm_restconf.py::test_patch_optical_channel_frequency - \ No newline at end of file diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/__init__.py b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/__init__.py index 8285a6342..e72bb3f0f 100644 --- a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/__init__.py +++ b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/__init__.py @@ -1,3 +1,16 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 .routes import blueprint diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/__init__.py b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/__init__.py index e69de29bb..3ccc21c7d 100644 --- a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/__init__.py +++ b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/device_hub.json b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/device_hub.json index 9e26dfeeb..0967ef424 100644 --- a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/device_hub.json +++ b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/device_hub.json @@ -1 +1 @@ -{} \ No newline at end of file +{} diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datastore.py b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datastore.py index ba084a095..e6a704234 100644 --- a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datastore.py +++ b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datastore.py @@ -1,4 +1,18 @@ -# src/nbi/service/testconf_dscm/datastore.py +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 import os import threading diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/dscm.py b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/dscm.py index 88c2d1b42..80c998d08 100644 --- a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/dscm.py +++ b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/dscm.py @@ -1,3 +1,18 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 from typing import Dict diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/enforce_header.py b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/enforce_header.py index f1395663b..65e9172cb 100644 --- a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/enforce_header.py +++ b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/enforce_header.py @@ -1,4 +1,18 @@ -# src/nbi/service/testconf_dscm/enforce_header.py +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 functools import wraps from flask import request from .error import yang_error diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/error.py b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/error.py index 04ec6b7b7..d438a854f 100644 --- a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/error.py +++ b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/error.py @@ -1,3 +1,17 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 from flask import Response @@ -14,4 +28,4 @@ def yang_error(err_dict, status=400): def _bad_request(msg, path=None): return yang_error({"error-type": "protocol", "error-tag": "operation-failed", - "error-message": msg, **({"error-path": path} if path else {})}, status=400) \ No newline at end of file + "error-message": msg, **({"error-path": path} if path else {})}, status=400) diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/path_resolver.py b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/path_resolver.py index 55b65221e..bf5b6f7c1 100644 --- a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/path_resolver.py +++ b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/path_resolver.py @@ -1,3 +1,18 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 re class RestconfPath: diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/routes.py b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/routes.py index c955ae85b..cd3a600ca 100644 --- a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/routes.py +++ b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/routes.py @@ -1,3 +1,17 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 import Blueprint, request, Response, abort import logging from .datastore import Store diff --git a/src/nbi/tests/test_dscm_restconf.py b/src/nbi/tests/test_dscm_restconf.py index ea873b860..d306c412e 100644 --- a/src/nbi/tests/test_dscm_restconf.py +++ b/src/nbi/tests/test_dscm_restconf.py @@ -1,3 +1,17 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 nbi.service.rest_server import RestServer from typing import Dict diff --git a/src/nbi/tests/test_l3vpn_ecoc25.py b/src/nbi/tests/test_l3vpn_ecoc25.py index fec3819b1..5a3af5810 100644 --- a/src/nbi/tests/test_l3vpn_ecoc25.py +++ b/src/nbi/tests/test_l3vpn_ecoc25.py @@ -1,3 +1,17 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 nbi.service.rest_server import RestServer from typing import Dict @@ -44,5 +58,3 @@ def test_post_service(nbi_service_rest: RestServer): LOGGER.info(response.status_code) LOGGER.info("--------------") LOGGER.info(response.text) - - \ No newline at end of file -- GitLab From e403d0b26133ab72222ff9974a0f358bc3f2c4fa Mon Sep 17 00:00:00 2001 From: armingol Date: Thu, 23 Oct 2025 12:17:13 +0000 Subject: [PATCH 008/111] Refactor TAPI LSP and IPoWDM handling: update proto definitions, enhance request processing, and streamline service interactions --- proto/context.proto | 2 +- proto/tapi_lsp.proto | 8 +- .../drivers/ietf_l3vpn/IetfL3VpnDriver.py | 10 +- .../drivers/ietf_l3vpn/templates/tools.py | 104 +++++++++++++++++- src/nbi/service/e2e_services/Resources.py | 30 ++++- src/nbi/service/ietf_network/YangHandler.py | 12 +- .../service/service_handlers/__init__.py | 2 +- .../tapi_lsp/Tapi_LSPServiceHandler.py | 2 +- tfs/lib64 | 1 + 9 files changed, 158 insertions(+), 13 deletions(-) create mode 120000 tfs/lib64 diff --git a/proto/context.proto b/proto/context.proto index 3ffdd2815..e8f6d0a13 100644 --- a/proto/context.proto +++ b/proto/context.proto @@ -555,7 +555,7 @@ message ConfigRule_IPOWDM { message ConfigRule_TAPI_LSP { EndPointId endpoint_id = 1; - tapi_lsp.TapiLspRuleSet rule_set = 2; + repeated tapi_lsp.TapiLspRuleSet rule_set = 2; } message ConfigRule { diff --git a/proto/tapi_lsp.proto b/proto/tapi_lsp.proto index 48d8537b3..9874302c0 100644 --- a/proto/tapi_lsp.proto +++ b/proto/tapi_lsp.proto @@ -16,8 +16,8 @@ syntax = "proto3"; package tapi_lsp; message TapiLspRuleSet { - string src = 1; - string dst = 2; + string input_sip = 1; + string output_sip = 2; string uuid = 3; string bw = 4; string tenant_uuid = 5; @@ -29,4 +29,8 @@ message TapiLspRuleSet { string granularity = 11; string grid_type = 12; string direction = 13; + string capacity_unit = 14; + string capacity_value = 15; + string route_objective_function = 16; + string url = 17; } \ No newline at end of file diff --git a/src/device/service/drivers/ietf_l3vpn/IetfL3VpnDriver.py b/src/device/service/drivers/ietf_l3vpn/IetfL3VpnDriver.py index 419fe319f..22cc5f051 100644 --- a/src/device/service/drivers/ietf_l3vpn/IetfL3VpnDriver.py +++ b/src/device/service/drivers/ietf_l3vpn/IetfL3VpnDriver.py @@ -23,7 +23,7 @@ from device.service.driver_api.ImportTopologyEnum import ImportTopologyEnum, get from .Constants import SPECIAL_RESOURCE_MAPPINGS from .TfsApiClient import TfsApiClient from .Tools import compose_resource_endpoint -from .templates.tools import create_request +from .templates.tools import create_request, tapi_tequest LOGGER = logging.getLogger(__name__) @@ -187,6 +187,14 @@ class IetfL3VpnDriver(_Driver): except Exception as e: MSG = 'Invalid resource_value type: expected dict, got {:s}' results.append((resource, e)) + elif "tapi_lsp" in str(resources): + for resource in resources: + try: + tapi_tequest(resource) + results.append((resource, True)) + except Exception as e: + MSG = "Invalid resource_value type: expected dict, got {:s}" + results.append((resource, e)) else: for resource in resources: resource_key, resource_value = resource diff --git a/src/device/service/drivers/ietf_l3vpn/templates/tools.py b/src/device/service/drivers/ietf_l3vpn/templates/tools.py index 90e853eba..36b09e4d1 100644 --- a/src/device/service/drivers/ietf_l3vpn/templates/tools.py +++ b/src/device/service/drivers/ietf_l3vpn/templates/tools.py @@ -13,7 +13,9 @@ # limitations under the License. import json import logging +import os import requests +from concurrent.futures import ThreadPoolExecutor LOGGER = logging.getLogger(__name__) @@ -22,6 +24,8 @@ HEADERS = { "Content-Type": "application/yang-data+json" } +executor = ThreadPoolExecutor() + site_template = { "site-id": "", "devices": { @@ -124,9 +128,9 @@ def create_request(resource_value): 'ip_mask': node["ip_mask"], 'vlan_id': node["vlan_id"] }) - + sites_input = src + dst - + components = resource_value[1]['rule_set']['transceiver']['components'] for i, device in enumerate(components): name = sites_input[i]['uuid'] @@ -153,3 +157,99 @@ def patch_optical_channel_frequency(data, DEVICE_ID): headers=HEADERS) assert response.status_code == 200 return response + +def process_uuid(service, url): + headers = { + "Content-Type": "application/json", + "Accept": "application/json" + } + + LOGGER.info(f"Processing service {service} to URL: {url}") + try: + response = 200 + # requests.post(url = url, json=service, headers=headers, timeout=300) + LOGGER.info("Response Status code: %s", response) + except requests.exceptions.RequestException as e: + LOGGER.info(f"ERROR equest to {service} failed: {e}") + +def tapi_tequest(resource_value): + + services, urls = build_tapi_connectivity(resource_value) + for service, url in zip(services, urls): + LOGGER.info(f"Services to be processed: {json.dumps(service, indent=2)}") + LOGGER.info(f"URL to be used: {url}") + + executor.submit(process_uuid, service, url) + +def build_tapi_connectivity(service_data): + logging.info(f"Building TAPI connectivity for services data: {service_data}") + outputs = [] + urls = [] + rules_set = service_data[1]["rule_set"] + for rule_set in rules_set: + direction = rule_set["direction"] + layer_name = rule_set["layer_protocol_name"] + layer_qualifier = rule_set["layer_protocol_qualifier"] + urls.append(rule_set["url"]) + cs = { + "uuid": rule_set["tenant_uuid"], + "connectivity-direction": direction, + "layer-protocol-name": layer_name, + "layer-protocol-qualifier": layer_qualifier, + "end-point": [] + } + + endpoints = [] + if direction == "UNIDIRECTIONAL": + endpoints.append({ + "layer-protocol-name": layer_name, + "layer-protocol-qualifier": layer_qualifier, + "service-interface-point": {"service-interface-point-uuid": rule_set["src"]}, + "direction:": "INPUT", + "local-id": rule_set["src"] + }) + endpoints.append({ + "layer-protocol-name": layer_name, + "layer-protocol-qualifier": layer_qualifier, + "service-interface-point": {"service-interface-point-uuid": rule_set["dst"]}, + "direction:": "OUTPUT", + "local-id": rule_set["dst"] + }) + else: + for point in [rule_set["src"], rule_set["dst"]]: + ep = { + "layer-protocol-name": layer_name, + "layer-protocol-qualifier": layer_qualifier, + "service-interface-point": {"service-interface-point-uuid": point}, + "direction:": "BIDIRECTIONAL", + "local-id": point + } + if rule_set.get("lower_frequency_mhz") != "NONE": + ep["tapi-photonic-media:media-channel-connectivity-service-end-point-spec"] = { + "mc-config": { + "spectrum": { + "frequency-constraint": { + "adjustment-granularity": rule_set.get("granularity", "NONE"), + "grid-type": rule_set.get("grid_type", "NONE") + }, + "lower-frequency": rule_set["lower_frequency_mhz"], + "upper-frequency": rule_set["upper_frequency_mhz"] + } + } + } + endpoints.append(ep) + cs["end-point"] = endpoints + + route_obj = rule_set.get("route_objective_function", "UNSPECIFIED") + cs["route-objective-function"] = route_obj if route_obj != "NONE" else "10000" + capacity = rule_set.get("capacity", "NONE") + if capacity != "NONE": + parts = capacity.split("-") + value = parts[0] + unit = parts[1] if len(parts) > 1 else "" + cs["requested-capacity"] = { + "total-size": {"value": value, "unit": unit} + } + outputs.append({"tapi-connectivity:connectivity-service": [cs]}) + return outputs, urls + diff --git a/src/nbi/service/e2e_services/Resources.py b/src/nbi/service/e2e_services/Resources.py index 6dff5243c..36eefaec3 100644 --- a/src/nbi/service/e2e_services/Resources.py +++ b/src/nbi/service/e2e_services/Resources.py @@ -20,6 +20,9 @@ from flask_restful import Resource from common.Constants import DEFAULT_CONTEXT_NAME from service.client.ServiceClient import ServiceClient from .Tools import grpc_service_id +from concurrent.futures import ThreadPoolExecutor +import requests +import threading LOGGER = logging.getLogger(__name__) @@ -29,6 +32,10 @@ HEADERS = { "Content-Type": "application/yang-data+json" } +headers = { + "Content-Type": "application/json", + "Expect": "" + } class E2EInfoDelete(Resource): def __init__(self): super().__init__() @@ -54,11 +61,22 @@ class E2EInfoDelete(Resource): if name == "T1.1":device["frequency"]= 195006250 if name == "T1.2":device["frequency"]= 195018750 if name == "T1.3":device["frequency"]= 195031250 - + LOGGER.debug(f"NODE DATA: \n{name}:{device}") response = test_patch_optical_channel_frequency(device, name) LOGGER.debug(f"RESPONSE :\n {response}") + elif 'tapi_lsp' in allocationId: + service_id = str(allocationId.split('=')[1]) + service_id_list = [s.strip() for s in service_id.split(',')] + service_id = service_id_list[0] + + LOGGER.info("Service ID list: %s", service_id_list) + executor = ThreadPoolExecutor(max_workers=len(service_id_list)) + for key in service_id_list: + executor.submit(delete_slice, key, headers) + + threading.Thread(target=executor.shutdown, kwargs={'wait': True}).start() else: LOGGER.error("Unknown service type for allocationId: %s", allocationId) return { @@ -74,6 +92,16 @@ class E2EInfoDelete(Resource): 'allocationId': allocationId, }, 200 +def delete_slice(key, headers): + url_delete_slice = f'http://172.24.36.54:4900/restconf/data/tapi-common:context/tapi-connectivity:connectivity-context/connectivity-service={key}' + try: + # response = requests.delete(url=url_delete_slice, headers=headers, timeout=300) + LOGGER.info("Key: %s", key) + # LOGGER.info("Response Status code: %s", response.status_code) + # LOGGER.info("Response Text: %s", response.text) + except requests.exceptions.RequestException as e: + LOGGER.info(f"ERROR request to delete slice {key} failed: {e}") + def test_patch_optical_channel_frequency(data, DEVICE_ID): """Test PATCH to update optical channel frequency.""" # Use simple path with / and encode manually for component name diff --git a/src/nbi/service/ietf_network/YangHandler.py b/src/nbi/service/ietf_network/YangHandler.py index 3ef718a64..bb1998429 100644 --- a/src/nbi/service/ietf_network/YangHandler.py +++ b/src/nbi/service/ietf_network/YangHandler.py @@ -38,20 +38,24 @@ class YangHandler: network = networks.create_path(f'network[network-id="{te_topology_name}"]') network.create_path('network-id', te_topology_name) - network_types = network.create_path('network-types') - network_types.create_path('ietf-l3-unicast-topology:l3-unicast-topology') + network_types = network.create_path('network-types') + network_types.create_path('ietf-l3-unicast-topology:l3-unicast-topology') name_mappings = NameMappings() - for device in topology_details.devices: + for device in topology_details.devices: + if device.name=="TFS-OPTICAL" or device.name=="TFS-PACKET": + continue self.compose_node(device, name_mappings, network) for link in topology_details.links: + if "TFS" in link.name: + continue self.compose_link(link, name_mappings, network) return json.loads(networks.print_mem('json')) - def compose_node(self, dev: Device, name_mappings: NameMappings, network: Any) -> None: + def compose_node(self, dev: Device, name_mappings: NameMappings, network: Any) -> None: device_name = dev.name name_mappings.store_device_name(dev) diff --git a/src/service/service/service_handlers/__init__.py b/src/service/service/service_handlers/__init__.py index 31bca68e9..3a44fc9d3 100644 --- a/src/service/service/service_handlers/__init__.py +++ b/src/service/service/service_handlers/__init__.py @@ -190,7 +190,7 @@ SERVICE_HANDLERS = [ (Tapi_LSPServiceHandler, [ { FilterFieldEnum.SERVICE_TYPE : ServiceTypeEnum.SERVICETYPE_TAPI_LSP, - FilterFieldEnum.DEVICE_DRIVER : [DeviceDriverEnum.DEVICEDRIVER_OPTICAL_TFS], + FilterFieldEnum.DEVICE_DRIVER : [DeviceDriverEnum.DEVICEDRIVER_IETF_L3VPN], } ]) ] diff --git a/src/service/service/service_handlers/tapi_lsp/Tapi_LSPServiceHandler.py b/src/service/service/service_handlers/tapi_lsp/Tapi_LSPServiceHandler.py index 0697001ef..b0a5ef8a3 100644 --- a/src/service/service/service_handlers/tapi_lsp/Tapi_LSPServiceHandler.py +++ b/src/service/service/service_handlers/tapi_lsp/Tapi_LSPServiceHandler.py @@ -68,7 +68,7 @@ class Tapi_LSPServiceHandler(_ServiceHandler): endpoint_tapi_lsp = self.__settings_handler.get_endpoint_tapi_lsp(device_obj, endpoint_obj) for _, endpoint in endpoint_tapi_lsp: LOGGER.debug("[SetEndpoint] Found endpoint: %s", endpoint) - if endpoint.endpoint_id.device_id.device_uuid.uuid != "TFS-OPTICAL":continue + if endpoint.endpoint_id.device_id.device_uuid.uuid != "TFS-PACKET":continue LOGGER.debug("[SetEndpoint] endpoint_ipowdm: %s", endpoint_tapi_lsp) diff --git a/tfs/lib64 b/tfs/lib64 new file mode 120000 index 000000000..7951405f8 --- /dev/null +++ b/tfs/lib64 @@ -0,0 +1 @@ +lib \ No newline at end of file -- GitLab From 9cd46b0d6a4e9c747df778a2828ecf672f5ebf5d Mon Sep 17 00:00:00 2001 From: armingol Date: Thu, 23 Oct 2025 12:53:47 +0000 Subject: [PATCH 009/111] Update proto file license information, refactor DeviceTypes and ServiceTypes, and clean up unused settings in ComposeConfigRules --- proto/ipowdm.proto | 14 ++++++++++++++ src/common/DeviceTypes.py | 1 - src/common/tools/object_factory/Service.py | 2 +- .../service/database/models/ConfigRuleModel.py | 8 ++++---- .../service/algorithms/tools/ComposeConfigRules.py | 11 +---------- .../service/algorithms/tools/ServiceTypes.py | 1 - tfs/lib64 | 1 - 7 files changed, 20 insertions(+), 18 deletions(-) delete mode 120000 tfs/lib64 diff --git a/proto/ipowdm.proto b/proto/ipowdm.proto index 0f0a1f601..b3f101ae6 100644 --- a/proto/ipowdm.proto +++ b/proto/ipowdm.proto @@ -1,3 +1,17 @@ +// Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 ipowdm; diff --git a/src/common/DeviceTypes.py b/src/common/DeviceTypes.py index 5ee0d9104..1be108553 100644 --- a/src/common/DeviceTypes.py +++ b/src/common/DeviceTypes.py @@ -61,7 +61,6 @@ class DeviceTypeEnum(Enum): OPEN_ROADM = 'openroadm' MORPHEUS = 'morpheus' OPENFLOW_RYU_CONTROLLER = 'openflow-ryu-controller' - IPOWDM_ROUTER = 'ipowdm-router' # ETSI TeraFlowSDN controller TERAFLOWSDN_CONTROLLER = 'teraflowsdn' diff --git a/src/common/tools/object_factory/Service.py b/src/common/tools/object_factory/Service.py index 4c879b781..d4e01b65f 100644 --- a/src/common/tools/object_factory/Service.py +++ b/src/common/tools/object_factory/Service.py @@ -122,4 +122,4 @@ def json_service_tapi_lsp_planned( return json_service( service_uuid, ServiceTypeEnum.SERVICETYPE_TAPI_LSP, context_id=json_context_id(context_uuid), status=ServiceStatusEnum.SERVICESTATUS_PLANNED, endpoint_ids=endpoint_ids, constraints=constraints, - config_rules=config_rules) \ No newline at end of file + config_rules=config_rules) diff --git a/src/context/service/database/models/ConfigRuleModel.py b/src/context/service/database/models/ConfigRuleModel.py index aafdd946b..fdc6d6f64 100644 --- a/src/context/service/database/models/ConfigRuleModel.py +++ b/src/context/service/database/models/ConfigRuleModel.py @@ -21,10 +21,10 @@ from ._Base import _Base # Enum values should match name of field in ConfigRule message class ConfigRuleKindEnum(enum.Enum): - CUSTOM = 'custom' - ACL = 'acl' - IP_LINK = 'ip_link' - IPOWDM = 'ipowdm' + CUSTOM = 'custom' + ACL = 'acl' + IP_LINK = 'ip_link' + IPOWDM = 'ipowdm' TAPI_LSP = 'tapi_lsp' class DeviceConfigRuleModel(_Base): diff --git a/src/pathcomp/frontend/service/algorithms/tools/ComposeConfigRules.py b/src/pathcomp/frontend/service/algorithms/tools/ComposeConfigRules.py index 754aec874..7553341e8 100644 --- a/src/pathcomp/frontend/service/algorithms/tools/ComposeConfigRules.py +++ b/src/pathcomp/frontend/service/algorithms/tools/ComposeConfigRules.py @@ -54,15 +54,6 @@ TAPI_SETTINGS_FIELD_DEFAULTS = { 'direction' : 'UNIDIRECTIONAL', } -TAPI_LSP_SETINGS_FIELD_DEFAULTS = { - 'lsp_type' : 'TAPI_LSP_TYPE_UNI', - 'lsp_direction' : 'TAPI_LSP_DIRECTION_UNI', - 'lsp_bandwidth' : 50.0, - 'lsp_bandwidth_unit': 'GHz', - 'lsp_layer_protocol_name': 'PHOTONIC_MEDIA', - 'lsp_layer_protocol_qualifier': 'tapi-photonic-media:PHOTONIC_LAYER_QUALIFIER_NMC', -} - IPLINK_SETTINGS_FIELD_DEFAULTS = { 'mtu' : 1450, } @@ -250,7 +241,7 @@ def compose_ipowdm_config_rules(main_service_config_rules : List, subservice_con compose_config_rules(main_service_config_rules, subservice_config_rules, rule_name, defaults) def compose_tapi_lsp_config_rules(main_service_config_rules : List, subservice_config_rules : List) -> None: - CONFIG_RULES: List[Tuple[str, dict]] = [(SETTINGS_RULE_NAME, TAPI_LSP_SETINGS_FIELD_DEFAULTS)] + CONFIG_RULES: List[Tuple[str, dict]] = [(SETTINGS_RULE_NAME, TAPI_SETTINGS_FIELD_DEFAULTS)] for rule_name, defaults in CONFIG_RULES: compose_config_rules(main_service_config_rules, subservice_config_rules, rule_name, defaults) diff --git a/src/pathcomp/frontend/service/algorithms/tools/ServiceTypes.py b/src/pathcomp/frontend/service/algorithms/tools/ServiceTypes.py index 7726ad584..405b18604 100644 --- a/src/pathcomp/frontend/service/algorithms/tools/ServiceTypes.py +++ b/src/pathcomp/frontend/service/algorithms/tools/ServiceTypes.py @@ -27,7 +27,6 @@ PACKET_DEVICE_TYPES = { DeviceTypeEnum.PACKET_POP, DeviceTypeEnum.PACKET_ROUTER, DeviceTypeEnum.EMULATED_PACKET_ROUTER, DeviceTypeEnum.PACKET_SWITCH, DeviceTypeEnum.EMULATED_PACKET_SWITCH, - DeviceTypeEnum.IPOWDM_ROUTER } L2_DEVICE_TYPES = { diff --git a/tfs/lib64 b/tfs/lib64 deleted file mode 120000 index 7951405f8..000000000 --- a/tfs/lib64 +++ /dev/null @@ -1 +0,0 @@ -lib \ No newline at end of file -- GitLab From 2674550d8713e7f6fad79fb4f17ccda5e9f59d6d Mon Sep 17 00:00:00 2001 From: armingol Date: Thu, 23 Oct 2025 14:19:42 +0000 Subject: [PATCH 010/111] BGP-LS Fix Dockerfile: add -y flag to apt-get update and clean up COPY commands --- src/bgpls_speaker/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bgpls_speaker/Dockerfile b/src/bgpls_speaker/Dockerfile index eed5b30e9..a297ff910 100644 --- a/src/bgpls_speaker/Dockerfile +++ b/src/bgpls_speaker/Dockerfile @@ -61,7 +61,7 @@ RUN python3 -m pip install --upgrade setuptools wheel RUN python3 -m pip install --upgrade pip-tools # Install OpenJDK-21 -RUN apt-get update && \ +RUN apt-get update -y && \ apt-get install -y openjdk-21-jre && \ apt-get clean; @@ -96,7 +96,7 @@ RUN python3 -m pip install -r requirements.txt # Java module necessary config files WORKDIR /var/teraflow/bgpls_speaker RUN mkdir -p /java -COPY src/bgpls_speaker/service/java/* /java/ +COPY src/bgpls_speaker/service/java/* /java/ COPY --from=build /netphony-topology/target/bgp-ls-speaker-jar-with-dependencies.jar /var/teraflow/bgpls_speaker/service/java/bgp_ls.jar # Add component files into working directory -- GitLab From 98f84af7e3a7a76c7ed7cfce2cc34bca07d6c14e Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Fri, 24 Oct 2025 06:06:52 +0000 Subject: [PATCH 011/111] feat: Implement DSCM Pluggable Service with InMemory Dictionary - Added Dockerfile for building the DSCM service container. - Created service and client modules for managing pluggable devices. - Implemented gRPC methods for Create, Get, List, Delete, and Configure pluggables. - Developed unit tests for all service functionalities. - Added message creation utilities for test cases. - Established logging and error handling mechanisms. - Included README files for documentation. --- proto/dscm_pluggable.proto | 123 +++++++++ proto/policy.proto | 2 +- .../run_tests_locally-service-pluggable.sh | 23 ++ src/common/Constants.py | 2 + .../method_wrappers/ServiceExceptions.py | 10 +- src/dscm/.gitlab-ci.yml | 13 + src/dscm/Dockerfile | 68 +++++ src/dscm/README.md | 213 ++++++++++++++++ src/dscm/__init__.py | 14 ++ src/dscm/client/DscmPluggableClient.py | 94 +++++++ src/dscm/client/__init__.py | 14 ++ src/dscm/requirements.in | 0 src/dscm/service/DscmPluggableService.py | 28 +++ .../DscmPluggableServiceServicerImpl.py | 201 +++++++++++++++ src/dscm/service/__init__.py | 14 ++ src/dscm/service/__main__.py | 51 ++++ src/dscm/tests/__init__.py | 14 ++ src/dscm/tests/test_DscmPluggables.py | 236 ++++++++++++++++++ src/dscm/tests/testmessages.py | 230 +++++++++++++++++ 19 files changed, 1344 insertions(+), 6 deletions(-) create mode 100644 proto/dscm_pluggable.proto create mode 100755 scripts/run_tests_locally-service-pluggable.sh create mode 100644 src/dscm/.gitlab-ci.yml create mode 100644 src/dscm/Dockerfile create mode 100644 src/dscm/README.md create mode 100644 src/dscm/__init__.py create mode 100644 src/dscm/client/DscmPluggableClient.py create mode 100644 src/dscm/client/__init__.py create mode 100644 src/dscm/requirements.in create mode 100644 src/dscm/service/DscmPluggableService.py create mode 100644 src/dscm/service/DscmPluggableServiceServicerImpl.py create mode 100644 src/dscm/service/__init__.py create mode 100644 src/dscm/service/__main__.py create mode 100644 src/dscm/tests/__init__.py create mode 100644 src/dscm/tests/test_DscmPluggables.py create mode 100644 src/dscm/tests/testmessages.py diff --git a/proto/dscm_pluggable.proto b/proto/dscm_pluggable.proto new file mode 100644 index 000000000..95ec83360 --- /dev/null +++ b/proto/dscm_pluggable.proto @@ -0,0 +1,123 @@ +syntax = "proto3"; + +package tfs.dscm.v0; + +import "context.proto"; +import "google/protobuf/field_mask.proto"; + +service DscmPluggableService { + rpc CreatePluggable (CreatePluggableRequest) returns (Pluggable) {} + rpc ListPluggables (ListPluggablesRequest) returns (ListPluggablesResponse) {} + rpc GetPluggable (GetPluggableRequest) returns (Pluggable) {} + rpc DeletePluggable (DeletePluggableRequest) returns (context.Empty) {} + rpc ConfigurePluggable (ConfigurePluggableRequest) returns (Pluggable) {} +} + + + +message PluggableId { + context.DeviceId device = 1; + int32 pluggable_index = 2; // physical slot number in the device +} + +message DigitalSubcarrierGroupId { + PluggableId pluggable = 1; + int32 group_index = 2; // Group id within the pluggable +} + +message DigitalSubcarrierId { + DigitalSubcarrierGroupId group = 1; + int32 subcarrier_index = 2; // Subcarrier index within the group +} + +message DigitalSubcarrierConfig { + DigitalSubcarrierId id = 1; + bool active = 2; + double target_output_power_dbm = 3; + double center_frequency_hz = 10; + double symbol_rate_baud = 11; +} + +message DigitalSubcarrierState { + DigitalSubcarrierId id = 1; + bool active = 2; + double measured_output_power_dbm = 3; + double osnr_db = 4; + context.Timestamp updated_at = 10; +} + +message DigitalSubcarrierGroupConfig { + DigitalSubcarrierGroupId id = 1; + int32 group_size = 2; // expected number of DSCs + double group_capacity_gbps = 3; // from YANG group capacity in Gbps + double subcarrier_spacing_mhz = 4; // from YANG digital-subcarrier-spacing + repeated DigitalSubcarrierConfig subcarriers = 10; +} + +message DigitalSubcarrierGroupState { + DigitalSubcarrierGroupId id = 1; + int32 count = 2; // available DSCs + double group_capacity_gbps = 3; + double subcarrier_spacing_mhz = 4; + repeated DigitalSubcarrierState subcarriers = 10; + context.Timestamp updated_at = 20; +} + +message PluggableConfig { + PluggableId id = 1; + repeated DigitalSubcarrierGroupConfig dsc_groups = 10; +} + +message PluggableState { + PluggableId id = 1; + repeated DigitalSubcarrierGroupState dsc_groups = 10; + context.Timestamp updated_at = 20; +} + +message Pluggable { + PluggableId id = 1; + PluggableConfig config = 2; + PluggableState state = 3; +} + +// ----------------------------------------------------------------------------- +// RPC I/O Messages +// ----------------------------------------------------------------------------- +message CreatePluggableRequest { + context.DeviceId device = 1; + int32 preferred_pluggable_index = 2; // -1 for auto (physical slot number in the device(router)) + PluggableConfig initial_config = 10; +} + +message ListPluggablesRequest { + context.DeviceId device = 1; + View view_level = 2; +} + +message ListPluggablesResponse { + repeated Pluggable pluggables = 1; +} + +message GetPluggableRequest { + PluggableId id = 1; + View view_level = 2; +} + +message DeletePluggableRequest { + PluggableId id = 1; +} + +message ConfigurePluggableRequest { + PluggableConfig config = 1; + google.protobuf.FieldMask update_mask = 2; // Not Implemented yet (for partial updates) + View view_level = 3; + int32 apply_timeout_seconds = 10; // Not Implemented yet (for timeout) +} + +// to control the level of detail in responses +enum View { + VIEW_UNSPECIFIED = 0; + VIEW_CONFIG = 1; + VIEW_STATE = 2; + VIEW_FULL = 3; +} diff --git a/proto/policy.proto b/proto/policy.proto index 51ea63b7f..d788f86aa 100644 --- a/proto/policy.proto +++ b/proto/policy.proto @@ -16,7 +16,7 @@ syntax = "proto3"; package policy; import "context.proto"; -import "policy_condition.proto"; +import "policy_condition.proto"; // WARNING: Not used import "policy_action.proto"; import "monitoring.proto"; // to be migrated to: "kpi_manager.proto" diff --git a/scripts/run_tests_locally-service-pluggable.sh b/scripts/run_tests_locally-service-pluggable.sh new file mode 100755 index 000000000..be977b5a6 --- /dev/null +++ b/scripts/run_tests_locally-service-pluggable.sh @@ -0,0 +1,23 @@ +#!/bin/bash +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 \ + dscm/tests/test_DscmPluggables.py + +echo "Bye!" diff --git a/src/common/Constants.py b/src/common/Constants.py index a5dca46a2..d00599ac2 100644 --- a/src/common/Constants.py +++ b/src/common/Constants.py @@ -75,6 +75,7 @@ class ServiceNameEnum(Enum): ANALYTICSBACKEND = 'analytics-backend' QOSPROFILE = 'qos-profile' OSMCLIENT = 'osm-client' + DSCMPLUGGABLE = 'dscm-pluggable' # Used for test and debugging only DLT_GATEWAY = 'dltgateway' @@ -117,6 +118,7 @@ DEFAULT_SERVICE_GRPC_PORTS = { ServiceNameEnum.ANALYTICSBACKEND .value : 30090, ServiceNameEnum.AUTOMATION .value : 30200, ServiceNameEnum.OSMCLIENT .value : 30210, + ServiceNameEnum.DSCMPLUGGABLE .value : 30220, # Used for test and debugging only ServiceNameEnum.DLT_GATEWAY .value : 50051, diff --git a/src/common/method_wrappers/ServiceExceptions.py b/src/common/method_wrappers/ServiceExceptions.py index 3d06c00a5..842318832 100644 --- a/src/common/method_wrappers/ServiceExceptions.py +++ b/src/common/method_wrappers/ServiceExceptions.py @@ -33,21 +33,21 @@ class NotFoundException(ServiceException): class AlreadyExistsException(ServiceException): def __init__( - self, object_name : str, object_uuid: str, extra_details : Union[str, Iterable[str]] = None + self, object_name : str, object_uuid: str, extra_details : Union[str, Iterable[str]] = [] ) -> None: details = '{:s}({:s}) already exists'.format(str(object_name), str(object_uuid)) super().__init__(grpc.StatusCode.ALREADY_EXISTS, details, extra_details=extra_details) class InvalidArgumentException(ServiceException): def __init__( - self, argument_name : str, argument_value: str, extra_details : Union[str, Iterable[str]] = None + self, argument_name : str, argument_value: str, extra_details : Union[str, Iterable[str]] = [] ) -> None: details = '{:s}({:s}) is invalid'.format(str(argument_name), str(argument_value)) super().__init__(grpc.StatusCode.INVALID_ARGUMENT, details, extra_details=extra_details) class InvalidArgumentsException(ServiceException): def __init__( - self, arguments : List[Tuple[str, str]], extra_details : Union[str, Iterable[str]] = None + self, arguments : List[Tuple[str, str]], extra_details : Union[str, Iterable[str]] = [] ) -> None: str_arguments = ', '.join(['{:s}({:s})'.format(name, value) for name,value in arguments]) details = 'Arguments {:s} are invalid'.format(str_arguments) @@ -55,14 +55,14 @@ class InvalidArgumentsException(ServiceException): class OperationFailedException(ServiceException): def __init__( - self, operation : str, extra_details : Union[str, Iterable[str]] = None + self, operation : str, extra_details : Union[str, Iterable[str]] = [] ) -> None: details = 'Operation({:s}) failed'.format(str(operation)) super().__init__(grpc.StatusCode.INTERNAL, details, extra_details=extra_details) class NotImplementedException(ServiceException): def __init__( - self, operation : str, extra_details : Union[str, Iterable[str]] = None + self, operation : str, extra_details : Union[str, Iterable[str]] = [] ) -> None: details = 'Operation({:s}) not implemented'.format(str(operation)) super().__init__(grpc.StatusCode.UNIMPLEMENTED, details, extra_details=extra_details) diff --git a/src/dscm/.gitlab-ci.yml b/src/dscm/.gitlab-ci.yml new file mode 100644 index 000000000..7363515f0 --- /dev/null +++ b/src/dscm/.gitlab-ci.yml @@ -0,0 +1,13 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/dscm/Dockerfile b/src/dscm/Dockerfile new file mode 100644 index 000000000..22c1c92ae --- /dev/null +++ b/src/dscm/Dockerfile @@ -0,0 +1,68 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/dscm +WORKDIR /var/teraflow/dscm +COPY src/dscm/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/dscm/. dscm/ + +# # Start the service +ENTRYPOINT [ "python", "-m", "dscm.service" ] diff --git a/src/dscm/README.md b/src/dscm/README.md new file mode 100644 index 000000000..b76723ecf --- /dev/null +++ b/src/dscm/README.md @@ -0,0 +1,213 @@ +# DSCM (Digital Subcarrier Multipelxed) Service + +## Overview + +The DSCM service provides gRPC-based management for optical pluggables and their digital subcarrier groups. It enables configuration and monitoring of coherent optical transceivers with support for multi-carrier operation. + +## Key Concepts + +### Pluggable +An optical transceiver module installed in a device (router/switch) at a specific physical slot index. + +### Digital Subcarrier Group (DSC Group) +A logical grouping of digital subcarriers within a pluggable, representing a coherent optical channel with shared parameters: +- **group_size**: Expected number of subcarriers in the group +- **group_capacity_gbps**: Total capacity in Gbps (e.g., 400G) +- **subcarrier_spacing_mhz**: Frequency spacing between subcarriers (e.g., 75 MHz) + +### Digital Subcarrier +Individual frequency channels within a DSC group with configurable parameters: +- **active**: Enable/disable the subcarrier +- **target_output_power_dbm**: Transmit power in dBm +- **center_frequency_hz**: Carrier frequency in Hz (e.g., 193.1 THz) +- **symbol_rate_baud**: Symbol rate in Baud (e.g., 64 GBaud) + +## Service API + +### gRPC Methods + +| Method | Request | Response | Description | +|--------|---------|----------|-------------| +| `CreatePluggable` | `CreatePluggableRequest` | `Pluggable` | Create a new pluggable with optional initial configuration | +| `GetPluggable` | `GetPluggableRequest` | `Pluggable` | Retrieve a specific pluggable by ID | +| `ListPluggables` | `ListPluggablesRequest` | `ListPluggablesResponse` | List all pluggables for a device | +| `DeletePluggable` | `DeletePluggableRequest` | `Empty` | Remove a pluggable from management | +| `ConfigurePluggable` | `ConfigurePluggableRequest` | `Pluggable` | Apply full configuration to a pluggable | + +### View Levels + +Control the level of detail in responses: +- `VIEW_UNSPECIFIED (0)`: Default, returns full pluggable +- `VIEW_CONFIG (1)`: Returns only configuration data +- `VIEW_STATE (2)`: Returns only state/telemetry data +- `VIEW_FULL (3)`: Returns complete pluggable (config + state) + +## Usage Examples + +### 1. Creating a Pluggable Without Configuration + +```python +from dscm.client.DscmPluggableClient import DscmPluggableClient +from dscm.tests.testmessages import create_pluggable_request + +# Create client +client = DscmPluggableClient() + +# Create pluggable request (auto-assign index) +request = create_pluggable_request( + device_uuid="550e8400-e29b-41d4-a716-446655440000", + preferred_pluggable_index=-1 # -1 for auto-assignment +) + +# Create pluggable +pluggable = client.CreatePluggable(request) +print(f"Created pluggable at index: {pluggable.id.pluggable_index}") + +# Close client +client.close() +``` + +### 2. Creating a Pluggable With Initial Configuration + +```python +from dscm.tests.testmessages import create_pluggable_request + +# Create pluggable with optical channel configuration +request = create_pluggable_request( + device_uuid="550e8400-e29b-41d4-a716-446655440000", + preferred_pluggable_index=0, # Physical slot 0 + with_initial_config=True # Include DSC group configuration +) + +pluggable = client.CreatePluggable(request) + +# Verify configuration +assert len(pluggable.config.dsc_groups) == 1 +dsc_group = pluggable.config.dsc_groups[0] +assert dsc_group.group_size == 4 +assert dsc_group.group_capacity_gbps == 400.0 +``` + +### 3. Listing Pluggables with View Filtering + +```python +from common.proto.dscm_pluggable_pb2 import View +from dscm.tests.testmessages import create_list_pluggables_request + +# List only configuration (no state data) +request = create_list_pluggables_request( + device_uuid="550e8400-e29b-41d4-a716-446655440000", + view_level=View.VIEW_CONFIG +) + +response = client.ListPluggables(request) +for pluggable in response.pluggables: + print(f"Pluggable {pluggable.id.pluggable_index}: {len(pluggable.config.dsc_groups)} DSC groups") +``` + +### 4. Getting a Specific Pluggable + +```python +from dscm.tests.testmessages import create_get_pluggable_request + +# Get full pluggable details +request = create_get_pluggable_request( + device_uuid="550e8400-e29b-41d4-a716-446655440000", + pluggable_index=0, + view_level=View.VIEW_FULL +) + +pluggable = client.GetPluggable(request) +print(f"Device: {pluggable.id.device.device_uuid.uuid}") +print(f"Index: {pluggable.id.pluggable_index}") +print(f"DSC Groups: {len(pluggable.config.dsc_groups)}") +``` + +### 5. Configuring a Pluggable + +```python +from dscm.tests.testmessages import create_configure_pluggable_request + +# Apply full configuration (reconfigure optical channels) +request = create_configure_pluggable_request( + device_uuid="550e8400-e29b-41d4-a716-446655440000", + pluggable_index=0, + view_level=View.VIEW_CONFIG, + apply_timeout_seconds=30 +) + +# Configuration includes: +# - 1 DSC group with 400G capacity, 75 MHz spacing +# - 2 digital subcarriers at 193.1 THz and 193.175 THz +# - Each subcarrier: -10 dBm power, 64 GBaud symbol rate + +pluggable = client.ConfigurePluggable(request) +print(f"Configured {len(pluggable.config.dsc_groups[0].subcarriers)} subcarriers") +``` + +### 6. Deleting a Pluggable + +```python +from dscm.tests.testmessages import create_delete_pluggable_request + +# Delete pluggable from management +request = create_delete_pluggable_request( + device_uuid="550e8400-e29b-41d4-a716-446655440000", + pluggable_index=0 +) + +response = client.DeletePluggable(request) +print("Pluggable deleted successfully") +``` + +## Configuration Message Structure + +### Complete Configuration Example + +```python +from common.proto import dscm_pluggable_pb2 + +# Create configuration request +request = dscm_pluggable_pb2.ConfigurePluggableRequest() + +# Set pluggable ID +request.config.id.device.device_uuid.uuid = "550e8400-e29b-41d4-a716-446655440000" +request.config.id.pluggable_index = 0 + +# Add DSC group +dsc_group = request.config.dsc_groups.add() +dsc_group.id.pluggable.device.device_uuid.uuid = "550e8400-e29b-41d4-a716-446655440000" +dsc_group.id.pluggable.pluggable_index = 0 +dsc_group.id.group_index = 0 +dsc_group.group_size = 2 +dsc_group.group_capacity_gbps = 400.0 +dsc_group.subcarrier_spacing_mhz = 75.0 + +# Add subcarrier 1 +subcarrier = dsc_group.subcarriers.add() +subcarrier.id.group.pluggable.device.device_uuid.uuid = "550e8400-e29b-41d4-a716-446655440000" +subcarrier.id.group.pluggable.pluggable_index = 0 +subcarrier.id.group.group_index = 0 +subcarrier.id.subcarrier_index = 0 +subcarrier.active = True +subcarrier.target_output_power_dbm = -10.0 +subcarrier.center_frequency_hz = 193100000000000 # 193.1 THz +subcarrier.symbol_rate_baud = 64000000000 # 64 GBaud + +# Add subcarrier 2 +subcarrier2 = dsc_group.subcarriers.add() +# ... (similar configuration for second subcarrier) + +# Set view level and timeout +request.view_level = dscm_pluggable_pb2.VIEW_FULL +request.apply_timeout_seconds = 30 +``` + +## API Reference + +For complete API documentation, see: +- Protocol Buffer definitions: `/home/ubuntu/tfs-ctrl/proto/dscm_pluggable.proto` +- Client implementation: `/home/ubuntu/tfs-ctrl/src/dscm/client/DscmPluggableClient.py` +- Service implementation: `/home/ubuntu/tfs-ctrl/src/dscm/service/DscmPluggableServiceServicerImpl.py` +- Test examples: `/home/ubuntu/tfs-ctrl/src/dscm/tests/test_DscmPluggables.py` +- Message helpers: `/home/ubuntu/tfs-ctrl/src/dscm/tests/testmessages.py` diff --git a/src/dscm/__init__.py b/src/dscm/__init__.py new file mode 100644 index 000000000..3ccc21c7d --- /dev/null +++ b/src/dscm/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/dscm/client/DscmPluggableClient.py b/src/dscm/client/DscmPluggableClient.py new file mode 100644 index 000000000..e261c6bb6 --- /dev/null +++ b/src/dscm/client/DscmPluggableClient.py @@ -0,0 +1,94 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 +from common.tools.grpc.Tools import grpc_message_to_json_string +from common.tools.client.RetryDecorator import retry, delay_exponential + +from common.proto.dscm_pluggable_pb2_grpc import DscmPluggableServiceStub +from common.proto.dscm_pluggable_pb2 import ( + PluggableId, Pluggable, CreatePluggableRequest, ListPluggablesRequest, ListPluggablesResponse, + GetPluggableRequest, DeletePluggableRequest, ConfigurePluggableRequest, DeconfigurePluggableRequest) + +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 DscmPluggableClient: + def __init__(self, host=None, port=None): + if not host: host = get_service_host(ServiceNameEnum.DSCMPLUGGABLE) + if not port: port = get_service_port_grpc(ServiceNameEnum.DSCMPLUGGABLE) + 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 = DscmPluggableServiceStub(self.channel) + + def close(self): + if self.channel is not None: self.channel.close() + self.channel = None + self.stub = None + + @RETRY_DECORATOR + def CreatePluggable(self, request : CreatePluggableRequest) -> Pluggable: # pyright: ignore[reportInvalidTypeForm] + LOGGER.debug('CreatePluggable: {:s}'.format(grpc_message_to_json_string(request))) + response = self.stub.CreatePluggable(request) + LOGGER.debug('CreatePluggable result: {:s}'.format(grpc_message_to_json_string(response))) + return response + + @RETRY_DECORATOR + def ListPluggables(self, request : ListPluggablesRequest) -> ListPluggablesResponse: # pyright: ignore[reportInvalidTypeForm] + LOGGER.debug('ListPluggables: {:s}'.format(grpc_message_to_json_string(request))) + response = self.stub.ListPluggables(request) + LOGGER.debug('ListPluggables result: {:s}'.format(grpc_message_to_json_string(response))) + return response + + @RETRY_DECORATOR + def GetPluggable(self, request : GetPluggableRequest) -> Pluggable: # pyright: ignore[reportInvalidTypeForm] + LOGGER.debug('GetPluggable: {:s}'.format(grpc_message_to_json_string(request))) + response = self.stub.GetPluggable(request) + LOGGER.debug('GetPluggable result: {:s}'.format(grpc_message_to_json_string(response))) + return response + + @RETRY_DECORATOR + def DeletePluggable(self, request : DeletePluggableRequest) -> Empty: # pyright: ignore[reportInvalidTypeForm] + LOGGER.debug('DeletePluggable: {:s}'.format(grpc_message_to_json_string(request))) + response = self.stub.DeletePluggable(request) + LOGGER.debug('DeletePluggable result: {:s}'.format(grpc_message_to_json_string(response))) + return response + + @RETRY_DECORATOR + def ConfigurePluggable(self, request : ConfigurePluggableRequest) -> Pluggable: # pyright: ignore[reportInvalidTypeForm] + LOGGER.debug('ConfigurePluggable: {:s}'.format(grpc_message_to_json_string(request))) + response = self.stub.ConfigurePluggable(request) + LOGGER.debug('ConfigurePluggable result: {:s}'.format(grpc_message_to_json_string(response))) + return response + + @RETRY_DECORATOR + def DeconfigurePluggable(self, request : DeconfigurePluggableRequest) -> Empty: # pyright: ignore[reportInvalidTypeForm] + LOGGER.debug('DeconfigurePluggable: {:s}'.format(grpc_message_to_json_string(request))) + response = self.stub.DeconfigurePluggable(request) + LOGGER.debug('DeconfigurePluggable result: {:s}'.format(grpc_message_to_json_string(response))) + return response diff --git a/src/dscm/client/__init__.py b/src/dscm/client/__init__.py new file mode 100644 index 000000000..3ccc21c7d --- /dev/null +++ b/src/dscm/client/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/dscm/requirements.in b/src/dscm/requirements.in new file mode 100644 index 000000000..e69de29bb diff --git a/src/dscm/service/DscmPluggableService.py b/src/dscm/service/DscmPluggableService.py new file mode 100644 index 000000000..aac2ecce1 --- /dev/null +++ b/src/dscm/service/DscmPluggableService.py @@ -0,0 +1,28 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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.dscm_pluggable_pb2_grpc import add_DscmPluggableServiceServicer_to_server +from dscm.service.DscmPluggableServiceServicerImpl import DscmPluggableServiceServicerImpl + +class DscmPluggableService(GenericGrpcService): + def __init__(self, cls_name: str = __name__) -> None: + port = get_service_port_grpc(ServiceNameEnum.DSCMPLUGGABLE) + super().__init__(port, cls_name=cls_name) + self.dscmPluggableService_servicer = DscmPluggableServiceServicerImpl() + + def install_servicers(self): + add_DscmPluggableServiceServicer_to_server(self.dscmPluggableService_servicer, self.server) diff --git a/src/dscm/service/DscmPluggableServiceServicerImpl.py b/src/dscm/service/DscmPluggableServiceServicerImpl.py new file mode 100644 index 000000000..e6d80d512 --- /dev/null +++ b/src/dscm/service/DscmPluggableServiceServicerImpl.py @@ -0,0 +1,201 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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.dscm_pluggable_pb2_grpc import DscmPluggableServiceServicer +from common.proto.dscm_pluggable_pb2 import ( + Pluggable, CreatePluggableRequest, ListPluggablesRequest, ListPluggablesResponse, + GetPluggableRequest, DeletePluggableRequest, ConfigurePluggableRequest) +from common.method_wrappers.ServiceExceptions import NotFoundException, AlreadyExistsException + +LOGGER = logging.getLogger(__name__) +METRICS_POOL = MetricsPool('DscmPluggable', 'ServicegRPC') + +class DscmPluggableServiceServicerImpl(DscmPluggableServiceServicer): + def __init__(self): + LOGGER.info('Init DscmPluggableService') + self.pluggables = {} # In-memory store for pluggables + + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + def CreatePluggable( + self, request: CreatePluggableRequest, context: grpc.ServicerContext # type: ignore + ) -> Pluggable: # type: ignore + LOGGER.info("Received gRPC message object: {:}".format(request)) + + device_uuid = request.device.device_uuid.uuid + + if request.preferred_pluggable_index and request.preferred_pluggable_index >= 0: + pluggable_index = request.preferred_pluggable_index + else: + pluggable_index = -1 + + pluggable_key = f"{device_uuid}:{pluggable_index}" + + if pluggable_key in self.pluggables: + LOGGER.warning(f"Pluggable already exists at device {device_uuid} index {pluggable_index}") + raise AlreadyExistsException('Pluggable', pluggable_key) + + pluggable = Pluggable() + + pluggable.id.device.device_uuid.uuid = device_uuid + pluggable.id.pluggable_index = pluggable_index + + if request.HasField('initial_config'): + pluggable.config.CopyFrom(request.initial_config) + # The below ensure ID consistency across all levels are maintained + # User might send incorrect/inconsistent IDs in nested structures + pluggable.config.id.device.device_uuid.uuid = device_uuid + pluggable.config.id.pluggable_index = pluggable_index + + for dsc_group in pluggable.config.dsc_groups: + dsc_group.id.pluggable.device.device_uuid.uuid = device_uuid + dsc_group.id.pluggable.pluggable_index = pluggable_index + + for subcarrier in dsc_group.subcarriers: + subcarrier.id.group.pluggable.device.device_uuid.uuid = device_uuid + subcarrier.id.group.pluggable.pluggable_index = pluggable_index + + pluggable.state.id.device.device_uuid.uuid = device_uuid + pluggable.state.id.pluggable_index = pluggable_index + + self.pluggables[pluggable_key] = pluggable + + LOGGER.info(f"Created pluggable: device={device_uuid}, index={pluggable_index}") + return pluggable + + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + def GetPluggable( + self, request: GetPluggableRequest, context: grpc.ServicerContext # type: ignore + ) -> Pluggable: # type: ignore + LOGGER.info("Received gRPC message object: {:}".format(request)) + + device_uuid = request.id.device.device_uuid.uuid + pluggable_index = request.id.pluggable_index + pluggable_key = f"{device_uuid}:{pluggable_index}" + + if pluggable_key not in self.pluggables: + LOGGER.warning(f'No matching pluggable found: device={device_uuid}, index={pluggable_index}') + raise NotFoundException('Pluggable', pluggable_key) + + pluggable = self.pluggables[pluggable_key] + + if request.view_level == 1: + filtered = Pluggable() + filtered.id.CopyFrom(pluggable.id) + filtered.config.CopyFrom(pluggable.config) + return filtered + elif request.view_level == 2: + filtered = Pluggable() + filtered.id.CopyFrom(pluggable.id) + filtered.state.CopyFrom(pluggable.state) + return filtered + else: + return pluggable + + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + def DeletePluggable( + self, request: DeletePluggableRequest, context: grpc.ServicerContext # type: ignore + ) -> Empty: # type: ignore + LOGGER.info("Received gRPC message object: {:}".format(request)) + + device_uuid = request.id.device.device_uuid.uuid + pluggable_index = request.id.pluggable_index + pluggable_key = f"{device_uuid}:{pluggable_index}" + + if pluggable_key not in self.pluggables: + LOGGER.info(f'No matching pluggable found: device={device_uuid}, index={pluggable_index}') + raise NotFoundException('Pluggable', pluggable_key) + + del self.pluggables[pluggable_key] + LOGGER.info(f"Deleted pluggable: device={device_uuid}, index={pluggable_index}") + + return Empty() + + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + def ListPluggables( + self, request: ListPluggablesRequest, context: grpc.ServicerContext # type: ignore + ) -> ListPluggablesResponse: # type: ignore + LOGGER.info("Received gRPC message object: {:}".format(request)) + + response = ListPluggablesResponse() + device_uuid = request.device.device_uuid.uuid if request.HasField('device') else None + + for pluggable in self.pluggables.values(): + if device_uuid and pluggable.id.device.device_uuid.uuid != device_uuid: + continue + + if request.view_level == 1: + filtered = Pluggable() + filtered.id.CopyFrom(pluggable.id) + filtered.config.CopyFrom(pluggable.config) + response.pluggables.append(filtered) + elif request.view_level == 2: + filtered = Pluggable() + filtered.id.CopyFrom(pluggable.id) + filtered.state.CopyFrom(pluggable.state) + response.pluggables.append(filtered) + else: + response.pluggables.append(pluggable) + + LOGGER.info(f"Returning {len(response.pluggables)} pluggable(s)") + return response + + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + def ConfigurePluggable( + self, request: ConfigurePluggableRequest, context: grpc.ServicerContext # type: ignore + ) -> Pluggable: # type: ignore + LOGGER.info("Received gRPC message object: {:}".format(request)) + + device_uuid = request.config.id.device.device_uuid.uuid + pluggable_index = request.config.id.pluggable_index + pluggable_key = f"{device_uuid}:{pluggable_index}" + + if pluggable_key not in self.pluggables: + LOGGER.info(f'No matching pluggable found: device={device_uuid}, index={pluggable_index}') + raise NotFoundException('Pluggable', pluggable_key) + + pluggable = self.pluggables[pluggable_key] + + LOGGER.info(f"Applying full configuration to pluggable: device={device_uuid}, index={pluggable_index}") + pluggable.config.CopyFrom(request.config) + + # To ensure ID consistency across all levels are maintained + # User might send incorrect/inconsistent IDs in nested structures + pluggable.config.id.device.device_uuid.uuid = device_uuid + pluggable.config.id.pluggable_index = pluggable_index + for dsc_group in pluggable.config.dsc_groups: + dsc_group.id.pluggable.device.device_uuid.uuid = device_uuid + dsc_group.id.pluggable.pluggable_index = pluggable_index + for subcarrier in dsc_group.subcarriers: + subcarrier.id.group.pluggable.device.device_uuid.uuid = device_uuid + subcarrier.id.group.pluggable.pluggable_index = pluggable_index + + has_config = len(pluggable.config.dsc_groups) > 0 + state_msg = "configured" if has_config else "deconfigured (empty config)" + LOGGER.info(f"Successfully {state_msg} pluggable: device={device_uuid}, index={pluggable_index}") + + if request.view_level == 1: + filtered = Pluggable() + filtered.id.CopyFrom(pluggable.id) + filtered.config.CopyFrom(pluggable.config) + return filtered + elif request.view_level == 2: + filtered = Pluggable() + filtered.id.CopyFrom(pluggable.id) + filtered.state.CopyFrom(pluggable.state) + return filtered + else: + return pluggable diff --git a/src/dscm/service/__init__.py b/src/dscm/service/__init__.py new file mode 100644 index 000000000..3ccc21c7d --- /dev/null +++ b/src/dscm/service/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/dscm/service/__main__.py b/src/dscm/service/__main__.py new file mode 100644 index 000000000..f21f35fe6 --- /dev/null +++ b/src/dscm/service/__main__.py @@ -0,0 +1,51 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 .DscmPluggableService import DscmPluggableService + +terminate = threading.Event() +LOGGER = None + +def signal_handler(signal, frame): + 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 = DscmPluggableService() + 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/dscm/tests/__init__.py b/src/dscm/tests/__init__.py new file mode 100644 index 000000000..3ccc21c7d --- /dev/null +++ b/src/dscm/tests/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/dscm/tests/test_DscmPluggables.py b/src/dscm/tests/test_DscmPluggables.py new file mode 100644 index 000000000..876bccb8e --- /dev/null +++ b/src/dscm/tests/test_DscmPluggables.py @@ -0,0 +1,236 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 os, pytest +import logging +from typing import Union + +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) +from common.tests.MockServicerImpl_Context import MockServicerImpl_Context +from common.proto.context_pb2_grpc import add_ContextServiceServicer_to_server + +from common.proto.dscm_pluggable_pb2 import (PluggableId, Pluggable, + CreatePluggableRequest, ListPluggablesRequest, ListPluggablesResponse, View) +from common.tools.service.GenericGrpcService import GenericGrpcService + +from dscm.client.DscmPluggableClient import DscmPluggableClient +from dscm.service.DscmPluggableService import DscmPluggableService +from dscm.tests.testmessages import (create_pluggable_request, + create_list_pluggables_request, create_get_pluggable_request, + create_delete_pluggable_request, create_configure_pluggable_request) + + +########################### +# Tests Setup +########################### + +LOCAL_HOST = '127.0.0.1' + +DSCMPLUGGABLE_SERVICE_PORT = get_service_port_grpc(ServiceNameEnum.DSCMPLUGGABLE) # type: ignore +os.environ[get_env_var_name(ServiceNameEnum.DSCMPLUGGABLE, ENVVAR_SUFIX_SERVICE_HOST )] = str(LOCAL_HOST) +os.environ[get_env_var_name(ServiceNameEnum.DSCMPLUGGABLE, ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(DSCMPLUGGABLE_SERVICE_PORT) + +LOGGER = logging.getLogger(__name__) + +class MockContextService(GenericGrpcService): + # Mock Service implementing Context to simplify unitary tests of DSCM pluggables + + 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) + +# This fixture will be requested by test cases and last during testing session +@pytest.fixture(scope='session') +def dscm_pluggable_service(): + LOGGER.info('Initializing DscmPluggableService...') + _service = DscmPluggableService() + _service.start() + + # yield the server, when test finishes, execution will resume to stop it + LOGGER.info('Yielding DscmPluggableService...') + yield _service + + LOGGER.info('Terminating DscmPluggableService...') + _service.stop() + + LOGGER.info('Terminated DscmPluggableService...') + +@pytest.fixture(scope='function') +def dscm_pluggable_client(dscm_pluggable_service : DscmPluggableService): + LOGGER.info('Creating DscmPluggableClient...') + _client = DscmPluggableClient() + + LOGGER.info('Yielding DscmPluggableClient...') + yield _client + + LOGGER.info('Closing DscmPluggableClient...') + _client.close() + + LOGGER.info('Closed DscmPluggableClient...') + +@pytest.fixture(autouse=True) +def log_all_methods(request): + ''' + This fixture logs messages before and after each test function runs, indicating the start and end of the test. + The autouse=True parameter ensures that this logging happens automatically for all tests in the module. + ''' + LOGGER.info(f" >>>>> Starting test: {request.node.name} ") + yield + LOGGER.info(f" <<<<< Finished test: {request.node.name} ") + +########################### +# Test Cases +########################### + +# CreatePluggable Test without configuration +def test_CreatePluggable(dscm_pluggable_client : DscmPluggableClient): + LOGGER.info('Creating Pluggable for test...') + _pluggable_request = create_pluggable_request(preferred_pluggable_index=-1) + _pluggable = dscm_pluggable_client.CreatePluggable(_pluggable_request) + LOGGER.info('Created Pluggable for test: %s', _pluggable) + assert isinstance(_pluggable, Pluggable) + assert _pluggable.id.pluggable_index == _pluggable_request.preferred_pluggable_index + assert _pluggable.id.device.device_uuid.uuid == _pluggable_request.device.device_uuid.uuid + + +# CreatePluggable Test with configuration +def test_CreatePluggable_with_config(dscm_pluggable_client : DscmPluggableClient): + LOGGER.info('Creating Pluggable with initial configuration for test...') + _pluggable_request = create_pluggable_request( + device_uuid = "9bbf1937-db9e-45bc-b2c6-3214a9d42157", + preferred_pluggable_index = -1, + with_initial_config = True) + _pluggable = dscm_pluggable_client.CreatePluggable(_pluggable_request) + LOGGER.info('Created Pluggable with initial configuration for test: %s', _pluggable) + assert isinstance(_pluggable, Pluggable) + assert _pluggable.id.pluggable_index == _pluggable_request.preferred_pluggable_index + assert _pluggable.id.device.device_uuid.uuid == _pluggable_request.device.device_uuid.uuid + assert _pluggable.config is not None + assert len(_pluggable.config.dsc_groups) == 1 + dsc_group = _pluggable.config.dsc_groups[0] + assert dsc_group.group_size == 4 + assert len(dsc_group.subcarriers) == 2 + +# create pluggable request with pluggable key already exists error +def test_CreatePluggable_already_exists(dscm_pluggable_client : DscmPluggableClient): + LOGGER.info('Creating Pluggable for test...') + _pluggable_request = create_pluggable_request(preferred_pluggable_index=5) + _pluggable = dscm_pluggable_client.CreatePluggable(_pluggable_request) + LOGGER.info('Created Pluggable for test: %s', _pluggable) + assert isinstance(_pluggable, Pluggable) + assert _pluggable.id.pluggable_index == _pluggable_request.preferred_pluggable_index + assert _pluggable.id.device.device_uuid.uuid == _pluggable_request.device.device_uuid.uuid + # Try to create the same pluggable again, should raise ALREADY_EXISTS + with pytest.raises(grpc.RpcError) as e: + dscm_pluggable_client.CreatePluggable(_pluggable_request) + assert e.value.code() == grpc.StatusCode.ALREADY_EXISTS + +# ListPluggables Test +def test_ListPluggables(dscm_pluggable_client : DscmPluggableClient): + LOGGER.info('Listing Pluggables for test...') + _list_request = create_list_pluggables_request( + view_level = View.VIEW_CONFIG # View.VIEW_STATE + ) + _pluggables = dscm_pluggable_client.ListPluggables(_list_request) + LOGGER.info('Listed Pluggables for test: %s', _pluggables) + assert isinstance(_pluggables, ListPluggablesResponse) + if len(_pluggables.pluggables) != 0: + assert len(_pluggables.pluggables) >= 1 + for p in _pluggables.pluggables: + assert isinstance(p, Pluggable) + assert isinstance(p.id, PluggableId) + else: + assert len(_pluggables.pluggables) == 0 + +# GetPluggable Test +def test_GetPluggable(dscm_pluggable_client : DscmPluggableClient): + LOGGER.info('Starting GetPluggable test...') + LOGGER.info('Getting Pluggable for test...') + # First create a pluggable to get it later + _pluggable_request = create_pluggable_request(preferred_pluggable_index=1) + _created_pluggable = dscm_pluggable_client.CreatePluggable(_pluggable_request) + LOGGER.info('Created Pluggable for GetPluggable test: %s', _created_pluggable) + + _get_request = create_get_pluggable_request( + device_uuid = _created_pluggable.id.device.device_uuid.uuid, + pluggable_index = _created_pluggable.id.pluggable_index, + view_level = View.VIEW_FULL + ) + _pluggable = dscm_pluggable_client.GetPluggable(_get_request) + LOGGER.info('Got Pluggable for test: %s', _pluggable) + assert isinstance(_pluggable, Pluggable) + assert _pluggable.id.pluggable_index == _created_pluggable.id.pluggable_index + assert _pluggable.id.device.device_uuid.uuid == _created_pluggable.id.device.device_uuid.uuid + + +# DeletePluggable Test +def test_DeletePluggable(dscm_pluggable_client : DscmPluggableClient): + LOGGER.info('Starting DeletePluggable test...') + LOGGER.info('Creating Pluggable to delete for test...') + + # First create a pluggable to delete it later + _pluggable_request = create_pluggable_request(preferred_pluggable_index=2) + _created_pluggable = dscm_pluggable_client.CreatePluggable(_pluggable_request) + LOGGER.info('Created Pluggable to delete for test: %s', _created_pluggable) + + _delete_request = create_delete_pluggable_request( + device_uuid = _created_pluggable.id.device.device_uuid.uuid, + pluggable_index = _created_pluggable.id.pluggable_index + ) + _response = dscm_pluggable_client.DeletePluggable(_delete_request) + LOGGER.info('Deleted Pluggable for test, response: %s', _response) + assert isinstance(_response, Empty) + + # Try to get the deleted pluggable, should raise NOT_FOUND + with pytest.raises(grpc.RpcError) as e: + dscm_pluggable_client.GetPluggable( + create_get_pluggable_request( + device_uuid = _created_pluggable.id.device.device_uuid.uuid, + pluggable_index = _created_pluggable.id.pluggable_index + ) + ) + assert e.value.code() == grpc.StatusCode.NOT_FOUND + +# ConfigurePluggable Test +def test_ConfigurePluggable(dscm_pluggable_client : DscmPluggableClient): + LOGGER.info('Starting ConfigurePluggable test...') + LOGGER.info('Creating Pluggable to configure for test...') + + # First create a pluggable to configure it later + _pluggable_request = create_pluggable_request(preferred_pluggable_index=3) + _created_pluggable = dscm_pluggable_client.CreatePluggable(_pluggable_request) + LOGGER.info('Created Pluggable to configure for test: %s', _created_pluggable) + + _configure_request = create_configure_pluggable_request( + device_uuid = _created_pluggable.id.device.device_uuid.uuid, + pluggable_index = _created_pluggable.id.pluggable_index, + ) + _pluggable = dscm_pluggable_client.ConfigurePluggable(_configure_request) + LOGGER.info('Configured Pluggable for test: %s', _pluggable) + assert isinstance(_pluggable, Pluggable) + assert _pluggable.config is not None + assert len(_pluggable.config.dsc_groups) == 1 + dsc_group = _pluggable.config.dsc_groups[0] + assert dsc_group.group_size == 2 + assert len(dsc_group.subcarriers) == 2 diff --git a/src/dscm/tests/testmessages.py b/src/dscm/tests/testmessages.py new file mode 100644 index 000000000..bf6858854 --- /dev/null +++ b/src/dscm/tests/testmessages.py @@ -0,0 +1,230 @@ +# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 typing import Optional, List, Dict, Any +from common.proto import dscm_pluggable_pb2 + + +########################### +# CreatePluggableRequest +########################### + +def create_pluggable_request( + device_uuid: Optional[str] = None, + preferred_pluggable_index: Optional[int] = None, + with_initial_config: bool = False +) -> dscm_pluggable_pb2.CreatePluggableRequest: + """ + Create a CreatePluggableRequest message. + + Args: + device_uuid: UUID of the device. If None, generates a random UUID. + preferred_pluggable_index: Preferred index for the pluggable. If None, not set. + with_initial_config: If True, includes initial configuration. + + Returns: + CreatePluggableRequest message + """ + _request = dscm_pluggable_pb2.CreatePluggableRequest() + + # Set device ID + if device_uuid is None: + device_uuid = str(uuid.uuid4()) + _request.device.device_uuid.uuid = device_uuid + + # Set preferred pluggable index if provided + if preferred_pluggable_index is not None: + _request.preferred_pluggable_index = preferred_pluggable_index + + # Add initial configuration if requested + if with_initial_config: + _request.initial_config.id.device.device_uuid.uuid = device_uuid + _request.initial_config.id.pluggable_index = preferred_pluggable_index or 0 + + # Add sample DSC group configuration + dsc_group = _request.initial_config.dsc_groups.add() + dsc_group.id.pluggable.device.device_uuid.uuid = device_uuid + dsc_group.id.pluggable.pluggable_index = preferred_pluggable_index or 0 + dsc_group.id.group_index = 0 + dsc_group.group_size = 4 + dsc_group.group_capacity_gbps = 400.0 + dsc_group.subcarrier_spacing_mhz = 75.0 + + # Add sample subcarrier configurations + for i in range(2): + subcarrier = dsc_group.subcarriers.add() + subcarrier.id.group.pluggable.device.device_uuid.uuid = device_uuid + subcarrier.id.group.pluggable.pluggable_index = preferred_pluggable_index or 0 + subcarrier.id.group.group_index = 0 + subcarrier.id.subcarrier_index = i + subcarrier.active = True + subcarrier.target_output_power_dbm = -10.0 + subcarrier.center_frequency_hz = 193100000000000 + (i * 75000000) # 193.1 THz + spacing + subcarrier.symbol_rate_baud = 64000000000 # 64 GBaud + + return _request + + +########################### +# ListPluggablesRequest +########################### + +def create_list_pluggables_request( + device_uuid: Optional[str] = None, + view_level: dscm_pluggable_pb2.View = dscm_pluggable_pb2.VIEW_FULL +) -> dscm_pluggable_pb2.ListPluggablesRequest: + """ + Create a ListPluggablesRequest message. + + Args: + device_uuid: UUID of the device to filter by. If None, generates a random UUID. + view_level: View level (VIEW_CONFIG, VIEW_STATE, VIEW_FULL, VIEW_UNSPECIFIED) + + Returns: + ListPluggablesRequest message + """ + _request = dscm_pluggable_pb2.ListPluggablesRequest() + + if device_uuid is None: + device_uuid = "9bbf1937-db9e-45bc-b2c6-3214a9d42157" + # device_uuid = str(uuid.uuid4()) + _request.device.device_uuid.uuid = device_uuid + _request.view_level = view_level + + return _request + + +########################### +# GetPluggableRequest +########################### + +def create_get_pluggable_request( + device_uuid: str, + pluggable_index: int, + view_level: dscm_pluggable_pb2.View = dscm_pluggable_pb2.VIEW_FULL +) -> dscm_pluggable_pb2.GetPluggableRequest: + """ + Create a GetPluggableRequest message. + + Args: + device_uuid: UUID of the device + pluggable_index: Index of the pluggable + view_level: View level (VIEW_CONFIG, VIEW_STATE, VIEW_FULL, VIEW_UNSPECIFIED) + + Returns: + GetPluggableRequest message + """ + _request = dscm_pluggable_pb2.GetPluggableRequest() + _request.id.device.device_uuid.uuid = device_uuid + _request.id.pluggable_index = pluggable_index + _request.view_level = view_level + return _request + + +########################### +# DeletePluggableRequest +########################### + +def create_delete_pluggable_request( + device_uuid: str, + pluggable_index: int +) -> dscm_pluggable_pb2.DeletePluggableRequest: + """ + Create a DeletePluggableRequest message. + + Args: + device_uuid: UUID of the device + pluggable_index: Index of the pluggable + + Returns: + DeletePluggableRequest message + """ + _request = dscm_pluggable_pb2.DeletePluggableRequest() + _request.id.device.device_uuid.uuid = device_uuid + _request.id.pluggable_index = pluggable_index + + return _request + + +########################### +# ConfigurePluggableRequest +########################### + +def create_configure_pluggable_request( + device_uuid: str, + pluggable_index: int, + update_mask_paths: Optional[list] = None, + view_level: dscm_pluggable_pb2.View = dscm_pluggable_pb2.VIEW_FULL, # pyright: ignore[reportInvalidTypeForm] + apply_timeout_seconds: int = 30, + parameters: Optional[List[Dict[str, Any]]] = [], +) -> dscm_pluggable_pb2.ConfigurePluggableRequest: # pyright: ignore[reportInvalidTypeForm] + """ + Create a ConfigurePluggableRequest message. + + Args: + device_uuid: UUID of the device + pluggable_index: Index of the pluggable + update_mask_paths: List of field paths to update. If None, updates all fields. + view_level: View level for response + apply_timeout_seconds: Timeout in seconds for applying configuration + + Returns: + ConfigurePluggableRequest message + """ + _request = dscm_pluggable_pb2.ConfigurePluggableRequest() + + # Set pluggable configuration + _request.config.id.device.device_uuid.uuid = device_uuid + _request.config.id.pluggable_index = pluggable_index + + # Add DSC group configuration + group_1 = _request.config.dsc_groups.add() + group_1.id.pluggable.device.device_uuid.uuid = device_uuid + group_1.id.pluggable.pluggable_index = pluggable_index + group_1.id.group_index = 0 + group_1.group_size = 2 + group_1.group_capacity_gbps = 400.0 + group_1.subcarrier_spacing_mhz = 75.0 + + # Add digital-subcarrier configuration (to group group_1) + subcarrier_1 = group_1.subcarriers.add() + subcarrier_1.id.group.pluggable.device.device_uuid.uuid = device_uuid + subcarrier_1.id.group.pluggable.pluggable_index = pluggable_index + subcarrier_1.id.group.group_index = 0 + subcarrier_1.id.subcarrier_index = 0 + subcarrier_1.active = True + subcarrier_1.target_output_power_dbm = -10.0 + subcarrier_1.center_frequency_hz = 193100000000000 # 193.1 THz + subcarrier_1.symbol_rate_baud = 64000000000 # 64 GBaud + + # Add another digital-subcarrier configuration (to group group_1) + subcarrier_2 = group_1.subcarriers.add() + subcarrier_2.id.group.pluggable.device.device_uuid.uuid = device_uuid + subcarrier_2.id.group.pluggable.pluggable_index = pluggable_index + subcarrier_2.id.group.group_index = 0 + subcarrier_2.id.subcarrier_index = 1 + subcarrier_2.active = True + subcarrier_2.target_output_power_dbm = -10.0 + subcarrier_2.center_frequency_hz = 193100075000000 # 193.175 THz + subcarrier_2.symbol_rate_baud = 64000000000 # 64 GBaud + + # Set update mask if provided + if update_mask_paths: + _request.update_mask.paths.extend(update_mask_paths) + + _request.view_level = view_level + _request.apply_timeout_seconds = apply_timeout_seconds + + return _request -- GitLab From 9d6230c170ee65dce2b0bc36f38e36d6cb192194 Mon Sep 17 00:00:00 2001 From: armingol Date: Fri, 24 Oct 2025 12:04:17 +0000 Subject: [PATCH 012/111] Refactor service handling and logging: streamline TAPI LSP processing, enhance endpoint handling, and improve logging for better traceability --- src/common/tests/MockServicerImpl_Context.py | 22 +++-- src/device/service/drivers/emulated/Tools.py | 7 +- .../drivers/ietf_l3vpn/templates/tools.py | 2 +- .../service/drivers/transport_api/Tools.py | 96 +++++++++++++++++++ .../transport_api/TransportApiDriver.py | 39 +++++--- .../ServiceHandlerFactory.py | 20 +--- .../service_handler_api/SettingsHandler.py | 11 +-- .../service/service_handler_api/Tools.py | 1 - .../service/service_handlers/__init__.py | 2 +- .../tapi_lsp/Tapi_LSPServiceHandler.py | 10 +- 10 files changed, 152 insertions(+), 58 deletions(-) diff --git a/src/common/tests/MockServicerImpl_Context.py b/src/common/tests/MockServicerImpl_Context.py index 310eb92b5..01ad62ce2 100644 --- a/src/common/tests/MockServicerImpl_Context.py +++ b/src/common/tests/MockServicerImpl_Context.py @@ -315,8 +315,8 @@ class MockServicerImpl_Context(ContextServiceServicer): if exclude_config_rules: del reply_device.device_config.config_rules[:] # pylint: disable=no-member if exclude_components: del reply_device.components[:] # pylint: disable=no-member devices.append(reply_device) - - reply = DeviceList(devices=devices) + + reply = DeviceList(devices=devices) LOGGER.debug('[SelectDevice] reply={:s}'.format(grpc_message_to_json_string(reply))) return reply @@ -468,13 +468,13 @@ class MockServicerImpl_Context(ContextServiceServicer): container_name = 'slice[{:s}]'.format(str(slice_id.context_id.context_uuid.uuid)) slice_uuid = slice_id.slice_uuid.uuid container_entry_uuids.setdefault(container_name, set()).add(slice_uuid) - + exclude_endpoint_ids = not request.include_endpoint_ids exclude_constraints = not request.include_constraints exclude_service_ids = not request.include_service_ids - exclude_subslice_ids = not request.include_subslice_ids + exclude_subslice_ids = not request.include_subslice_ids exclude_config_rules = not request.include_config_rules - + slices = list() for container_name in sorted(container_entry_uuids.keys()): entry_uuids = container_entry_uuids[container_name] @@ -487,7 +487,7 @@ class MockServicerImpl_Context(ContextServiceServicer): if exclude_subslice_ids : del reply_slice.slice_subslice_ids[:] # pylint: disable=no-member if exclude_config_rules: del reply_slice.slice_config .config_rules[:] # pylint: disable=no-member slices.append(reply_slice) - + reply = SliceList(slices=slices) LOGGER.debug('[SelectSlice] reply={:s}'.format(grpc_message_to_json_string(reply))) return reply @@ -563,23 +563,25 @@ class MockServicerImpl_Context(ContextServiceServicer): container_name = 'service[{:s}]'.format(str(service_id.context_id.context_uuid.uuid)) service_uuid = service_id.service_uuid.uuid container_entry_uuids.setdefault(container_name, set()).add(service_uuid) - + exclude_endpoint_ids = not request.include_endpoint_ids exclude_constraints = not request.include_constraints exclude_config_rules = not request.include_config_rules - + services = list() for container_name in sorted(container_entry_uuids.keys()): entry_uuids = container_entry_uuids[container_name] for service in self.obj_db.select_entries(container_name, entry_uuids): + LOGGER.debug('service={:s}'.format(grpc_message_to_json_string(service))) reply_service = Service() reply_service.CopyFrom(service) if exclude_endpoint_ids: del reply_service.service_endpoint_ids[:] # pylint: disable=no-member if exclude_constraints : del reply_service.service_constraints[:] # pylint: disable=no-member if exclude_config_rules: del reply_service.service_config.config_rules[:] # pylint: disable=no-member services.append(reply_service) - - reply = ServiceList(services=services) + + + reply = ServiceList(services=services) LOGGER.debug('[SelectService] reply={:s}'.format(grpc_message_to_json_string(reply))) return reply diff --git a/src/device/service/drivers/emulated/Tools.py b/src/device/service/drivers/emulated/Tools.py index d65e2ff1d..1ddc2f78d 100644 --- a/src/device/service/drivers/emulated/Tools.py +++ b/src/device/service/drivers/emulated/Tools.py @@ -47,6 +47,9 @@ def compose_resource_endpoint(endpoint_data : Dict[str, Any]) -> Optional[Tuple[ process_optional_string_field(endpoint_data, 'context_uuid', endpoint_resource_value) process_optional_string_field(endpoint_data, 'topology_uuid', endpoint_resource_value) + if 'name' not in endpoint_resource_value: + endpoint_resource_value['name'] = endpoint_uuid + # Check endpoint sample types (optional) endpoint_sample_types = chk_attribute('sample_types', endpoint_data, 'endpoint_data', default=[]) chk_type('endpoint_data.sample_types', endpoint_sample_types, list) @@ -79,7 +82,7 @@ def compose_resource_endpoint(endpoint_data : Dict[str, Any]) -> Optional[Tuple[ if len(sample_types) > 0: endpoint_resource_value['sample_types'] = sample_types - + if 'location' in endpoint_data: endpoint_resource_value['location'] = endpoint_data['location'] @@ -102,7 +105,7 @@ def compose_resource_endpoint(endpoint_data : Dict[str, Any]) -> Optional[Tuple[ endpoint_resource_value["ipv4_lan_prefixes"] = endpoint_data[ "ipv4_lan_prefixes" ] - + return endpoint_resource_key, endpoint_resource_value except: # pylint: disable=bare-except LOGGER.exception('Problem composing endpoint({:s})'.format(str(endpoint_data))) diff --git a/src/device/service/drivers/ietf_l3vpn/templates/tools.py b/src/device/service/drivers/ietf_l3vpn/templates/tools.py index dbc2e6fa1..8ae98a7ec 100644 --- a/src/device/service/drivers/ietf_l3vpn/templates/tools.py +++ b/src/device/service/drivers/ietf_l3vpn/templates/tools.py @@ -338,7 +338,7 @@ def tapi_tequest(resource_value): executor.submit(process_uuid, service, url) def build_tapi_connectivity(service_data): - logging.info(f"Building TAPI connectivity for services data: {service_data}") + LOGGER.info(f"Building TAPI connectivity for services data: {service_data}") outputs = [] urls = [] rules_set = service_data[1]["rule_set"] diff --git a/src/device/service/drivers/transport_api/Tools.py b/src/device/service/drivers/transport_api/Tools.py index e2906ff35..040f8182f 100644 --- a/src/device/service/drivers/transport_api/Tools.py +++ b/src/device/service/drivers/transport_api/Tools.py @@ -16,6 +16,8 @@ import json, logging, operator, requests from requests.auth import HTTPBasicAuth from typing import Optional from device.service.driver_api._Driver import RESOURCE_ENDPOINTS, RESOURCE_SERVICES +from concurrent.futures import ThreadPoolExecutor +executor = ThreadPoolExecutor() LOGGER = logging.getLogger(__name__) @@ -196,3 +198,97 @@ def delete_connectivity_service(root_url, uuid, auth : Optional[HTTPBasicAuth] = LOGGER.error(msg.format(str(uuid), str(response.status_code), str(response))) results.append(response.status_code in HTTP_OK_CODES) return results + +def tapi_tequest(resource_value): + + services, urls = build_tapi_connectivity(resource_value) + for service, url in zip(services, urls): + LOGGER.info(f"Services to be processed: {json.dumps(service, indent=2)}") + LOGGER.info(f"URL to be used: {url}") + + executor.submit(process_uuid, service, url) + +def process_uuid(service, url): + headers = { + "Content-Type": "application/json", + "Accept": "application/json" + } + + LOGGER.info(f"Processing service {service} to URL: {url}") + try: + response = 200 + # requests.post(url = url, json=service, headers=headers, timeout=300) + LOGGER.info("Response Status code: %s", response) + except requests.exceptions.RequestException as e: + LOGGER.info(f"ERROR equest to {service} failed: {e}") + +def build_tapi_connectivity(service_data): + LOGGER.info(f"Building TAPI connectivity for services data: {service_data}") + outputs = [] + urls = [] + rules_set = service_data[1]["rule_set"] + for rule_set in rules_set: + direction = rule_set["direction"] + layer_name = rule_set["layer_protocol_name"] + layer_qualifier = rule_set["layer_protocol_qualifier"] + urls.append(rule_set["url"]) + cs = { + "uuid": rule_set["uuid"], + "connectivity-direction": direction, + "layer-protocol-name": layer_name, + "layer-protocol-qualifier": layer_qualifier, + "end-point": [] + } + + endpoints = [] + if direction == "UNIDIRECTIONAL": + endpoints.append({ + "layer-protocol-name": layer_name, + "layer-protocol-qualifier": layer_qualifier, + "service-interface-point": {"service-interface-point-uuid": rule_set["input_sip"]}, + "direction:": "INPUT", + "local-id": rule_set["input_sip"] + }) + endpoints.append({ + "layer-protocol-name": layer_name, + "layer-protocol-qualifier": layer_qualifier, + "service-interface-point": {"service-interface-point-uuid": rule_set["output_sip"]}, + "direction:": "OUTPUT", + "local-id": rule_set["output_sip"] + }) + else: + for point in [rule_set["input_sip"], rule_set["output_sip"]]: + ep = { + "layer-protocol-name": layer_name, + "layer-protocol-qualifier": layer_qualifier, + "service-interface-point": {"service-interface-point-uuid": point}, + "direction:": "BIDIRECTIONAL", + "local-id": point + } + if rule_set.get("lower_frequency_mhz") != "NONE": + ep["tapi-photonic-media:media-channel-connectivity-service-end-point-spec"] = { + "mc-config": { + "spectrum": { + "frequency-constraint": { + "adjustment-granularity": rule_set.get("granularity", "NONE"), + "grid-type": rule_set.get("grid_type", "NONE") + }, + "lower-frequency": rule_set["lower_frequency_mhz"], + "upper-frequency": rule_set["upper_frequency_mhz"] + } + } + } + endpoints.append(ep) + cs["end-point"] = endpoints + + route_obj = rule_set.get("route_objective_function", "UNSPECIFIED") + cs["route-objective-function"] = route_obj if route_obj != "NONE" else "10000" + capacity_value = rule_set.get("capacity_value", "NONE") + capacity_unit = rule_set.get("capacity_unit" , "NONE") + + if capacity_value != "NONE": + cs["requested-capacity"] = { + "total-size": {"value": capacity_value, "unit": capacity_unit} + } + outputs.append({"tapi-connectivity:connectivity-service": [cs]}) + return outputs, urls diff --git a/src/device/service/drivers/transport_api/TransportApiDriver.py b/src/device/service/drivers/transport_api/TransportApiDriver.py index 02f3bccf9..6f958dc9b 100644 --- a/src/device/service/drivers/transport_api/TransportApiDriver.py +++ b/src/device/service/drivers/transport_api/TransportApiDriver.py @@ -19,7 +19,7 @@ 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 . import ALL_RESOURCE_KEYS -from .Tools import create_connectivity_service, find_key, config_getter, delete_connectivity_service +from .Tools import create_connectivity_service, find_key, config_getter, delete_connectivity_service, tapi_tequest LOGGER = logging.getLogger(__name__) @@ -84,22 +84,31 @@ class TransportApiDriver(_Driver): if len(resources) == 0: return results with self.__lock: - for resource in resources: - LOGGER.info('resource = {:s}'.format(str(resource))) + if "tapi_lsp" in str(resources): + for resource in resources: + try: + tapi_tequest(resource) + results.append((resource, True)) + except Exception as e: + MSG = "Invalid resource_value type: expected dict, got {:s}" + results.append((resource, e)) + else: + for resource in resources: + LOGGER.info('resource = {:s}'.format(str(resource))) - uuid = find_key(resource, 'uuid') - input_sip = find_key(resource, 'input_sip_uuid') - output_sip = find_key(resource, 'output_sip_uuid') - capacity_value = find_key(resource, 'capacity_value') - capacity_unit = find_key(resource, 'capacity_unit') - layer_protocol_name = find_key(resource, 'layer_protocol_name') - layer_protocol_qualifier = find_key(resource, 'layer_protocol_qualifier') - direction = find_key(resource, 'direction') + uuid = find_key(resource, 'uuid') + input_sip = find_key(resource, 'input_sip_uuid') + output_sip = find_key(resource, 'output_sip_uuid') + capacity_value = find_key(resource, 'capacity_value') + capacity_unit = find_key(resource, 'capacity_unit') + layer_protocol_name = find_key(resource, 'layer_protocol_name') + layer_protocol_qualifier = find_key(resource, 'layer_protocol_qualifier') + direction = find_key(resource, 'direction') - data = create_connectivity_service( - self.__tapi_root, uuid, input_sip, output_sip, direction, capacity_value, capacity_unit, - layer_protocol_name, layer_protocol_qualifier, timeout=self.__timeout, auth=self.__auth) - results.extend(data) + data = create_connectivity_service( + self.__tapi_root, uuid, input_sip, output_sip, direction, capacity_value, capacity_unit, + layer_protocol_name, layer_protocol_qualifier, timeout=self.__timeout, auth=self.__auth) + results.extend(data) return results @metered_subclass_method(METRICS_POOL) diff --git a/src/service/service/service_handler_api/ServiceHandlerFactory.py b/src/service/service/service_handler_api/ServiceHandlerFactory.py index dfb5065dc..cb11949f5 100644 --- a/src/service/service/service_handler_api/ServiceHandlerFactory.py +++ b/src/service/service/service_handler_api/ServiceHandlerFactory.py @@ -114,30 +114,18 @@ def get_service_handler_class( service_handler_factory : ServiceHandlerFactory, service : Service, device_and_drivers: Dict[str, Tuple[Device, Set[int]]] ) -> Optional['_ServiceHandler']: - + LOGGER.debug(f'SERVICE_HANDLER_FACTORY: Getting service handler for service: {service.service_config.config_rules}') str_service_key = grpc_message_to_json_string(service.service_id) - LOGGER.debug('Selecting service handler for service(%s)...', str(service.service_config.config_rules)) # Checks if the service is of type ipowdm - if 'ipowdm' in str(service.service_config.config_rules): - ipowdm_device_uuid = service.service_config.config_rules[0].ipowdm.endpoint_id.device_id.device_uuid.uuid - for device, _ in device_and_drivers.values(): - if device.name == ipowdm_device_uuid: - LOGGER.debug('Device(%s) supported drivers: %s', device.name, device.device_drivers) - common_device_drivers = device.device_drivers + if 'ipowdm' in str(service.service_config.config_rules): common_device_drivers = [13] # Checks if the service is of type tapi_lsp - elif 'tapi_lsp' in str(service.service_config.config_rules): - tapi_lsp_device_uuid = service.service_config.config_rules[0].tapi_lsp.endpoint_id.device_id.device_uuid.uuid - LOGGER.debug('tapi_lsp_device_uuid: %s', tapi_lsp_device_uuid) - for device, _ in device_and_drivers.values(): - if device.name == tapi_lsp_device_uuid: - - LOGGER.debug('Device(%s) supported drivers: %s', device.name, device.device_drivers) - common_device_drivers = device.device_drivers + elif 'tapi_lsp' in str(service.service_config.config_rules): common_device_drivers = [2] else: common_device_drivers = get_common_device_drivers([ device_drivers for _,device_drivers in device_and_drivers.values() ]) + LOGGER.debug('common_device_drivers={:s}'.format(str(common_device_drivers))) filter_fields = { FilterFieldEnum.SERVICE_TYPE.value : service.service_type, # must be supported diff --git a/src/service/service/service_handler_api/SettingsHandler.py b/src/service/service/service_handler_api/SettingsHandler.py index 1342de707..cbcf13f5f 100644 --- a/src/service/service/service_handler_api/SettingsHandler.py +++ b/src/service/service/service_handler_api/SettingsHandler.py @@ -67,7 +67,7 @@ class SettingsHandler: endpoint_name, endpoint_index = extract_endpoint_index(endpoint_uuid) TAPI_LSP_KEY_TEMPLATE = '/device[{:s}]/endpoint[{:s}]/subindex[{:d}]/tapi_lsp' key_or_path = TAPI_LSP_KEY_TEMPLATE.format(device_uuid, endpoint_name, endpoint_index) - value = config_rule.tapi_lsp + value = grpc_message_to_json(config_rule.tapi_lsp) else: MSG = 'Unsupported Kind({:s}) in ConfigRule({:s})' @@ -182,7 +182,6 @@ class SettingsHandler: return ipowdms def get_endpoint_tapi_lsp(self, device : Device, endpoint : EndPoint) -> List [Tuple]: - endpoint_name = endpoint.name device_keys = device.device_id.device_uuid.uuid, device.name endpoint_keys = endpoint.endpoint_id.endpoint_uuid.uuid, endpoint.name tapi_lsps = [] @@ -192,20 +191,20 @@ class SettingsHandler: endpoint_settings_uri = '/device[{:s}]/endpoint[{:s}]'.format(device_key, endpoint_key) endpoint_settings = self.get(endpoint_settings_uri) if endpoint_settings is None: continue - TAPI_LSP_KEY_TEMPLATE = '/device[{:s}]/endpoint[{:s}]/'.format(device_key, endpoint_name) + TAPI_LSP_KEY_TEMPLATE = '/device[{:s}]/endpoint[{:s}]/'.format(device_key, endpoint_key) results = dump_subtree(endpoint_settings) + LOGGER.debug('Dumped subtree results: %s', results) for res_key, res_value in results: LOGGER.debug('Checking res_key %s', res_key) + LOGGER.debug('Checking res_value %s', res_value) + if not res_key.startswith(TAPI_LSP_KEY_TEMPLATE): LOGGER.debug('Skipping res_key %s not starting with %s', res_key, TAPI_LSP_KEY_TEMPLATE) continue if not "tapi_lsp" in res_key: LOGGER.debug('Skipping res_key %s not containing tapi_lsp', res_key) continue - if isinstance(res_value, str): - res_value = grpc_message_to_json(res_value, use_integers_for_enums=True) - tapi_lsps.append((res_key, res_value)) setinterface_index = extract_index(res_value) LOGGER.debug('setinterface_index = %d', setinterface_index) if not 'subindex[{:d}]'.format(setinterface_index) in res_key: diff --git a/src/service/service/service_handler_api/Tools.py b/src/service/service/service_handler_api/Tools.py index 92dfa59f2..c86fbd842 100644 --- a/src/service/service/service_handler_api/Tools.py +++ b/src/service/service/service_handler_api/Tools.py @@ -69,7 +69,6 @@ def extract_endpoint_index(endpoint_name : str, default_index=0) -> Tuple[str, i return endpoint_name, index def extract_index(res_value : Any) -> int: - res_value = grpc_message_to_json(res_value,use_integers_for_enums=True) endpoint = res_value['endpoint_id']['endpoint_uuid']['uuid'] endpoint = endpoint[1].split("'}") _ , index = extract_endpoint_index(endpoint[0]) diff --git a/src/service/service/service_handlers/__init__.py b/src/service/service/service_handlers/__init__.py index f016c8d47..1d274490f 100644 --- a/src/service/service/service_handlers/__init__.py +++ b/src/service/service/service_handlers/__init__.py @@ -203,7 +203,7 @@ SERVICE_HANDLERS = [ (Tapi_LSPServiceHandler, [ { FilterFieldEnum.SERVICE_TYPE : ServiceTypeEnum.SERVICETYPE_TAPI_LSP, - FilterFieldEnum.DEVICE_DRIVER : [DeviceDriverEnum.DEVICEDRIVER_IETF_L3VPN], + FilterFieldEnum.DEVICE_DRIVER : [DeviceDriverEnum.DEVICEDRIVER_TRANSPORT_API], } ]) ] diff --git a/src/service/service/service_handlers/tapi_lsp/Tapi_LSPServiceHandler.py b/src/service/service/service_handlers/tapi_lsp/Tapi_LSPServiceHandler.py index b0a5ef8a3..4c95efe3f 100644 --- a/src/service/service/service_handlers/tapi_lsp/Tapi_LSPServiceHandler.py +++ b/src/service/service/service_handlers/tapi_lsp/Tapi_LSPServiceHandler.py @@ -66,12 +66,10 @@ class Tapi_LSPServiceHandler(_ServiceHandler): endpoint_obj = get_endpoint_matching(device_obj, endpoint_uuid) endpoint_tapi_lsp = self.__settings_handler.get_endpoint_tapi_lsp(device_obj, endpoint_obj) - for _, endpoint in endpoint_tapi_lsp: - LOGGER.debug("[SetEndpoint] Found endpoint: %s", endpoint) - if endpoint.endpoint_id.device_id.device_uuid.uuid != "TFS-PACKET":continue - - LOGGER.debug("[SetEndpoint] endpoint_ipowdm: %s", endpoint_tapi_lsp) - + LOGGER.debug("DATA {%s}", endpoint_tapi_lsp) + # for _, endpoint in endpoint_tapi_lsp: + # LOGGER.debug("[SetEndpoint] Found endpoint: %s", endpoint) + # if endpoint.endpoint_id.device_id.device_uuid.uuid != "TFS-PACKET":continue endpoint_name = endpoint_obj.name LOGGER.debug("[SetEndpoint] Endpoint name: %s", endpoint_name) -- GitLab From f22e882fc3a99ebd5e9b1b32070269f9a76f820b Mon Sep 17 00:00:00 2001 From: armingol Date: Sun, 26 Oct 2025 09:14:48 +0000 Subject: [PATCH 013/111] Refactor IetfL3VpnDriver and OpticalTfsDriver: remove unused TAPI LSP handling, streamline resource processing, and enhance logging; delete obsolete JSON and tool files --- .../drivers/ietf_l3vpn/IetfL3VpnDriver.py | 10 +- .../drivers/ietf_l3vpn/templates/tools.py | 96 ------------------- .../drivers/optical_tfs/OpticalTfsDriver.py | 31 ++---- .../drivers/optical_tfs/templates/lsp.json | 52 ---------- .../drivers/optical_tfs/templates/tools.py | 78 --------------- .../service/drivers/transport_api/Tools.py | 3 +- src/nbi/service/e2e_services/Resources.py | 6 +- .../tapi_lsp/Tapi_LSPServiceHandler.py | 16 ++-- 8 files changed, 22 insertions(+), 270 deletions(-) delete mode 100644 src/device/service/drivers/optical_tfs/templates/lsp.json delete mode 100644 src/device/service/drivers/optical_tfs/templates/tools.py diff --git a/src/device/service/drivers/ietf_l3vpn/IetfL3VpnDriver.py b/src/device/service/drivers/ietf_l3vpn/IetfL3VpnDriver.py index 6e9071017..08f34b8ad 100644 --- a/src/device/service/drivers/ietf_l3vpn/IetfL3VpnDriver.py +++ b/src/device/service/drivers/ietf_l3vpn/IetfL3VpnDriver.py @@ -27,7 +27,7 @@ from .handlers.SubscriptionHandler import ( from .Constants import SPECIAL_RESOURCE_MAPPINGS from .TfsApiClient import TfsApiClient from .Tools import compose_resource_endpoint -from .templates.tools import create_request, tapi_tequest +from .templates.tools import create_request LOGGER = logging.getLogger(__name__) @@ -199,14 +199,6 @@ class IetfL3VpnDriver(_Driver): except Exception as e: MSG = 'Invalid resource_value type: expected dict, got {:s}' results.append((resource, e)) - elif "tapi_lsp" in str(resources): - for resource in resources: - try: - tapi_tequest(resource) - results.append((resource, True)) - except Exception as e: - MSG = "Invalid resource_value type: expected dict, got {:s}" - results.append((resource, e)) else: for resource in resources: resource_key, resource_value = resource diff --git a/src/device/service/drivers/ietf_l3vpn/templates/tools.py b/src/device/service/drivers/ietf_l3vpn/templates/tools.py index 8ae98a7ec..a9e6684ec 100644 --- a/src/device/service/drivers/ietf_l3vpn/templates/tools.py +++ b/src/device/service/drivers/ietf_l3vpn/templates/tools.py @@ -313,99 +313,3 @@ def patch_optical_channel_frequency(data, DEVICE_ID): headers=HEADERS) assert response.status_code == 200 return response - -def process_uuid(service, url): - headers = { - "Content-Type": "application/json", - "Accept": "application/json" - } - - LOGGER.info(f"Processing service {service} to URL: {url}") - try: - response = 200 - # requests.post(url = url, json=service, headers=headers, timeout=300) - LOGGER.info("Response Status code: %s", response) - except requests.exceptions.RequestException as e: - LOGGER.info(f"ERROR equest to {service} failed: {e}") - -def tapi_tequest(resource_value): - - services, urls = build_tapi_connectivity(resource_value) - for service, url in zip(services, urls): - LOGGER.info(f"Services to be processed: {json.dumps(service, indent=2)}") - LOGGER.info(f"URL to be used: {url}") - - executor.submit(process_uuid, service, url) - -def build_tapi_connectivity(service_data): - LOGGER.info(f"Building TAPI connectivity for services data: {service_data}") - outputs = [] - urls = [] - rules_set = service_data[1]["rule_set"] - for rule_set in rules_set: - direction = rule_set["direction"] - layer_name = rule_set["layer_protocol_name"] - layer_qualifier = rule_set["layer_protocol_qualifier"] - urls.append(rule_set["url"]) - cs = { - "uuid": rule_set["tenant_uuid"], - "connectivity-direction": direction, - "layer-protocol-name": layer_name, - "layer-protocol-qualifier": layer_qualifier, - "end-point": [] - } - - endpoints = [] - if direction == "UNIDIRECTIONAL": - endpoints.append({ - "layer-protocol-name": layer_name, - "layer-protocol-qualifier": layer_qualifier, - "service-interface-point": {"service-interface-point-uuid": rule_set["src"]}, - "direction:": "INPUT", - "local-id": rule_set["src"] - }) - endpoints.append({ - "layer-protocol-name": layer_name, - "layer-protocol-qualifier": layer_qualifier, - "service-interface-point": {"service-interface-point-uuid": rule_set["dst"]}, - "direction:": "OUTPUT", - "local-id": rule_set["dst"] - }) - else: - for point in [rule_set["src"], rule_set["dst"]]: - ep = { - "layer-protocol-name": layer_name, - "layer-protocol-qualifier": layer_qualifier, - "service-interface-point": {"service-interface-point-uuid": point}, - "direction:": "BIDIRECTIONAL", - "local-id": point - } - if rule_set.get("lower_frequency_mhz") != "NONE": - ep["tapi-photonic-media:media-channel-connectivity-service-end-point-spec"] = { - "mc-config": { - "spectrum": { - "frequency-constraint": { - "adjustment-granularity": rule_set.get("granularity", "NONE"), - "grid-type": rule_set.get("grid_type", "NONE") - }, - "lower-frequency": rule_set["lower_frequency_mhz"], - "upper-frequency": rule_set["upper_frequency_mhz"] - } - } - } - endpoints.append(ep) - cs["end-point"] = endpoints - - route_obj = rule_set.get("route_objective_function", "UNSPECIFIED") - cs["route-objective-function"] = route_obj if route_obj != "NONE" else "10000" - capacity = rule_set.get("capacity", "NONE") - if capacity != "NONE": - parts = capacity.split("-") - value = parts[0] - unit = parts[1] if len(parts) > 1 else "" - cs["requested-capacity"] = { - "total-size": {"value": value, "unit": unit} - } - outputs.append({"tapi-connectivity:connectivity-service": [cs]}) - return outputs, urls - diff --git a/src/device/service/drivers/optical_tfs/OpticalTfsDriver.py b/src/device/service/drivers/optical_tfs/OpticalTfsDriver.py index f3da49302..15e4a593b 100644 --- a/src/device/service/drivers/optical_tfs/OpticalTfsDriver.py +++ b/src/device/service/drivers/optical_tfs/OpticalTfsDriver.py @@ -20,7 +20,6 @@ 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 .TfsApiClient import TfsApiClient -from .templates.tools import create_request #from .TfsOpticalClient import TfsOpticalClient LOGGER = logging.getLogger(__name__) @@ -119,27 +118,15 @@ class OpticalTfsDriver(_Driver): with self.__lock: self.tac.check_credentials() for resource in resources: - LOGGER.info('resource = {:s}'.format(str(resource))) - if 'tapi_lsp' in str(resource): - LOGGER.info('Processing tapi_lsp resource') - try: - create_request(resource) - LOGGER.info('Request created successfully') - results.append((resource, True)) - except Exception as e: - MSG = 'Invalid resource_value type: expected dict, got {:s}' - results.append((resource, e)) - else: - LOGGER.info('Processing non-tapi_lsp resource') - resource_key, resource_value = resource - try: - resource_value = json.loads(resource_value) - self.tac.setup_service(resource_value) - results.append((resource_key, True)) - except Exception as e: - MSG = 'Unhandled error processing resource_key({:s})' - LOGGER.exception(MSG.format(str(resource_key))) - results.append((resource_key, e)) + resource_key, resource_value = resource + try: + resource_value = json.loads(resource_value) + self.tac.setup_service(resource_value) + results.append((resource_key, True)) + except Exception as e: + MSG = 'Unhandled error processing resource_key({:s})' + LOGGER.exception(MSG.format(str(resource_key))) + results.append((resource_key, e)) return results @metered_subclass_method(METRICS_POOL) diff --git a/src/device/service/drivers/optical_tfs/templates/lsp.json b/src/device/service/drivers/optical_tfs/templates/lsp.json deleted file mode 100644 index 612005039..000000000 --- a/src/device/service/drivers/optical_tfs/templates/lsp.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "tapi-connectivity:connectivity-service" : [ - { - "connectivity-direction" : "", - "end-point" : [ - { - "direction" : "", - "layer-protocol-name" : "", - "layer-protocol-qualifier" : "", - "local-id" : "", - "service-interface-point" : { - "service-interface-point-uuid" : "" - }, - - "tapi-photonic-media:media-channel-connectivity-service-end-point-spec":{ - "mc-config":{ - "spectrum":{ - "lower-frequency": "", - "upper-frequency": "", - "frequency-constraint":{ - "adjustment-granularity" : "", - "grid-type": "" - } - } - } - } - }, - { - "direction" : "", - "layer-protocol-name" : "", - "layer-protocol-qualifier" : "", - "local-id" : "", - "service-interface-point" : { - "service-interface-point-uuid" : "" - } - } - ], - "layer-protocol-name" : "", - "layer-protocol-qualifier" : "", - "requested-capacity" : { - "total-size" : { - "unit" : "", - "value" : "" - } - }, - "include-link":[ - ], - "route-objective-function" : "10000", - "uuid" : "" - } - ] -} \ No newline at end of file diff --git a/src/device/service/drivers/optical_tfs/templates/tools.py b/src/device/service/drivers/optical_tfs/templates/tools.py deleted file mode 100644 index 9558fb951..000000000 --- a/src/device/service/drivers/optical_tfs/templates/tools.py +++ /dev/null @@ -1,78 +0,0 @@ -# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 -import logging -import os -import requests - -LOGGER = logging.getLogger(__name__) - -""" Create and send HTTP request based on a JSON template and provided resource value. - The JSON template is expected to be in the same directory as this script, named 'lsp.json'.""" -def create_request(resource_value): - LOGGER.info("Creating request tapi- lsp for resource_value: %s", resource_value) - try: - BaseDir = os.path.dirname(os.path.abspath(__file__)) - json_path = os.path.join(BaseDir, 'lsp.json') - with open(json_path, 'r', encoding='utf-8') as f: - template = json.load(f) - rule_set = resource_value[1]['rule_set'] - svc = template["tapi-connectivity:connectivity-service"][0] - svc["connectivity-direction"] = rule_set["direction"] - svc["layer-protocol-name"] = rule_set["layer_protocol_name"] - svc["layer-protocol-qualifier"] = rule_set["layer_protocol_qualifier"] - svc["requested-capacity"]["total-size"]["unit"] = "GHz" - svc["requested-capacity"]["total-size"]["value"] = rule_set["bw"] - svc["include-link"] = rule_set["link_uuid_path"] - svc["uuid"] = rule_set["uuid"] - - # src - end-point - ep0 = svc["end-point"][0] - ep0["service-interface-point"]["service-interface-point-uuid"] = rule_set["src"] - ep0["direction"] = rule_set["direction"] - ep0["layer-protocol-name"] = rule_set["layer_protocol_name"] - ep0["layer-protocol-qualifier"] = rule_set["layer_protocol_qualifier"] - ep0["local-id"] = rule_set["src"] - - # Accede correctamente a espectro anidado - media_spec = ep0["tapi-photonic-media:media-channel-connectivity-service-end-point-spec"] - mc_config = media_spec["mc-config"] - spectrum = mc_config["spectrum"] - spectrum["lower-frequency"] = rule_set["lower_frequency_mhz"] - spectrum["upper-frequency"] = rule_set["upper_frequency_mhz"] - spectrum["frequency-constraint"]["adjustment-granularity"] = rule_set["granularity"] - spectrum["frequency-constraint"]["grid-type"] = rule_set["grid_type"] - - tenant = rule_set["tenant_uuid"] - - # dst - end-point - ep1 = svc["end-point"][1] - ep1["service-interface-point"]["service-interface-point-uuid"] = rule_set["dst"] - ep1["direction"] = rule_set["direction"] - ep1["layer-protocol-name"] = rule_set["layer_protocol_name"] - ep1["layer-protocol-qualifier"] = rule_set["layer_protocol_qualifier"] - ep1["local-id"] = rule_set["dst"] - - url = f"http://11.1.1.101:4900/{tenant}/restconf/data/tapi-common:context/tapi-connectivity:connectivity-context" - headers = { - "Content-Type": "application/json", - "Accept": "application/json" - } - response = requests.post(url, headers=headers, json=template, timeout=10) - return response - - except (OSError, json.JSONDecodeError, requests.RequestException) as e: - LOGGER.error("Error creating request: %s", str(e)) - diff --git a/src/device/service/drivers/transport_api/Tools.py b/src/device/service/drivers/transport_api/Tools.py index 040f8182f..a75aab443 100644 --- a/src/device/service/drivers/transport_api/Tools.py +++ b/src/device/service/drivers/transport_api/Tools.py @@ -216,8 +216,7 @@ def process_uuid(service, url): LOGGER.info(f"Processing service {service} to URL: {url}") try: - response = 200 - # requests.post(url = url, json=service, headers=headers, timeout=300) + response = requests.post(url = url, json=service, headers=headers, timeout=300) LOGGER.info("Response Status code: %s", response) except requests.exceptions.RequestException as e: LOGGER.info(f"ERROR equest to {service} failed: {e}") diff --git a/src/nbi/service/e2e_services/Resources.py b/src/nbi/service/e2e_services/Resources.py index 641c7d8fb..cb734df5b 100644 --- a/src/nbi/service/e2e_services/Resources.py +++ b/src/nbi/service/e2e_services/Resources.py @@ -103,10 +103,10 @@ class E2EInfoDelete(Resource): def delete_slice(key, headers): url_delete_slice = f'http://172.24.36.54:4900/restconf/data/tapi-common:context/tapi-connectivity:connectivity-context/connectivity-service={key}' try: - # response = requests.delete(url=url_delete_slice, headers=headers, timeout=300) + response = requests.delete(url=url_delete_slice, headers=headers, timeout=300) LOGGER.info("Key: %s", key) - # LOGGER.info("Response Status code: %s", response.status_code) - # LOGGER.info("Response Text: %s", response.text) + LOGGER.info("Response Status code: %s", response.status_code) + LOGGER.info("Response Text: %s", response.text) except requests.exceptions.RequestException as e: LOGGER.info(f"ERROR request to delete slice {key} failed: {e}") diff --git a/src/service/service/service_handlers/tapi_lsp/Tapi_LSPServiceHandler.py b/src/service/service/service_handlers/tapi_lsp/Tapi_LSPServiceHandler.py index 4c95efe3f..f2e1b1de1 100644 --- a/src/service/service/service_handlers/tapi_lsp/Tapi_LSPServiceHandler.py +++ b/src/service/service/service_handlers/tapi_lsp/Tapi_LSPServiceHandler.py @@ -55,21 +55,22 @@ class Tapi_LSPServiceHandler(_ServiceHandler): results = [] for endpoint in endpoints: - LOGGER.debug("[SetEndpoint] Processing endpoint tuple: %s", endpoint) try: device_uuid, endpoint_uuid = get_device_endpoint_uuids(endpoint) LOGGER.debug("[SetEndpoint] Device UUID: %s | Endpoint UUID: %s", device_uuid, endpoint_uuid) device_obj = self.__task_executor.get_device(DeviceId(**json_device_id(device_uuid))) + device_name = str(device_obj.name).upper().strip() + LOGGER.debug("[SetEndpoint] Device name: %s", device_name) - endpoint_obj = get_endpoint_matching(device_obj, endpoint_uuid) + if "OPTICAL" not in device_name: + LOGGER.debug("[SetEndpoint] Skipping non-optical device: %s", device_name) + continue + endpoint_obj = get_endpoint_matching(device_obj, endpoint_uuid) endpoint_tapi_lsp = self.__settings_handler.get_endpoint_tapi_lsp(device_obj, endpoint_obj) - LOGGER.debug("DATA {%s}", endpoint_tapi_lsp) - # for _, endpoint in endpoint_tapi_lsp: - # LOGGER.debug("[SetEndpoint] Found endpoint: %s", endpoint) - # if endpoint.endpoint_id.device_id.device_uuid.uuid != "TFS-PACKET":continue + LOGGER.debug("[SetEndpoint] Endpoint TAPI LSP data: %s", endpoint_tapi_lsp) endpoint_name = endpoint_obj.name LOGGER.debug("[SetEndpoint] Endpoint name: %s", endpoint_name) @@ -88,7 +89,7 @@ class Tapi_LSPServiceHandler(_ServiceHandler): device_obj.device_config.config_rules.append(ConfigRule(**json_config_rule)) self.__task_executor.configure_device(device_obj) - LOGGER.info("[SetEndpoint] Configuration sent for device %s", device_uuid) + LOGGER.info("[SetEndpoint] Configuration sent for Optical Controller %s", device_uuid) else: LOGGER.warning("[SetEndpoint] No config rules generated for endpoint %s", endpoint_uuid) @@ -101,7 +102,6 @@ class Tapi_LSPServiceHandler(_ServiceHandler): LOGGER.debug("[SetEndpoint] Final results: %s", results) return results - @metered_subclass_method(METRICS_POOL) def DeleteEndpoint( self, endpoints : List[Tuple[str, str, Optional[str]]], connection_uuid : Optional[str] = None -- GitLab From 57e30257fddd0e1452c61d2d950cc4eea91cc3d4 Mon Sep 17 00:00:00 2001 From: armingol Date: Sun, 26 Oct 2025 09:22:03 +0000 Subject: [PATCH 014/111] Refactor service handling: remove unnecessary code, enhance logging, and streamline service type definitions --- src/common/tests/MockServicerImpl_Context.py | 1 - src/device/service/drivers/emulated/Tools.py | 3 --- .../service/drivers/optical_tfs/OpticalTfsDriver.py | 1 + src/nbi/service/ietf_network/YangHandler.py | 7 ------- .../service/algorithms/tools/ServiceTypes.py | 13 ++++++------- 5 files changed, 7 insertions(+), 18 deletions(-) diff --git a/src/common/tests/MockServicerImpl_Context.py b/src/common/tests/MockServicerImpl_Context.py index 01ad62ce2..2cdfac7f7 100644 --- a/src/common/tests/MockServicerImpl_Context.py +++ b/src/common/tests/MockServicerImpl_Context.py @@ -580,7 +580,6 @@ class MockServicerImpl_Context(ContextServiceServicer): if exclude_config_rules: del reply_service.service_config.config_rules[:] # pylint: disable=no-member services.append(reply_service) - reply = ServiceList(services=services) LOGGER.debug('[SelectService] reply={:s}'.format(grpc_message_to_json_string(reply))) return reply diff --git a/src/device/service/drivers/emulated/Tools.py b/src/device/service/drivers/emulated/Tools.py index 1ddc2f78d..697a5995a 100644 --- a/src/device/service/drivers/emulated/Tools.py +++ b/src/device/service/drivers/emulated/Tools.py @@ -47,9 +47,6 @@ def compose_resource_endpoint(endpoint_data : Dict[str, Any]) -> Optional[Tuple[ process_optional_string_field(endpoint_data, 'context_uuid', endpoint_resource_value) process_optional_string_field(endpoint_data, 'topology_uuid', endpoint_resource_value) - if 'name' not in endpoint_resource_value: - endpoint_resource_value['name'] = endpoint_uuid - # Check endpoint sample types (optional) endpoint_sample_types = chk_attribute('sample_types', endpoint_data, 'endpoint_data', default=[]) chk_type('endpoint_data.sample_types', endpoint_sample_types, list) diff --git a/src/device/service/drivers/optical_tfs/OpticalTfsDriver.py b/src/device/service/drivers/optical_tfs/OpticalTfsDriver.py index 15e4a593b..9cb2371b6 100644 --- a/src/device/service/drivers/optical_tfs/OpticalTfsDriver.py +++ b/src/device/service/drivers/optical_tfs/OpticalTfsDriver.py @@ -118,6 +118,7 @@ class OpticalTfsDriver(_Driver): with self.__lock: self.tac.check_credentials() for resource in resources: + LOGGER.info('resource = {:s}'.format(str(resource))) resource_key, resource_value = resource try: resource_value = json.loads(resource_value) diff --git a/src/nbi/service/ietf_network/YangHandler.py b/src/nbi/service/ietf_network/YangHandler.py index bb1998429..1e23934bc 100644 --- a/src/nbi/service/ietf_network/YangHandler.py +++ b/src/nbi/service/ietf_network/YangHandler.py @@ -38,19 +38,12 @@ class YangHandler: network = networks.create_path(f'network[network-id="{te_topology_name}"]') network.create_path('network-id', te_topology_name) - network_types = network.create_path('network-types') - network_types.create_path('ietf-l3-unicast-topology:l3-unicast-topology') - name_mappings = NameMappings() for device in topology_details.devices: - if device.name=="TFS-OPTICAL" or device.name=="TFS-PACKET": - continue self.compose_node(device, name_mappings, network) for link in topology_details.links: - if "TFS" in link.name: - continue self.compose_link(link, name_mappings, network) return json.loads(networks.print_mem('json')) diff --git a/src/pathcomp/frontend/service/algorithms/tools/ServiceTypes.py b/src/pathcomp/frontend/service/algorithms/tools/ServiceTypes.py index 405b18604..398358640 100644 --- a/src/pathcomp/frontend/service/algorithms/tools/ServiceTypes.py +++ b/src/pathcomp/frontend/service/algorithms/tools/ServiceTypes.py @@ -43,13 +43,12 @@ OPTICAL_DEVICE_TYPES = { DeviceTypeEnum.OPTICAL_TRANSPONDER, DeviceTypeEnum.EMULATED_OPTICAL_TRANSPONDER, } -SERVICE_TYPE_L2NM = {ServiceTypeEnum.SERVICETYPE_L2NM} -SERVICE_TYPE_L3NM = {ServiceTypeEnum.SERVICETYPE_L3NM} -SERVICE_TYPE_LXNM = {ServiceTypeEnum.SERVICETYPE_L3NM, ServiceTypeEnum.SERVICETYPE_L2NM} -SERVICE_TYPE_TAPI = {ServiceTypeEnum.SERVICETYPE_TAPI_CONNECTIVITY_SERVICE} -SERVICE_TYPE_IPOWDM = {ServiceTypeEnum.SERVICETYPE_IPOWDM} -SERVICE_TYPE_IP_LINK = {ServiceTypeEnum.SERVICETYPE_IP_LINK} - +SERVICE_TYPE_L2NM = {ServiceTypeEnum.SERVICETYPE_L2NM} +SERVICE_TYPE_L3NM = {ServiceTypeEnum.SERVICETYPE_L3NM} +SERVICE_TYPE_LXNM = {ServiceTypeEnum.SERVICETYPE_L3NM, ServiceTypeEnum.SERVICETYPE_L2NM} +SERVICE_TYPE_TAPI = {ServiceTypeEnum.SERVICETYPE_TAPI_CONNECTIVITY_SERVICE} +SERVICE_TYPE_IP_LINK = {ServiceTypeEnum.SERVICETYPE_IP_LINK} +SERVICE_TYPE_IPOWDM = {ServiceTypeEnum.SERVICETYPE_IPOWDM} SERVICE_TYPE_TAPI_LSP = {ServiceTypeEnum.SERVICETYPE_TAPI_LSP} def get_service_type(device_type : DeviceTypeEnum, prv_service_type : ServiceTypeEnum) -> ServiceTypeEnum: -- GitLab From 762e4740430501ffbc7f349d9e39b8cf703ac0a8 Mon Sep 17 00:00:00 2001 From: armingol Date: Sun, 26 Oct 2025 09:28:35 +0000 Subject: [PATCH 015/111] Refactor whitespace and formatting in OpenConfigDriver, Interfaces, Inventory, NetworkInstances, Tools, Networks, and YangHandler to improve code readability and maintain consistency. --- .../drivers/openconfig/OpenConfigDriver.py | 20 +++++----- .../openconfig/templates/Interfaces.py | 8 ++-- .../drivers/openconfig/templates/Inventory.py | 40 +++++++++---------- .../openconfig/templates/NetworkInstances.py | 8 ++-- .../drivers/openconfig/templates/Tools.py | 12 +++--- src/nbi/service/ietf_network/Networks.py | 2 +- src/nbi/service/ietf_network/YangHandler.py | 3 ++ 7 files changed, 48 insertions(+), 45 deletions(-) diff --git a/src/device/service/drivers/openconfig/OpenConfigDriver.py b/src/device/service/drivers/openconfig/OpenConfigDriver.py index 46931674b..e6c861e72 100644 --- a/src/device/service/drivers/openconfig/OpenConfigDriver.py +++ b/src/device/service/drivers/openconfig/OpenConfigDriver.py @@ -96,14 +96,14 @@ class NetconfSessionHandler: def use_candidate(self): return self.__candidate_supported and not self.__force_running @property - def commit_per_rule(self): return self.__commit_per_rule + def commit_per_rule(self): return self.__commit_per_rule @property def vendor(self): return self.__vendor - + @property def version(self): return self.__version - + @property def message_renderer(self): return self.__message_renderer @@ -216,18 +216,18 @@ def edit_config( if "L2VSI" in resources[0][1]: #Configure by CLI logger.warning("CLI Configuration") - cli_compose_config(resources, delete=delete, host= netconf_handler._NetconfSessionHandler__address, user=netconf_handler._NetconfSessionHandler__username, passw=netconf_handler._NetconfSessionHandler__password) + cli_compose_config(resources, delete=delete, host= netconf_handler._NetconfSessionHandler__address, user=netconf_handler._NetconfSessionHandler__username, passw=netconf_handler._NetconfSessionHandler__password) for i,resource in enumerate(resources): results.append(True) - else: + else: logger.warning("CLI Configuration CISCO INTERFACE") - cisco_interface(resources, delete=delete, host= netconf_handler._NetconfSessionHandler__address, user=netconf_handler._NetconfSessionHandler__username, passw=netconf_handler._NetconfSessionHandler__password) + cisco_interface(resources, delete=delete, host= netconf_handler._NetconfSessionHandler__address, user=netconf_handler._NetconfSessionHandler__username, passw=netconf_handler._NetconfSessionHandler__password) for i,resource in enumerate(resources): results.append(True) - elif netconf_handler.vendor == "UFISPACE": + elif netconf_handler.vendor == "UFISPACE": #Configure by CLI logger.warning("CLI Configuration: {:s}".format(resources)) - ufi_interface(resources, delete=delete) + ufi_interface(resources, delete=delete) for i,resource in enumerate(resources): results.append(True) else: @@ -241,7 +241,7 @@ def edit_config( 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) - for str_config_message in str_config_messages: # configuration of the received templates + 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( str_method, len(str_config_message), str(str_config_message))) @@ -252,7 +252,7 @@ def edit_config( 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) except Exception as e: # pylint: disable=broad-except diff --git a/src/device/service/drivers/openconfig/templates/Interfaces.py b/src/device/service/drivers/openconfig/templates/Interfaces.py index aea737100..9f8d9a585 100644 --- a/src/device/service/drivers/openconfig/templates/Interfaces.py +++ b/src/device/service/drivers/openconfig/templates/Interfaces.py @@ -39,11 +39,11 @@ def parse(xml_data : ET.Element) -> List[Tuple[str, Dict[str, Any]]]: elif xml_interface.find('oci:state/oci:type', namespaces=NAMESPACES) is not None: interface_type = xml_interface.find('oci:state/oci:type', namespaces=NAMESPACES) else: continue - + interface_name = xml_interface.find('oci:name', namespaces=NAMESPACES) if interface_name is None or interface_name.text is None: continue add_value_from_tag(interface, 'name', interface_name) - + # Get the type of interface according to the vendor's type if 'ianaift:' in interface_type.text: interface_type.text = interface_type.text.replace('ianaift:', '') #ADVA @@ -102,10 +102,10 @@ def parse(xml_data : ET.Element) -> List[Tuple[str, Dict[str, Any]]]: address = xml_ipv6_address.find('ociip:state/ociip:ip', namespaces=NAMESPACES) add_value_from_tag(subinterface, 'address_ipv6', address) - + prefix = xml_ipv6_address.find('ociip:state/ociip:prefix-length', namespaces=NAMESPACES) add_value_from_tag(subinterface, 'address_prefix_v6', prefix, cast=int) - + if len(subinterface) == 0: continue resource_key = '/interface[{:s}]/subinterface[{:s}]'.format(interface['name'], str(subinterface['index'])) response.append((resource_key, subinterface)) diff --git a/src/device/service/drivers/openconfig/templates/Inventory.py b/src/device/service/drivers/openconfig/templates/Inventory.py index d54d21d47..cfa31d9ba 100644 --- a/src/device/service/drivers/openconfig/templates/Inventory.py +++ b/src/device/service/drivers/openconfig/templates/Inventory.py @@ -25,30 +25,30 @@ XPATH_PORTS = "//ocp:components/ocp:component" #Method Name: parse #Parameters: - + - xml_data: [ET.Element] Represents the XML data to be parsed. # Functionality: The parse function of the inventerio class has the functionality to parse - an XML document represented by the xml_data parameter and extract specific - information from the XML elements, namely the relevant characteristics of the - components. + an XML document represented by the xml_data parameter and extract specific + information from the XML elements, namely the relevant characteristics of the + components. To generate the template the following steps are performed: 1) An empty list called response is created to store the results of the analysis. - 2) Iterate over the XML elements that match the pattern specified by the XPATH_PORTS + 2) Iterate over the XML elements that match the pattern specified by the XPATH_PORTS expression. These elements represent components in the XML document. 3) For each component element: - A dictionary called inventory is initialized that will store the information extracted + A dictionary called inventory is initialized that will store the information extracted from the component.The values of the relevant XML elements are extracted and added to the dictionary. -#Return: - List[Tuple[str, Dict[str, Any]]] The response list containing the tuples (path, dictionary) +#Return: + List[Tuple[str, Dict[str, Any]]] The response list containing the tuples (path, dictionary) with the information extracted from the XML document components is returned. """ @@ -59,19 +59,19 @@ def parse(xml_data : ET.Element) -> List[Tuple[str, Dict[str, Any]]]: LOGGER.info('xml_component inventario = {:s}'.format(str(ET.tostring(xml_component)))) inventory = {} inventory['parent-component-references'] = '' - inventory['name'] = '' + inventory['name'] = '' inventory['class'] = '' inventory['attributes'] = {} component_reference = [] component_name = xml_component.find('ocp:name', namespaces=NAMESPACES) if component_name is None or component_name.text is None: continue - add_value_from_tag(inventory, 'name', component_name) + add_value_from_tag(inventory, 'name', component_name) component_description = xml_component.find('ocp:state/ocp:description', namespaces=NAMESPACES) if not component_description is None: add_value_from_tag(inventory['attributes'], 'description', component_description) - + 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) @@ -79,12 +79,12 @@ def parse(xml_data : ET.Element) -> List[Tuple[str, Dict[str, Any]]]: 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: component_type.text = component_type.text.replace('oc-platform-types:','') add_value_from_tag(inventory, 'class', component_type) - + if inventory['class'] == 'CPU' or inventory['class'] == 'STORAGE': continue component_empty = xml_component.find('ocp:state/ocp:empty', namespaces=NAMESPACES) @@ -92,7 +92,7 @@ def parse(xml_data : ET.Element) -> List[Tuple[str, Dict[str, Any]]]: add_value_from_tag(inventory['attributes'], 'empty', component_empty) component_parent = xml_component.find('ocp:state/ocp:parent', namespaces=NAMESPACES) - if not component_parent is None: + if not component_parent is None: add_value_from_tag(inventory, 'parent-component-references', component_parent) component_HW = xml_component.find('ocp:state/ocp:hardware-version', namespaces=NAMESPACES) @@ -114,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'], 'mfg-name', component_mfg_name) - + component_removable = xml_component.find('ocp:state/ocp:removable', namespaces=NAMESPACES) if not component_removable is None: add_value_from_tag(inventory['attributes'], 'removable', component_removable) @@ -127,10 +127,10 @@ def parse(xml_data : ET.Element) -> List[Tuple[str, Dict[str, Any]]]: component_serial_t = xml_component.find('ocptr:transceiver/ocptr:state/ocptr:serial-no', namespaces=NAMESPACES) if not component_serial_t is None: add_value_from_tag(inventory['attributes'], 'serial-num', component_serial_t) - + component_present = xml_component.find('ocptr:transceiver/ocptr:state/ocptr:present', namespaces=NAMESPACES) if component_present is not None and 'NOT_PRESENT' in component_present.text: continue - + component_vendor = xml_component.find('ocptr:transceiver/ocptr:state/ocptr:vendor', namespaces=NAMESPACES) if not component_vendor is None: add_value_from_tag(inventory['attributes'], 'vendor', component_vendor) @@ -138,7 +138,7 @@ def parse(xml_data : ET.Element) -> List[Tuple[str, Dict[str, Any]]]: if not component_connector is None: component_connector.text = component_connector.text.replace('oc-opt-types:','') add_value_from_tag(inventory['attributes'], 'connector-type', component_connector) - + component_form = xml_component.find('ocptr:transceiver/ocptr:state/ocptr:form-factor', namespaces=NAMESPACES) if not component_form is None: component_form.text = component_form.text.replace('oc-opt-types:','') @@ -148,7 +148,7 @@ def parse(xml_data : ET.Element) -> List[Tuple[str, Dict[str, Any]]]: parent_types[inventory['parent-component-references']] = len(parent_types) + 1 component_reference.extend([parent_types[inventory['parent-component-references']]]) - + response.append(('/inventory/{:s}'.format(inventory['name']), inventory)) for tupla in response: @@ -156,5 +156,5 @@ def parse(xml_data : ET.Element) -> List[Tuple[str, Dict[str, Any]]]: component_reference.extend([tupla[1]['class']]) inventory['component-reference'] = component_reference - + return response diff --git a/src/device/service/drivers/openconfig/templates/NetworkInstances.py b/src/device/service/drivers/openconfig/templates/NetworkInstances.py index 7fee1b761..bab097d79 100644 --- a/src/device/service/drivers/openconfig/templates/NetworkInstances.py +++ b/src/device/service/drivers/openconfig/templates/NetworkInstances.py @@ -48,7 +48,7 @@ def parse(xml_data : ET.Element) -> List[Tuple[str, Dict[str, Any]]]: ni_type.text = ni_type.text.replace('oc-ni-types:','') add_value_from_tag(network_instance, 'type', ni_type) ''' - + if xml_network_instance.find('ocni:config/ocni:type', namespaces=NAMESPACES) is not None: ni_type = xml_network_instance.find('ocni:config/ocni:type', namespaces=NAMESPACES) elif xml_network_instance.find('oci:state/oci:type', namespaces=NAMESPACES) is not None: @@ -60,7 +60,7 @@ def parse(xml_data : ET.Element) -> List[Tuple[str, Dict[str, Any]]]: elif 'idx'in ni_type.text: ni_type.text = ni_type.text.replace('idx:', '') #CISCO add_value_from_tag(network_instance, 'type', ni_type) - + ni_router_id = xml_network_instance.find('ocni:config/ocni:router-id', namespaces=NAMESPACES) add_value_from_tag(network_instance, 'router_id', ni_router_id) @@ -145,10 +145,10 @@ def parse(xml_data : ET.Element) -> List[Tuple[str, Dict[str, Any]]]: 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)) diff --git a/src/device/service/drivers/openconfig/templates/Tools.py b/src/device/service/drivers/openconfig/templates/Tools.py index 2bf9535b3..dc1d9ae0c 100644 --- a/src/device/service/drivers/openconfig/templates/Tools.py +++ b/src/device/service/drivers/openconfig/templates/Tools.py @@ -33,20 +33,20 @@ def add_value_from_collection(target : Dict, field_name: str, field_value : Coll """ # Method Name: generate_templates - + # Parameters: - resource_key: [str] Variable to identify the rule to be executed. - resource_value: [str] Variable with the configuration parameters of the rule to be executed. - delete: [bool] Variable to identify whether to create or delete the rule. - vendor: [str] Variable to identify the vendor of the equipment to be configured. - + # Functionality: - This method generates the template to configure the equipment using pyangbind. + This method generates the template to configure the equipment using pyangbind. To generate the template the following steps are performed: 1) Get the first parameter of the variable "resource_key" to identify the main path of the rule. 2) Search for the specific configuration path - 3) Call the method with the configuration parameters (resource_data variable). - + 3) Call the method with the configuration parameters (resource_data variable). + # Return: [dict] Set of templates generated according to the configuration rule """ @@ -86,7 +86,7 @@ def generate_templates(resource_key: str, resource_value: str, delete: bool,vend result_templates.append(create_rp_statement(data, delete)) elif "acl_ruleset" in resource_key: # acl rules management result_templates.extend(acl_mgmt(resource_value,vendor, delete)) - else: + else: if "ip_link" in resource_key: result_templates.append(ip_link_mgmt(resource_value,vendor,delete)) diff --git a/src/nbi/service/ietf_network/Networks.py b/src/nbi/service/ietf_network/Networks.py index ec124632b..e8a69c449 100644 --- a/src/nbi/service/ietf_network/Networks.py +++ b/src/nbi/service/ietf_network/Networks.py @@ -74,7 +74,7 @@ class Networks(Resource): # TODO: improve these workarounds to enhance performance json_response = json.loads(pybindJSON.dumps(ietf_nets, mode='ietf')) - + # Workaround; pyangbind does not allow to set otn_topology / eth-tran-topology manual_fixes(json_response) elif USE_RENDERER == Renderer.LIBYANG.value: diff --git a/src/nbi/service/ietf_network/YangHandler.py b/src/nbi/service/ietf_network/YangHandler.py index 1e23934bc..ea702934f 100644 --- a/src/nbi/service/ietf_network/YangHandler.py +++ b/src/nbi/service/ietf_network/YangHandler.py @@ -38,6 +38,9 @@ class YangHandler: network = networks.create_path(f'network[network-id="{te_topology_name}"]') network.create_path('network-id', te_topology_name) + network_types = network.create_path('network-types') + network_types.create_path('ietf-l3-unicast-topology:l3-unicast-topology') + name_mappings = NameMappings() for device in topology_details.devices: -- GitLab From a7c55b2ae47d578eb4c0030b7924e074e1d295df Mon Sep 17 00:00:00 2001 From: Waleed Akbar Date: Mon, 27 Oct 2025 10:07:01 +0000 Subject: [PATCH 016/111] Remove "DSCM" for component and proto file. --- ...{dscm_pluggable.proto => pluggables.proto} | 4 +- .../run_tests_locally-service-pluggable.sh | 4 +- src/{dscm => pluggables}/.gitlab-ci.yml | 0 src/{dscm => pluggables}/Dockerfile | 0 src/{dscm => pluggables}/README.md | 0 src/{dscm => pluggables}/__init__.py | 0 .../client/PluggablesClient.py} | 19 +++------- src/{dscm => pluggables}/client/__init__.py | 0 src/{dscm => pluggables}/requirements.in | 0 .../service/PluggablesService.py} | 10 ++--- .../service/PluggablesServiceServicerImpl.py} | 8 ++-- src/{dscm => pluggables}/service/__init__.py | 0 src/{dscm => pluggables}/service/__main__.py | 4 +- src/{dscm => pluggables}/tests/__init__.py | 0 .../tests/test_Pluggables.py} | 38 +++++++++---------- .../tests/testmessages.py | 29 +++++++------- 16 files changed, 54 insertions(+), 62 deletions(-) rename proto/{dscm_pluggable.proto => pluggables.proto} (98%) rename src/{dscm => pluggables}/.gitlab-ci.yml (100%) rename src/{dscm => pluggables}/Dockerfile (100%) rename src/{dscm => pluggables}/README.md (100%) rename src/{dscm => pluggables}/__init__.py (100%) rename src/{dscm/client/DscmPluggableClient.py => pluggables/client/PluggablesClient.py} (83%) rename src/{dscm => pluggables}/client/__init__.py (100%) rename src/{dscm => pluggables}/requirements.in (100%) rename src/{dscm/service/DscmPluggableService.py => pluggables/service/PluggablesService.py} (70%) rename src/{dscm/service/DscmPluggableServiceServicerImpl.py => pluggables/service/PluggablesServiceServicerImpl.py} (97%) rename src/{dscm => pluggables}/service/__init__.py (100%) rename src/{dscm => pluggables}/service/__main__.py (93%) rename src/{dscm => pluggables}/tests/__init__.py (100%) rename src/{dscm/tests/test_DscmPluggables.py => pluggables/tests/test_Pluggables.py} (90%) rename src/{dscm => pluggables}/tests/testmessages.py (87%) diff --git a/proto/dscm_pluggable.proto b/proto/pluggables.proto similarity index 98% rename from proto/dscm_pluggable.proto rename to proto/pluggables.proto index 95ec83360..96661c02a 100644 --- a/proto/dscm_pluggable.proto +++ b/proto/pluggables.proto @@ -1,11 +1,11 @@ syntax = "proto3"; -package tfs.dscm.v0; +package tfs.pluggables.v0; import "context.proto"; import "google/protobuf/field_mask.proto"; -service DscmPluggableService { +service PluggablesService { rpc CreatePluggable (CreatePluggableRequest) returns (Pluggable) {} rpc ListPluggables (ListPluggablesRequest) returns (ListPluggablesResponse) {} rpc GetPluggable (GetPluggableRequest) returns (Pluggable) {} diff --git a/scripts/run_tests_locally-service-pluggable.sh b/scripts/run_tests_locally-service-pluggable.sh index be977b5a6..600c1edf7 100755 --- a/scripts/run_tests_locally-service-pluggable.sh +++ b/scripts/run_tests_locally-service-pluggable.sh @@ -15,9 +15,9 @@ PROJECTDIR=`pwd` cd $PROJECTDIR/src -# RCFILE=$PROJECTDIR/coverage/.coveragerc +RCFILE=$PROJECTDIR/coverage/.coveragerc python3 -m pytest --log-level=info --log-cli-level=info --verbose \ - dscm/tests/test_DscmPluggables.py + pluggables/tests/test_Pluggables.py echo "Bye!" diff --git a/src/dscm/.gitlab-ci.yml b/src/pluggables/.gitlab-ci.yml similarity index 100% rename from src/dscm/.gitlab-ci.yml rename to src/pluggables/.gitlab-ci.yml diff --git a/src/dscm/Dockerfile b/src/pluggables/Dockerfile similarity index 100% rename from src/dscm/Dockerfile rename to src/pluggables/Dockerfile diff --git a/src/dscm/README.md b/src/pluggables/README.md similarity index 100% rename from src/dscm/README.md rename to src/pluggables/README.md diff --git a/src/dscm/__init__.py b/src/pluggables/__init__.py similarity index 100% rename from src/dscm/__init__.py rename to src/pluggables/__init__.py diff --git a/src/dscm/client/DscmPluggableClient.py b/src/pluggables/client/PluggablesClient.py similarity index 83% rename from src/dscm/client/DscmPluggableClient.py rename to src/pluggables/client/PluggablesClient.py index e261c6bb6..f8e7deadb 100644 --- a/src/dscm/client/DscmPluggableClient.py +++ b/src/pluggables/client/PluggablesClient.py @@ -20,17 +20,17 @@ 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.dscm_pluggable_pb2_grpc import DscmPluggableServiceStub -from common.proto.dscm_pluggable_pb2 import ( - PluggableId, Pluggable, CreatePluggableRequest, ListPluggablesRequest, ListPluggablesResponse, - GetPluggableRequest, DeletePluggableRequest, ConfigurePluggableRequest, DeconfigurePluggableRequest) +from common.proto.pluggables_pb2_grpc import PluggablesServiceStub +from common.proto.pluggables_pb2 import ( + Pluggable, CreatePluggableRequest, ListPluggablesRequest, ListPluggablesResponse, + GetPluggableRequest, DeletePluggableRequest, ConfigurePluggableRequest) 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 DscmPluggableClient: +class PluggablesClient: def __init__(self, host=None, port=None): if not host: host = get_service_host(ServiceNameEnum.DSCMPLUGGABLE) if not port: port = get_service_port_grpc(ServiceNameEnum.DSCMPLUGGABLE) @@ -44,7 +44,7 @@ class DscmPluggableClient: def connect(self): self.channel = grpc.insecure_channel(self.endpoint) - self.stub = DscmPluggableServiceStub(self.channel) + self.stub = PluggablesServiceStub(self.channel) def close(self): if self.channel is not None: self.channel.close() @@ -85,10 +85,3 @@ class DscmPluggableClient: response = self.stub.ConfigurePluggable(request) LOGGER.debug('ConfigurePluggable result: {:s}'.format(grpc_message_to_json_string(response))) return response - - @RETRY_DECORATOR - def DeconfigurePluggable(self, request : DeconfigurePluggableRequest) -> Empty: # pyright: ignore[reportInvalidTypeForm] - LOGGER.debug('DeconfigurePluggable: {:s}'.format(grpc_message_to_json_string(request))) - response = self.stub.DeconfigurePluggable(request) - LOGGER.debug('DeconfigurePluggable result: {:s}'.format(grpc_message_to_json_string(response))) - return response diff --git a/src/dscm/client/__init__.py b/src/pluggables/client/__init__.py similarity index 100% rename from src/dscm/client/__init__.py rename to src/pluggables/client/__init__.py diff --git a/src/dscm/requirements.in b/src/pluggables/requirements.in similarity index 100% rename from src/dscm/requirements.in rename to src/pluggables/requirements.in diff --git a/src/dscm/service/DscmPluggableService.py b/src/pluggables/service/PluggablesService.py similarity index 70% rename from src/dscm/service/DscmPluggableService.py rename to src/pluggables/service/PluggablesService.py index aac2ecce1..92e9aa6e1 100644 --- a/src/dscm/service/DscmPluggableService.py +++ b/src/pluggables/service/PluggablesService.py @@ -15,14 +15,14 @@ from common.Constants import ServiceNameEnum from common.Settings import get_service_port_grpc from common.tools.service.GenericGrpcService import GenericGrpcService -from common.proto.dscm_pluggable_pb2_grpc import add_DscmPluggableServiceServicer_to_server -from dscm.service.DscmPluggableServiceServicerImpl import DscmPluggableServiceServicerImpl +from common.proto.pluggables_pb2_grpc import add_PluggablesServiceServicer_to_server +from pluggables.service.PluggablesServiceServicerImpl import PluggablesServiceServicerImpl -class DscmPluggableService(GenericGrpcService): +class PluggablesService(GenericGrpcService): def __init__(self, cls_name: str = __name__) -> None: port = get_service_port_grpc(ServiceNameEnum.DSCMPLUGGABLE) super().__init__(port, cls_name=cls_name) - self.dscmPluggableService_servicer = DscmPluggableServiceServicerImpl() + self.dscmPluggableService_servicer = PluggablesServiceServicerImpl() def install_servicers(self): - add_DscmPluggableServiceServicer_to_server(self.dscmPluggableService_servicer, self.server) + add_PluggablesServiceServicer_to_server(self.dscmPluggableService_servicer, self.server) diff --git a/src/dscm/service/DscmPluggableServiceServicerImpl.py b/src/pluggables/service/PluggablesServiceServicerImpl.py similarity index 97% rename from src/dscm/service/DscmPluggableServiceServicerImpl.py rename to src/pluggables/service/PluggablesServiceServicerImpl.py index e6d80d512..a12be3ca4 100644 --- a/src/dscm/service/DscmPluggableServiceServicerImpl.py +++ b/src/pluggables/service/PluggablesServiceServicerImpl.py @@ -15,8 +15,8 @@ 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.dscm_pluggable_pb2_grpc import DscmPluggableServiceServicer -from common.proto.dscm_pluggable_pb2 import ( +from common.proto.pluggables_pb2_grpc import PluggablesServiceServicer +from common.proto.pluggables_pb2 import ( Pluggable, CreatePluggableRequest, ListPluggablesRequest, ListPluggablesResponse, GetPluggableRequest, DeletePluggableRequest, ConfigurePluggableRequest) from common.method_wrappers.ServiceExceptions import NotFoundException, AlreadyExistsException @@ -24,7 +24,7 @@ from common.method_wrappers.ServiceExceptions import NotFoundException, AlreadyE LOGGER = logging.getLogger(__name__) METRICS_POOL = MetricsPool('DscmPluggable', 'ServicegRPC') -class DscmPluggableServiceServicerImpl(DscmPluggableServiceServicer): +class PluggablesServiceServicerImpl(PluggablesServiceServicer): def __init__(self): LOGGER.info('Init DscmPluggableService') self.pluggables = {} # In-memory store for pluggables @@ -55,7 +55,7 @@ class DscmPluggableServiceServicerImpl(DscmPluggableServiceServicer): if request.HasField('initial_config'): pluggable.config.CopyFrom(request.initial_config) - # The below ensure ID consistency across all levels are maintained + # The below code ensures ID consistency across all levels are maintained # User might send incorrect/inconsistent IDs in nested structures pluggable.config.id.device.device_uuid.uuid = device_uuid pluggable.config.id.pluggable_index = pluggable_index diff --git a/src/dscm/service/__init__.py b/src/pluggables/service/__init__.py similarity index 100% rename from src/dscm/service/__init__.py rename to src/pluggables/service/__init__.py diff --git a/src/dscm/service/__main__.py b/src/pluggables/service/__main__.py similarity index 93% rename from src/dscm/service/__main__.py rename to src/pluggables/service/__main__.py index f21f35fe6..fc99a41cb 100644 --- a/src/dscm/service/__main__.py +++ b/src/pluggables/service/__main__.py @@ -14,7 +14,7 @@ import logging, signal, sys, threading from common.Settings import get_log_level -from .DscmPluggableService import DscmPluggableService +from .PluggablesService import PluggablesService terminate = threading.Event() LOGGER = None @@ -35,7 +35,7 @@ def main(): LOGGER.debug('Starting...') - grpc_service = DscmPluggableService() + grpc_service = PluggablesService() grpc_service.start() # Wait for Ctrl+C or termination signal diff --git a/src/dscm/tests/__init__.py b/src/pluggables/tests/__init__.py similarity index 100% rename from src/dscm/tests/__init__.py rename to src/pluggables/tests/__init__.py diff --git a/src/dscm/tests/test_DscmPluggables.py b/src/pluggables/tests/test_Pluggables.py similarity index 90% rename from src/dscm/tests/test_DscmPluggables.py rename to src/pluggables/tests/test_Pluggables.py index 876bccb8e..5e12ad1a3 100644 --- a/src/dscm/tests/test_DscmPluggables.py +++ b/src/pluggables/tests/test_Pluggables.py @@ -26,13 +26,13 @@ from common.Settings import ( from common.tests.MockServicerImpl_Context import MockServicerImpl_Context from common.proto.context_pb2_grpc import add_ContextServiceServicer_to_server -from common.proto.dscm_pluggable_pb2 import (PluggableId, Pluggable, +from common.proto.pluggables_pb2 import (PluggableId, Pluggable, CreatePluggableRequest, ListPluggablesRequest, ListPluggablesResponse, View) from common.tools.service.GenericGrpcService import GenericGrpcService -from dscm.client.DscmPluggableClient import DscmPluggableClient -from dscm.service.DscmPluggableService import DscmPluggableService -from dscm.tests.testmessages import (create_pluggable_request, +from pluggables.client.PluggablesClient import PluggablesClient +from pluggables.service.PluggablesService import PluggablesService +from pluggables.tests.testmessages import (create_pluggable_request, create_list_pluggables_request, create_get_pluggable_request, create_delete_pluggable_request, create_configure_pluggable_request) @@ -62,9 +62,9 @@ class MockContextService(GenericGrpcService): # This fixture will be requested by test cases and last during testing session @pytest.fixture(scope='session') -def dscm_pluggable_service(): +def pluggables_service(): LOGGER.info('Initializing DscmPluggableService...') - _service = DscmPluggableService() + _service = PluggablesService() _service.start() # yield the server, when test finishes, execution will resume to stop it @@ -77,17 +77,17 @@ def dscm_pluggable_service(): LOGGER.info('Terminated DscmPluggableService...') @pytest.fixture(scope='function') -def dscm_pluggable_client(dscm_pluggable_service : DscmPluggableService): - LOGGER.info('Creating DscmPluggableClient...') - _client = DscmPluggableClient() +def dscm_pluggable_client(pluggables_service : PluggablesService): + LOGGER.info('Creating PluggablesClient...') + _client = PluggablesClient() - LOGGER.info('Yielding DscmPluggableClient...') + LOGGER.info('Yielding PluggablesClient...') yield _client - LOGGER.info('Closing DscmPluggableClient...') + LOGGER.info('Closing PluggablesClient...') _client.close() - LOGGER.info('Closed DscmPluggableClient...') + LOGGER.info('Closed PluggablesClient...') @pytest.fixture(autouse=True) def log_all_methods(request): @@ -104,7 +104,7 @@ def log_all_methods(request): ########################### # CreatePluggable Test without configuration -def test_CreatePluggable(dscm_pluggable_client : DscmPluggableClient): +def test_CreatePluggable(dscm_pluggable_client : PluggablesClient): LOGGER.info('Creating Pluggable for test...') _pluggable_request = create_pluggable_request(preferred_pluggable_index=-1) _pluggable = dscm_pluggable_client.CreatePluggable(_pluggable_request) @@ -115,7 +115,7 @@ def test_CreatePluggable(dscm_pluggable_client : DscmPluggableClient): # CreatePluggable Test with configuration -def test_CreatePluggable_with_config(dscm_pluggable_client : DscmPluggableClient): +def test_CreatePluggable_with_config(dscm_pluggable_client : PluggablesClient): LOGGER.info('Creating Pluggable with initial configuration for test...') _pluggable_request = create_pluggable_request( device_uuid = "9bbf1937-db9e-45bc-b2c6-3214a9d42157", @@ -133,7 +133,7 @@ def test_CreatePluggable_with_config(dscm_pluggable_client : DscmPluggableClient assert len(dsc_group.subcarriers) == 2 # create pluggable request with pluggable key already exists error -def test_CreatePluggable_already_exists(dscm_pluggable_client : DscmPluggableClient): +def test_CreatePluggable_already_exists(dscm_pluggable_client : PluggablesClient): LOGGER.info('Creating Pluggable for test...') _pluggable_request = create_pluggable_request(preferred_pluggable_index=5) _pluggable = dscm_pluggable_client.CreatePluggable(_pluggable_request) @@ -147,7 +147,7 @@ def test_CreatePluggable_already_exists(dscm_pluggable_client : DscmPluggableCli assert e.value.code() == grpc.StatusCode.ALREADY_EXISTS # ListPluggables Test -def test_ListPluggables(dscm_pluggable_client : DscmPluggableClient): +def test_ListPluggables(dscm_pluggable_client : PluggablesClient): LOGGER.info('Listing Pluggables for test...') _list_request = create_list_pluggables_request( view_level = View.VIEW_CONFIG # View.VIEW_STATE @@ -164,7 +164,7 @@ def test_ListPluggables(dscm_pluggable_client : DscmPluggableClient): assert len(_pluggables.pluggables) == 0 # GetPluggable Test -def test_GetPluggable(dscm_pluggable_client : DscmPluggableClient): +def test_GetPluggable(dscm_pluggable_client : PluggablesClient): LOGGER.info('Starting GetPluggable test...') LOGGER.info('Getting Pluggable for test...') # First create a pluggable to get it later @@ -185,7 +185,7 @@ def test_GetPluggable(dscm_pluggable_client : DscmPluggableClient): # DeletePluggable Test -def test_DeletePluggable(dscm_pluggable_client : DscmPluggableClient): +def test_DeletePluggable(dscm_pluggable_client : PluggablesClient): LOGGER.info('Starting DeletePluggable test...') LOGGER.info('Creating Pluggable to delete for test...') @@ -213,7 +213,7 @@ def test_DeletePluggable(dscm_pluggable_client : DscmPluggableClient): assert e.value.code() == grpc.StatusCode.NOT_FOUND # ConfigurePluggable Test -def test_ConfigurePluggable(dscm_pluggable_client : DscmPluggableClient): +def test_ConfigurePluggable(dscm_pluggable_client : PluggablesClient): LOGGER.info('Starting ConfigurePluggable test...') LOGGER.info('Creating Pluggable to configure for test...') diff --git a/src/dscm/tests/testmessages.py b/src/pluggables/tests/testmessages.py similarity index 87% rename from src/dscm/tests/testmessages.py rename to src/pluggables/tests/testmessages.py index bf6858854..d67a022c4 100644 --- a/src/dscm/tests/testmessages.py +++ b/src/pluggables/tests/testmessages.py @@ -14,8 +14,7 @@ import uuid from typing import Optional, List, Dict, Any -from common.proto import dscm_pluggable_pb2 - +from common.proto import pluggables_pb2 ########################### # CreatePluggableRequest @@ -25,7 +24,7 @@ def create_pluggable_request( device_uuid: Optional[str] = None, preferred_pluggable_index: Optional[int] = None, with_initial_config: bool = False -) -> dscm_pluggable_pb2.CreatePluggableRequest: +) -> pluggables_pb2.CreatePluggableRequest: # pyright: ignore[reportInvalidTypeForm] """ Create a CreatePluggableRequest message. @@ -37,7 +36,7 @@ def create_pluggable_request( Returns: CreatePluggableRequest message """ - _request = dscm_pluggable_pb2.CreatePluggableRequest() + _request = pluggables_pb2.CreatePluggableRequest() # Set device ID if device_uuid is None: @@ -83,8 +82,8 @@ def create_pluggable_request( def create_list_pluggables_request( device_uuid: Optional[str] = None, - view_level: dscm_pluggable_pb2.View = dscm_pluggable_pb2.VIEW_FULL -) -> dscm_pluggable_pb2.ListPluggablesRequest: + view_level: pluggables_pb2.View = pluggables_pb2.VIEW_FULL # pyright: ignore[reportInvalidTypeForm] +) -> pluggables_pb2.ListPluggablesRequest: # pyright: ignore[reportInvalidTypeForm] """ Create a ListPluggablesRequest message. @@ -95,7 +94,7 @@ def create_list_pluggables_request( Returns: ListPluggablesRequest message """ - _request = dscm_pluggable_pb2.ListPluggablesRequest() + _request = pluggables_pb2.ListPluggablesRequest() if device_uuid is None: device_uuid = "9bbf1937-db9e-45bc-b2c6-3214a9d42157" @@ -113,8 +112,8 @@ def create_list_pluggables_request( def create_get_pluggable_request( device_uuid: str, pluggable_index: int, - view_level: dscm_pluggable_pb2.View = dscm_pluggable_pb2.VIEW_FULL -) -> dscm_pluggable_pb2.GetPluggableRequest: + view_level: pluggables_pb2.View = pluggables_pb2.VIEW_FULL # pyright: ignore[reportInvalidTypeForm] +) -> pluggables_pb2.GetPluggableRequest: # pyright: ignore[reportInvalidTypeForm] """ Create a GetPluggableRequest message. @@ -126,7 +125,7 @@ def create_get_pluggable_request( Returns: GetPluggableRequest message """ - _request = dscm_pluggable_pb2.GetPluggableRequest() + _request = pluggables_pb2.GetPluggableRequest() _request.id.device.device_uuid.uuid = device_uuid _request.id.pluggable_index = pluggable_index _request.view_level = view_level @@ -140,7 +139,7 @@ def create_get_pluggable_request( def create_delete_pluggable_request( device_uuid: str, pluggable_index: int -) -> dscm_pluggable_pb2.DeletePluggableRequest: +) -> pluggables_pb2.DeletePluggableRequest: # pyright: ignore[reportInvalidTypeForm] """ Create a DeletePluggableRequest message. @@ -151,7 +150,7 @@ def create_delete_pluggable_request( Returns: DeletePluggableRequest message """ - _request = dscm_pluggable_pb2.DeletePluggableRequest() + _request = pluggables_pb2.DeletePluggableRequest() _request.id.device.device_uuid.uuid = device_uuid _request.id.pluggable_index = pluggable_index @@ -166,10 +165,10 @@ def create_configure_pluggable_request( device_uuid: str, pluggable_index: int, update_mask_paths: Optional[list] = None, - view_level: dscm_pluggable_pb2.View = dscm_pluggable_pb2.VIEW_FULL, # pyright: ignore[reportInvalidTypeForm] + view_level: pluggables_pb2.View = pluggables_pb2.VIEW_FULL, # pyright: ignore[reportInvalidTypeForm] apply_timeout_seconds: int = 30, parameters: Optional[List[Dict[str, Any]]] = [], -) -> dscm_pluggable_pb2.ConfigurePluggableRequest: # pyright: ignore[reportInvalidTypeForm] +) -> pluggables_pb2.ConfigurePluggableRequest: # pyright: ignore[reportInvalidTypeForm] """ Create a ConfigurePluggableRequest message. @@ -183,7 +182,7 @@ def create_configure_pluggable_request( Returns: ConfigurePluggableRequest message """ - _request = dscm_pluggable_pb2.ConfigurePluggableRequest() + _request = pluggables_pb2.ConfigurePluggableRequest() # Set pluggable configuration _request.config.id.device.device_uuid.uuid = device_uuid -- GitLab From f239617fd917c4a6677f6b713183ab581e9b4382 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Mon, 27 Oct 2025 12:00:27 +0000 Subject: [PATCH 017/111] Proto: - Add directionality of ACL rules --- proto/context.proto | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/proto/context.proto b/proto/context.proto index 9fde6a3c1..27e48122f 100644 --- a/proto/context.proto +++ b/proto/context.proto @@ -562,9 +562,16 @@ message ConfigRule_Custom { string resource_value = 2; } +enum AclDirectionEnum { + ACLDIRECTION_BOTH = 0; + ACLDIRECTION_INGRESS = 1; + ACLDIRECTION_EGRESS = 2; +} + message ConfigRule_ACL { - EndPointId endpoint_id = 1; - acl.AclRuleSet rule_set = 2; + EndPointId endpoint_id = 1; + AclDirectionEnum direction = 2; + acl.AclRuleSet rule_set = 3; } message ConfigRule_IP_LINK { -- GitLab From c5b2c7e64ca48a08291713e5de992e1a2e4750c6 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Mon, 27 Oct 2025 12:00:42 +0000 Subject: [PATCH 018/111] Device component - gNMI OpenConfig: - Support for ICMP protocol - Directionality of ACL rules - Manage cleanup of ACL rules while composing OpenConfig messages --- .../drivers/gnmi_openconfig/handlers/Acl.py | 72 +++++++++++++++---- 1 file changed, 57 insertions(+), 15 deletions(-) diff --git a/src/device/service/drivers/gnmi_openconfig/handlers/Acl.py b/src/device/service/drivers/gnmi_openconfig/handlers/Acl.py index c3c52fa85..06061a0b8 100644 --- a/src/device/service/drivers/gnmi_openconfig/handlers/Acl.py +++ b/src/device/service/drivers/gnmi_openconfig/handlers/Acl.py @@ -12,12 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -import json -import logging +import json, libyang, logging from typing import Any, Dict, List, Tuple - -import libyang - +from common.proto.context_pb2 import AclDirectionEnum from ._Handler import _Handler from .YangHandler import YangHandler @@ -41,6 +38,20 @@ _OC_TFS_FWD_ACTION = {v: k for k, v in _TFS_OC_FWD_ACTION.items()} # ───────────────────────────────────────────────────────────────────────── +DIRECTION_INGRESS = { + AclDirectionEnum.ACLDIRECTION_BOTH, + AclDirectionEnum.Name(AclDirectionEnum.ACLDIRECTION_BOTH), + AclDirectionEnum.ACLDIRECTION_INGRESS, + AclDirectionEnum.Name(AclDirectionEnum.ACLDIRECTION_INGRESS), +} + +DIRECTION_EGRESS = { + AclDirectionEnum.ACLDIRECTION_BOTH, + AclDirectionEnum.Name(AclDirectionEnum.ACLDIRECTION_BOTH), + AclDirectionEnum.ACLDIRECTION_EGRESS, + AclDirectionEnum.Name(AclDirectionEnum.ACLDIRECTION_EGRESS), +} + class AclHandler(_Handler): def get_resource_key(self) -> str: @@ -59,8 +70,9 @@ class AclHandler(_Handler): rs = resource_value['rule_set'] rs_name = rs['name'] oc_type = _TFS_OC_RULE_TYPE[rs['type']] - device = resource_value['endpoint_id']['device_id']['device_uuid']['uuid'] + #device = resource_value['endpoint_id']['device_id']['device_uuid']['uuid'] iface = resource_value['endpoint_id']['endpoint_uuid']['uuid'] + direction = resource_value['direction'] if delete: path = f'/acl/acl-sets/acl-set[name={rs_name}][type={oc_type}]' @@ -77,11 +89,11 @@ class AclHandler(_Handler): y_entries = y_set.create_path('acl-entries') for entry in rs.get('entries', []): seq = int(entry['sequence_id']) - m_ = entry["match"] + m_ = entry['match'] src_address = m_.get('src_address', '0.0.0.0/0') dst_address = m_.get('dst_address', '0.0.0.0/0') - src_port = m_.get("src_port") - dst_port = m_.get("dst_port") + src_port = m_.get('src_port') + dst_port = m_.get('dst_port') act = _TFS_OC_FWD_ACTION[entry['action']['forward_action']] y_e = y_entries.create_path(f'acl-entry[sequence-id="{seq}"]') @@ -91,9 +103,12 @@ class AclHandler(_Handler): y_ipv4.create_path('config/source-address', src_address) y_ipv4.create_path('config/destination-address', dst_address) + proto = m_.get('protocol') + if proto is not None: + y_ipv4.create_path('config/protocol', int(proto)) + if src_port or dst_port: - proto = m_.get("protocol") - y_trans = y_e.create_path("transport") + y_trans = y_e.create_path('transport') if src_port: y_trans.create_path("config/source-port", int(src_port)) if dst_port: @@ -106,14 +121,41 @@ class AclHandler(_Handler): # Interface binding y_intfs = yang_acl.create_path('interfaces') y_intf = y_intfs.create_path(f'interface[id="{iface}"]') - y_ing = y_intf.create_path('ingress-acl-sets') - y_ing_set = y_ing.create_path(f'ingress-acl-set[set-name="{rs_name}"][type="{oc_type}"]') - y_ing_set.create_path('config/set-name', rs_name) - y_ing_set.create_path('config/type', oc_type) + + if direction in DIRECTION_INGRESS: + y_ingress = y_intf.create_path('ingress-acl-sets') + y_ingress_set = y_ingress.create_path(f'ingress-acl-set[set-name="{rs_name}"][type="{oc_type}"]') + y_ingress_set.create_path('config/set-name', rs_name) + y_ingress_set.create_path('config/type', oc_type) + + if direction in DIRECTION_EGRESS: + y_egress = y_intf.create_path('egress-acl-sets') + y_egress_set = y_egress.create_path(f'egress-acl-set[set-name="{rs_name}"][type="{oc_type}"]') + y_egress_set.create_path('config/set-name', rs_name) + y_egress_set.create_path('config/type', oc_type) json_data = yang_acl.print_mem('json') + #json_data = str(node.print_mem( + # fmt='json', with_siblings=True, pretty=True, + # keep_empty_containers=True, include_implicit_defaults=True + #)) LOGGER.debug('JSON data: %s', json_data) json_obj = json.loads(json_data)['openconfig-acl:acl'] + + # release generated nodes to prevent side effects + node_ifs : libyang.DNode = yang_acl.find_path('/openconfig-acl:acl/interfaces') + #if node is None: return None + LOGGER.info('node_ifs = {:s}'.format(str(node_ifs))) + node_ifs.unlink() + node_ifs.free() + + # release generated nodes to prevent side effects + node_acls : libyang.DNode = yang_acl.find_path('/openconfig-acl:acl/acl-sets') + #if node is None: return None + LOGGER.info('node_acls = {:s}'.format(str(node_acls))) + node_acls.unlink() + node_acls.free() + return '/acl', json.dumps(json_obj) def parse( # pylint: disable=too-many-locals -- GitLab From 22842a888d0411ca608849e32cac7b682d5e27bb Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Mon, 27 Oct 2025 12:00:54 +0000 Subject: [PATCH 019/111] WebUI component: - Add firewall icon --- .../static/topology_icons/Acknowledgements.txt | 3 +++ .../static/topology_icons/emu-firewall.png | Bin 0 -> 12605 bytes .../service/static/topology_icons/firewall.png | Bin 0 -> 13242 bytes 3 files changed, 3 insertions(+) create mode 100644 src/webui/service/static/topology_icons/emu-firewall.png create mode 100644 src/webui/service/static/topology_icons/firewall.png diff --git a/src/webui/service/static/topology_icons/Acknowledgements.txt b/src/webui/service/static/topology_icons/Acknowledgements.txt index 6398f34a7..2894d2b71 100644 --- a/src/webui/service/static/topology_icons/Acknowledgements.txt +++ b/src/webui/service/static/topology_icons/Acknowledgements.txt @@ -38,3 +38,6 @@ https://symbols.getvecta.com/stencil_240/16_atm-tag-switch-router.3149d7e933.png https://symbols.getvecta.com/stencil_241/46_atm-tag-sw-rtr.776719c0b0.png => emu-ip-sdn-controller.png https://onfstaging1.opennetworking.org/wp-content/uploads/2020/02/p4-transparent-logo.png => p4-switch.png + +https://symbols.getvecta.com/stencil_240/81_firewall.21bd3abec8.png => firewall.png +https://symbols.getvecta.com/stencil_241/110_firewall.e262f4364e.png => emu-firewall.png diff --git a/src/webui/service/static/topology_icons/emu-firewall.png b/src/webui/service/static/topology_icons/emu-firewall.png new file mode 100644 index 0000000000000000000000000000000000000000..cccf0b55cb6e56c2ccf1c85faa0a10868eb83b60 GIT binary patch literal 12605 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4mJh`hRWK$QU(SE22U5qkczmsb1VP!m45qw z{ohAnKYBBC2~ zRvQbN2Fq*`Xj|p)A}(-I|CE?@S4W-B@AvM#hS}VS!mS(Jf;qa6NO3zep5F9MX^}T~ z^467Widqbx{R&Cbn&`=}MyRmFYOtrxBf219WPkcPt}XvH6?G)N4HyBv%~B1RgS&-_wW1u%Lm!z zb-uD}P-#u7<4ZUyvMywIWXXnvvrPcQF^?yyTt_szD zb1zFGc^`K+&+ZRg3=t2vYDIdV-tWI((e5KQ7qc}$pq&YbIb27JT+B&_qK0``RxNPFY|r5X7jm4iHF-P?T`B( z(y5hXSfj%k&2uGt z?{>czJ2g#d?Pl-kdS9*t`%g4{S1-r2@-Uxu&$hg~S^b;|u9M6*8a7OgIP^&Bz@|0N zQqQmE`*iDO?f1Lxe}8{pE?=*+Un@N3_w(n0lhu4bwOrj*`g(=uWHrfr2gWrefB6%Z zt}c%|pB8y7)x~65$F~B#Df4f}R6J}oskL%95lNS}tFef!e!F$vhNyitma_GKKCbI! zj(Axo&akHB>$%f6bxyDHbGh8HqWe12&x6MQeI5zBZQR-?Yklczc)TyKl*xj>-^=%h zKe(~!xLkG5Ih)Tu=huR?D}%M~zNvFM%gN=x%A)v6-M;@DKOO%1Dc!7cdt(c?)%!i4 zGhSU;Id8GSn!Md_&7@2+CcM{S2yG%56 zBEuGMa=36TuKVwE`~RNL=M?kh-iz6DlFdS(Y!$v}W^Zzp!=HYS!iNmMA*6-8i4qwe#w_*xUQEg14@E9sc26u6f=a zi!a=44BB_|xf`agyJtD`?4~ugof$TQJN5Q{Z2GbMV&?L>ZrWjMPMrL8Y1R~GyZbet zeb28p6TQxmu=MG~7oQm-E}Ckukeik&8}v==gLxcx{Dy?azo+J{pDj{s{cJ{ZNAk)& z>uyD9K& zkFKnlIrFaMfm8SMnH#3=-`Ba<==3Iwy$9C19GUof-M6FS@d5pEwl8)*pVw{czOdv8 z`wL+;pARipZ|Cp#-F~Nt+jr(6eV_U~hOmEC;vg%JM1ib47hBqMo#DLw|2?&ZKR2JZ z>o%=ZEdBL5{(n}y-#4qsy&n#7m)t2lJ~8}(M#I$oacmntT{oW?E*5gIt^V8Hn$Ks; z3{niAMU{6Q-Ff~0kK^{c5{_CGsIj$~nKNjAx~{WamSN4DQ|pa)rbfmT&iEV_>*}I6 zzwYbR@NdmuTe-zw`OJ8}*yi&Y<171WtNkN-rOo^F_W${G*P3C&r#mzIo-#(XKGnaT zrF;6;dL4l)bG;fm;;LS%TBkH7_j@f|8@c(I-@4~Hb>X=TYYzPiV~A*dy1wUX)U>O+ zbjqi$ZsL``S9o03q~b%uqXid&G78t-Vu)z{dX`}W*Xj6gS*Nvb6nvFhm-P75!`-Q; z#a`XrZEpMb%VpLbyI**(3tGxm`|s!Tbst#dI_F<6eSNJr?d+_lmIe)?vF~HPF>EMW zS=Y03DVN!teKU%~3wiejWt6_YwpID-_dAoDe;VKJleJ!vdU{%;;2(yt#9D8LHB6tT zha7x1uln7>(|WttWLy@vjukDrns$3zZpoL6?zh7Wo1_{-9sV=yxu+p|?UQ%<)@i99 zr5);oU#zk`Dw<;T(+pwr{xcWo@EXeQ&p^53N zv)kpWPU!I*w6FJC`q4kG?)OX4z30Mnf24>$U8~U$8gXBSLEHatYUH*5`l}OykM49~ z6ZwC5u1#gpymfZgryo_<%Pf1ys@-R9{q07wvOiCP>ojPDzn>SgD&g}%cKI9jjFt|Y zrbx|KtN!*zGj40=D$WMc(2aL)F-PpYYM)%TvWa)O{<9yeHk?oYl#$&z?U3c}TU#=P zU#;@J(#f!9Mc317atBVW{kJ=PyUuI>)JVtJoz<4}I=p>9+U^L-&c42GsdAsip{;K> zgyyR3Wzg|l_~)0*fm0jp4~1-acqjDeynQ!L^Zq%uK5lQ-ybX^G_|oN8TdZT*@My)f z-F6IN@3uVGHfx`{RR7zWgu{{SKX&>WhHv;dX+F2hhtSzlrZJsCZ&#b8&naZH{rP0F z);w>nHLl%a7f-6se-m^1zwxm>>oz&?Oj^j$FmdZo>8oqW0@!D*%Gxi2Tn73)88`@Nrf^AITbB4ZLhp1;Vgx8p$mu6XI> zd;Pn_Zk*;~h}h(oB^Jaw`)IfL?VZ>5|M}#-)sj0^;a}v@eCEk9>Ird- z3j^2Ra=EI49oE||owo1BN=AF; zU0<(7+a`X!SN%S4v0JZF>{ia#(~EX*IPhpr^c?PgQ-b|CjaeH+-Ihw2F@*74JXE$( zXSJQ+$JaXdxy=3?TOD#q+`9B}`?WdocVDM$&AO^(ZR@iwS|Z_N^y$ja&n|MR&v_8V zcR$|d&xgZv>)AJKdSbz#?R{uk=!S<%%S!hwldvw+iLL#5RWhsXqyWj7dt+)5fr7LE_EIR8r&Th!Mwq|Cw z?d4^@i|uNE-6-X6=aptlSo*|}!83{9-3!_fHV*A^0v~jifG@Xxo#7gehe!rPnyMr+zva~WE8 zx~J_4_vy#S`+8bdcDdwBy~^2(Ss{x(yuOXWWHWd!}R9< z{{QdxGe-o9`lsv}0en9p9_(~rDP_X}VAXV|XsGB0|2-d5w5XI6rV5(!^l zU+-7*oActOzI?(}gJUh;TJe|eH@%q6zF|@JF?(iq!HY8_VlOWBY2*}EyU@VMT(r(z zV8ahr2K$)#R;8=nTNNJiy57n#t?Ayh)VuC3&!_Wm&AhC3tNebgsGHtA#UJwZM~|K4 zVCVb7^UuHZ@}IOx@^h@E<0o1@pHtisY|L(IQ{sO$mL);+1#iMhrDw_;e*BbtF7r6s zTvR&zuI1k^mpg-lym=2y61ntO=0MN|;RBOg&zL8azPNCZ?UG#en}az*Y8ovKa$7@DqaKG8MG(X{C~>>a=cW;AGb-~cdT!l->-455p54PKAy=C zCUf=Ccg78mvbXP62f55U;bZHoh0g7}#7;g`pY!{XPEY;+LxQb+tC-~L*E3}&}}~-H1mThz%MVC&p*}8m&lmVD&TpM zBqf^yqWgw%*--7ZM}ktZ`l%3qaU962(`<_H$k@ILF1QKtJe$7 z-!P|lwPCSq=JT3QT#q9eB0iRM-{wBhwK}G?j$xY4BC!p8)^7}cr#ua9TbFX-L7e3O;>$P^WHcX8Ni8uinx8{X~xe(!GTYi*r3^*x61r&b+MTE)Z=7IM_) z4JbfV4m|qR%Cma!_j}d_i?%c#6^PwevvYL^tKeCqVBZk=^G z#@W|&Ze_3Ed!+I*i`e0;e}8_?~l7x2tH;wy?zsK zziIiq7^|mKf{oPtxFdR{Oc$k|p7!%#*Y%Lg5}PB#Sj7TG88$4^Y7-9AIl72xwR^vu zN$sza@KkBJ<^J>Su58H+ma?fRcy++)$pq&YKcCN6?_=i9U79Nfu&S~YQ1VwBtyi; zl+$lm5>6_$F;0t5m0r)ZJd>$A@u<3XAM@%PKaLzC z46D03V>7Q#+toRi#cz~WpZhj_|DRU3Ua8dok_RT$uFqsl&|JZpa8jv?vHLyCw|94M zU$yjUyqv?7ectx_lFHA|Di6Jy7M-_n_4<8P-)AxE-26TZzX(UX-~ZoEw(7;g zb$#>e|Lu&u>84dMOE=-8w0)iM&5ghFm`j#DSG*1!_^sE8;@SE zveoS4|Ln#2 zf(y**yl*V^o_^rY2Zpd+@sXffm_d79N6dpQvAfHTDDni(7TfUe+xGo|`|JM3T(VmmVXeikZXKmb|tp;i&aNPVaB&>vR}&Sf7G4#V~h&-v4>( z>{C;<({-lZ53urXXN=fnU!2OApsB$Rs&s@Rcvh>=t7uvkwszLW3;y4=yYQ#Q9& z9qbA|t`oWGNSsN7>TkXIAgAXuL~QEFWIDb6!pm*Bx8J-rd%A&XL(2ZAvsoLKJ`e;| zOS%b$Yjzy!-F)HYxw+PFyU(1r`RsEnsqoOG+UfqFv~3Qm0!xPv3PbY&+;RTt(n@}j^kiIZ@o$QH|-}fZ6&TrXt|I=Bf13@1+KvgZ!TJF*X?8ot9*N4!BtQ#_30!?3mZs_*#@m^d@LJM{)=>hY|&)!77LV) zsJptTQuW-eMuur`<~wa<*dSuV3M%)Ry1C~TJ?vuUx4B@tG5oCqgZDT8g%J!9T=SSV zqzGzrR`ROc9&vxsHOY5dl?GjB6IGI{V2PzP7;K!=GlTrZXm-)bnT3VG~?#`c13k z*RR*>Z(FXla40!7Me~!BjF@M`(WeJ@_{?yho!w)p`YGvxV+g|mA=OE|3~K_UQYAoL zdp159jdB&G{j1I-X0x;T3W-NJ<^A|?daOn$tJt7x2}6UZr(S+CD4^eQW?xwmXp(Y5 z;5rMBcHIZLWn~M@HaI$ZR2CFBhv|W8) z|G(Pm>y_Zl8ygZC!d&h?p2ZwdICb>}{sWU-r!*YhFv~1=*6ItIhr8<8)C(c$nlyNdsQz0MqASkix+^+4BZnFdkMoeBv*_f~4Jmz|*-!TML_Nt0;Y%V~34 zbr{xo#5W%~#t@do+4+7wmR9wjhNs^Rc0bZoo2^wbcf+l%+3qzHZ_Uh`nRs z8P`~>VvLv=TFlgaFl1}i)qv$QPE2-vp}^?9Y8P{Yt3dQYkpn>j7dNfh-npXjP=Knn z%LPrf*^4|5Oj`AhA>!s2zIlnMuCWZ-GuK?wRJ-}&;9mWGKayry6fRmGIAfJH$ob3( z$O``LwY>Z3)z#H26A!oPE#3ffa!%#(>X<(&As3_%bm=F}2=@7N@ozQT(&%{xiA=l_ z1`1cUAj)6e(@_pCxu@H2?JCvol{9useDX-*(VETYl=`H~&Hf#?OFGhV#r))kM=Pr0 zriW+W*-`l7L=}T}?03cpt}5j7Ox!5{3Pz6UrsuZl=5I2_D4 zh88pG>@PVTrFw`#=jQucprUpW$f#QfK53V%id5n`FzN5QTu|l0m2gsN8K=(vJ0Ezo z&mCSDiY~!pzDdK=>C$%5s)q^=A)A#Z9Z|RQp=4N0sk$_}?PiTf zH$0lL>ebcN={hR2zw&&X9Pq8u3{;bZf-1or#?$MyinqO%WQy2yelw`1S^;uh8goQl ztKa1n=^P0s?asG>Jgx;QTzS`c>+L*p&hptG$r)j`&J5m2W`UaiMJE)uq@9(zRsDXi zv07Th($Mn)2PW0d;|2AZLO}&Scf{}a`}fB>-HV($GyKA?((I^BDV=*HT)B@VYIaE` zX)tKFcueAKP}Ou<7Zd#WSnuLSX7*FE+7Sk8#B`%v<_KO{UD&j5%k38z7iWHWaPVAa zwp6m&^1ai7X6V=Qi!WToFzwBiCF*N#ZOy*CDfM(s;!$l6>4>daR~K!+SJiF7x@EC# zQqN0Gv_f?ZQth)30X7Y*gSHm^UP8iit=3 zNvQq!=%`-A#|l4(rK~#Zc747Q>>s$?Z|r}E-#zxr8Fl70d$$zw{b*oII2qp=A;u7qH*eaDYpzr0TTpb^+(+=vxPN{dm-!`RGXJ zy51r)j{X@22qW8s!$NKzV$fc3;pL5u$;Nd|%Q)A}v#q{$eyvvMswo@aifV@m*n97O zx9jzsB8G^-{R)b28P`m3de}16XN3VMty@)oN_lmAd;T$|OH9`~)#rI|i|H%?wX)9a zFMAvHJN3ZQ>2Y3%+jyBbOschY`p&k&$@^)3$NZK}9YPy^C>h)Pl$*7Q{+B8K=Fc3l z|M%VZZ%+J@GR;cSc|F-pATi+;cvs!@6UW!otopD@X`6pQt#7HrtkZTFmb z1lHIzz5X@dZ!4n6^Du?YS#>7rz@r=i84=Jl>UA|Ow`)BGSoA9w%b3OO98s6pc`|BRf0(CcoOc^$aJYm`JsB^}WmOX46 z{y1sPtNj)!z39^Uh@K}W-`?H^)hHXiPpGqs-RGZUSG()^q59vq z?_bJZzgH|P7*T^Tu6dzUwB*M`cR9(u$&vjk2SAO0w>=Bb{ce2P{ZL8#^|iI!Tg@1> zr}$*KF-&Wk0`3Ogb#w)dv~|}k`n%@9g@w+>Pi9yaFO$73vi&HlSbW;Em^Y!T!@kay zI?(lc>YMM(8$?WwMLR{hy!^D;#%YYE#i9o${hg@| zD&HzWt-0_6k4~Sdd3yY3!~Q=;#`E_q^P4+sBO?Q9$AjVYd!x_(_J3Vsca?0^H+ECK zT*Sa2@B_3KV1D_%N``4~_U!>Rg<}{&6$P)(KKT-@>?Ib z7fahew(zKE$?vz@cZ-3BKCD;OU0)Z=FzwB%J)p|&4ye_*j8UiV_j8@HQ!~Xa#CONn zRm?%}KUjtzocMN*THE5Af2Gj6FU+t1e!suH+q35D)$qn{W>lTN35BW8!q!F!s&h;M zO@&U0pU)h@^^XD6?r%KWIKTGyw^H9XYtHDbaEwG;LZKsO$Ok`g4Y9P4)~rkuJKRSbrw^!Bi$aH7zsMv+?LrExmm|lAfEeODCIo z6hHp_f(taAS^O1bnQ6n(qkhwMA|I_f6Juu`f3ow|B!<@?4)ZU+x;nf%RX;YN=V$Ge ztq0=56n3>gHS|8mbYN2KJdp^;qkhGVYpTA!y2;7NZ}mc9{aJIPV|!HLRS2XZKbb-M zh0$m6_?nH@B?|)=yMekDg?^yn`o-e$H4|r_oRCdmtl&_Y@B^h7C@c zQxZ+`?pR1!6fC$ivE$v2$9(>`t>5pN44O#{Nd6(|$|^Sh3#hJPU&3a>pgl4Ck2P}y z*CEh|Nuhs4-BG`vM#b;%?R6Hl=8cLCNjN*hu=$+DW1h^z4AYhboH@_9X2zk=H*5(f zm5wor?XP{jz2KZ!$;`+&&t)Py_Zio$=;MG@Mh7Oj_Au$_m7P*32utHD z1{q(HQ2Or9%pD(A8|OR%%^ddI{px4~O)R*I+AXtf5Dm8Yqtc@m6Or&!)S9ILT;#x*RDrj{S&^cFMZ+0bY4 zh-0_P^vyRir<^|X$?MSk4HgDpo=%Tn2C7&}svfqAzj!j)UrkT64BU|jboEc*Pf!)$ zKft9wk40x4|B0i1udlD4ZXbdm%%{HRl~pZ{sqnKK{#c=~co^%G39ul2}Py->`$u_5u;mie{cBxQ@w z7;Z^CeEvEMhxW7RR>F&J;Li~OJ{D}Q$*nL>c ztxx8qHD|+ApZ_cNGOk(C1sX~%W;&fM(0lq!ptv}T4j<1~k8{%vSsO${Kc;+R2s8To z<{qe<=yl-It}{C8RW3LA`(KYK?p+;SnXqC@9)tF(Mi( zUYUJ;9hb8Bd4d1`zVEL!UtBrUvMb45u5yX2-^S~4)u|=bU$2J0-0`??GqW?&I8Sdl6G2kW{$4ojtNIsg|5!n|My$5Z{eGb$1i#7?-j|)LR2{nVK#!-*TrTZ zH)9P=>oYGZSU<}&`~_+HH5?dT6u9TPrbzT(oG7Pe=C{cT-ica@x+ zVWwda5+x5?4YFW)YGlO=y%#TPUYu*3Av0lS+V1c7s$U-B)-Umu6p_$c%a54KN#xzs z5wwl1vL!`KW&b^ZqWaxVb=~-VbNZ}at>|$*%F8pgtZjbFB&S`VnxP6* zx@9t~4qEDEQvEIG)rE!5$C@Uww0T)GZ%}D1v1i{P@&z>8beZ8AGrx^P?XNF|x@w*Y zE4COTMS!=M;q3!bRwWvDD<1c*YgGYRff^iX!Vx!lFajx!J0j+6+x+NMZG(_olJKYk zjq9%9)zOnb-}%iVT64eTnj0p}&P(SqMj$)dFF{q;!Z7oa%B$Pk*JmfaJrIzY{--DB z$A^c0;B{k5_WiKg#l#R+ayG^mRDby<6ehf2m#=a7{bsZOu_HG*c&3&eJ8E3@?G0yw zr;}zaUxFqFs0Wh&i|MfGV3x-Ui{Ynn>nq zCTQItb$)||!4zZtEt!{(6+4~Nm=*T=;$n8&UoRHNUH*GmqBt(n_wYd{c zp1aC0Ej}UR=bKE%?%-=@W}EkGg|B;a=ZB2atDK&no?$Fvg(3{_;UzWJY4HaycNs5d z)H&yTUbK9UW_HI5QKhWRo{8O(r-}|9a%W`lez+Rcj!|R0#ws4;5WLJsQ2nIY28&c) z@wl%mQh&%RWu^7pRM8V+>l9(wAawHk{d1t^S`4VxxVf(6@cH#x+rHngpU-FezW!ga)`3R{t~{SteJ=F$gpN9m-;z7Drf?W|tzl@G8sRi&!yyj|(TH~Wx*dPl ztN^t#4o_!qiz_~BYEtpx!5Zdn|J*tM@6O!R)=@UqHlbea%)i9Niy0c0E>Nx$I;G^s z7`C_S>zgmfzP`SGUSda5!iyId7Y8#=i`R8lvbru&ynjz|M1~dvbh@IAHSFuFt8aT2 z`pz;rDRE_{p$Tuo&#Oi%iyj`EA^jxwuv0W6gSTTKD1Y&6uy}lE^Lab(wNYD7NnFrQ z&e+!2dLZED@}1xYKKq6g!NUyM$9g17j!CBPVEcSZVwP_LD@&W6!lG{+JX8P9)djU) zBSF1$rfV|{lQS+Xa9r2;$EYohJHjd91?RCDYd_^BPSj;(&|ysl6&nf(U*F%KujVu3 zft1RMDK%ydAlv$Pf|`al3<)Qdeld14JExzU<9Tj@|H>(Q%r-DFIqz3n^o)aNYV92G zSb|Z5YWE9Pow~HG85fn#9|)-H+mbu`|5h8{1kT2V>e9(^Q_4BIO+-Nb6VTAl+ykJx z=jE2me#(BOF&kUYN~~gC({Lc*+>Q$;C7KTe+}yhoG~ge^9I>gxFQNAP-SQ)b;iAz~ zdKN|<;NswUo82>0=RJ>DCOC9+Bd>8O{fhk=U|sfRLF(ygnxJWvIVG1o8)tV$dBrhD zT#u{P?UgV*lpSj>nY>O{?rV3tI>WRkefTuWBbCN9z7S0A(e|wNv{K_Y z=S|SGU_IcamNX~mlV`(G{x6nSH*KD#C|H>ALi5;+xhKn7?%fPxI1m&d1{zhn6ZEOD z@#>b$VC&Rg_hT2XpZ*l3XkfC>dht@OwdSgToJu}U2(-Z ziK-sMXT_OuHS?lD@$vWLG=qpEaeJ#SZpplC)N^fpe11Al={{SY*L^DvI3;96q<+55 zcOd8kKPbRigyWA&8YDE_xp-WO3lu5ag#)u$+K!buzmjFtVLi#H1MeS2fFfeKbn?6| zEAuzS%R!0Q7BcXqXb|$vR}mE4_do;9#f&<2%$7Aj3f3R(H9GdkHO^G$lP@EK_d#V) z4!w22DPhH%$xfgd|2?2)G(xx;ybl(Glth7*bUT4k&mPc}?=r?U&3slT z^bNiwD_Kc3F5EQ#(_PTuz5vL6whi~H-`lPa`ZUMzi$(I8=ucXS6W?<&L~zN09CMjr z+Hoxb39a4B7Jvr0%0WXZmJDL)Jgx~V-ppzO^_T8|W*43@M4XV&+P(AvNY!+ZDoy6> z9>Zr^m7yCnOhDn<4-&j}pz7DlC$D(Z*R+*kgGda>ky%XL%+BI^F)vo7 zdbpey42(|UnffSA9JTH+?$_?)`xVBzm~lu*+36{QC0pvFX9oV>3Q}Iv(6T}0 ziotW(#YQI&Xt2-{sSWB_D8LgRM7&2|= z3(ztMaZt{8Jg_Qkt(0!;t}EIGQ|5<$Oig2HJ0&!|1vJ@|25PDDN61K6fyVhRFY7H9 z;Ny9l*)vnIpRYS85EMHmpe(|^rs2Q^$73_1pH55+^a5KAEr33svwnFyfB#bHyd4Ku zf3`?I<4_qAF=ZAg`i_G#j`{|(oEs0mHq2$Ox*}1$%tlGa3+(gP4AXQL2}ju3#wjei z#=$f7t4=5=?SBRZ2nQ%Y#BKh%$?=LUT?Gn9&=^7>!?pC(rB4JUw7erPfdc2Z?&(=h zF5)3FSsx!A@sY7&$Y<0(SwU2 zV&apg!Wh<54PUvKoF8j-)U9D?XnpUf#T7Aa>#PnxqhmF5PqoZgq9Mw#q3hDxpW8K0 oZ~Av#;_yu8iwhibSpV@~pSRVvcq!>S$m&*~H>l;HcWs zv7n(r!C8*&RdwF!4VOiKh3tsEYyA0Jyv^n3bE@A}cij&Tt$lCH_G2NFl&FF4X6c4B zDQB^kfU68Kyb7-aHu*E%sC{vNzEs=C`%MO&O%oOe3QS7rV|8Y{Y%-tOU_(NRwC6Nu zp2ItoCr#`+p}-O*s99pPJablBDZ_lGjCp4Yxgy?F^Bk_&)9`f8x0gZ@nemIh_+2nL zdye5AbAaJq<6aZ%uM#)ZF9~*^NPuWwmO1O$VupVcdv37Wq=_Cj*e3G9a!KkhmawR4 zs(U9J`F_q|kY~zxJLTmc)7b_8ceGj*T=03{$#UY|*MDmZYMvHNN)J73VCL=i=iYuM zmTC28ySB7v&f*G^XI}A0<%sd+X^-UR>pHwU*xc&3{3(A-!>-U%)icE#pSmt(Fk=a0 zxY)I*J9E~nsGa-=oEePPNWHl+yZLn6`2#!NUla4HG_xz?)RGT8_4>{aj~Ahu^UGMK z`5)|Bv@>&-C_@d)gP7$%_2ag)iu25FGL0@5v#RtGKY!%daXr_UkB;UPpSCR!SYN+Y z#(bOI(Ok`{}ac53nAAHB{o!L?daAmZYyxz`rYTvo~5u$)n3yV|bw zdOfzjIo;;Z*Ll3QZ1H^ej&J$HiE_TOiC@3Y^0oN<(s0`cmN1E=qkz1B2 z$N0dP;kmW%yW_sMllL>#ZBL9|IQ#cbb=l_nvaBAf&{K=5ej4?Cmi~L+)S~`|$np0a zYcljXnY5$!Ud}VQZ1S2pU_0N|xs!gUd_2E#`s>}rMVIx;WjSN7Y~j1NchTBpjmsv6 zIp?_USR`$G9l$cJPphKeF`@GMstb{`mR0gLh%?*>b6J(jRo*wNe_?!G{EKIE>zz)& zf8V|<^lfym$Qrpnf23`!Ufyo`tiEB;Z0K4WNDnLl6V=E&X3DhvE)3Ma{0>B{SPNSyu2~>`MnZPOU=qT zaf^kX-MM+XaCL8~1CzF<>II=G2QDckSFsuTZa%*7arfycW1Eaw6)A_3Y-|bz&m1a0 z7k8(`dVUOZa{ikqI}}QO&y$&=FS_4v+5xZguOm}k6PD)ZGNq@@T2|$_ILeo|h-*{j zak-cu^H=^Tx_azDvWUp>?C5z7)AjS7?z;MH;d$}IA5U{1Eptv-nqSJf=F3{&1!tD< znH7iqm#dEd`n%7z@sYU7^553x$CzVhTO7(ds6YGSr!0W!2aKy`K>H9NP zUnMM-`#o>Yr~6LT*LH>Klz#g)RoAbeCG_7~GnQ%ZPwOn@V+r$mdfj+O=B!sOJKGuW zJpM9c{k_X8wuVlg_IFkK0h4~CXTSPh6lM8Jues86Vf(YSJ#)<_eplRZY0r#lUpUq@ zh3ZFdTb3!unjq3(Ja^fmKK-!O*RJQ@4n2_mO80MN`8TJ_QQ!VaaE0;vNAw&N7CXwS zv|-Q7S$bhCVY@<<9OQ!7XN#xR^zU{*uRrCuxb?}erw@xio}v6!T~Fm!mU9B@jt@aE zoD!A>{8`{E|0!7bMS@gev4DS39Ng$ zf*-plEOq;SV6m5M&XsACKF9rC6i~LIP-v~w%tsN{JN7>goBfxaZ_(xM$HIE|6*e%% zcWD-?YzR`S-r%^D&n*8;WMiZ9^Mv@khc^3etcrTu<(_bp`R|0M8?L&QZq5AlV|m2C z-``r2gd+~FI~r0c7_lyc3qBY(6 zP}bXPvKB8NPCRk)>%A*e4{%i!E<4eCz-!`%OB*_^ZmbZC-rhf}{d$`I-pjwb z#q$5nog0E-S$iWltGoT4r{DNAdeamufe6j1_w9CEIr!|kec6#ZR-GQ%9HFU?rgon@ zW|}_l1;^@-_t!h04_9MdrP3(sv2BW_V1(x6dxBw{);D@$e{t(c+c8^z7rpnmd+sU2 zhs(|dyxp8s24ns27_X8((wl_DK0b^qRN z_OGi$xA4B$cJ)|(8q2i!qe0pJ2}{H3J!Et0eiw(Y>0EBbw{%5q-QV(hnb>t(l-KMj z+d9!id4o#prPtL=+O1zFSlw9hxLd!fSZdqbd(#i;ESBHp62@j`SEhMtT8}+vNUBoq z){nDuBNBRdtz)h-v$$sUMzSrj=B>H-tnG0;uOQ`aB2PM+&^O4JR8``?Pb50WxX+ZB6Qfm@AGW#x2dcgI+4n2#oi=5 z)_cwwdMfdx{rU2nS;Y+LHa|7@-Ct1Nm=lm-dv`f&Uhe8T<-$K(40w|FUE^*)n8YOz zAsELI#6EkbeO|}ht#LQ3Z&-NV+f){MM&=5$BwuvyrteQ4Y&mY{d1_{yW5d^^{hJG% zwU66vsSIA7CE<3l`lZCd|Ef&dOcSpPfP(dLxBT2K691+4bF7-}8~FQ6Zi$Rr%-wsX ztIu{e+j~W+XYD^w_4||Ai~ByN=ly;tZcu4us`F1^6*;$h_LYNauh;F}DE|6#*qZNB zn*wg~T09Tod3pPgV3>XGIk#qa`)^yX9$Rk_*SORya({Vh^ql)YD)gNNBH}{05}XrQ z11Ld5 zRP3ECeadUpYWDNlGJ%Xs=ZrYI*~s8sn_ouxBg1VMUM=b27yBoYt(x{zAfk@@;l+6e zK50w|-|Q@#Bga^^5wWy8{o!Y6 z>&2mW7w0C{-`K#LJ5RQKb=16$vfHG((^FJm)t3FYmHepFNuIcUb-Y zzd4h3S}|sSot7gLzjKc6{7mgS=kwwF8?5?u-alqqqt%v}<9V`$>*oTNunwl#%T~@4 zcVozqSMr%y8ftG*Qk|)^Y*~S4yYPlNTt*+;OJDqbC4RzIV!vPCfv#_#R5via%AK|B z)s{bk48PC2GbW3vnwL($^yuV8P5X`u+#BrT_DD_NV=9}~zx=Cnf@}3vp$Nt=X1<@_ zGtA?8;5FTuYmZ^N<(0}WEB|>MsH#7x74z>K&vg^dH5u9-37Hpeo1Fd6utQ7#iu~?x z4_8#*yC|^pL(7TUhqrc|++&n2nfLR>>M8yozJ25U;PT#B=5s~yyRL}eTU_M#mGp0G zVVTCZms2P5NC`_=^D9w<-+l8mg7?hGWqMU|-P-M}u)149r%AGxHoyv-2LteC%0bDbWF$$n0#Q8tB-oZ+}P(UZg71wQhie% zw!Pj+{QUVJaq})HaxLLAad36GHjP)|NUW(hhzAF2k zSEbQU9S)uNqE<7t4Nl$?)~~zt@3P8XW{jBYw@%QybYVoATgxEssAl8{`1f4ZqA*$y%S+I?c5D4l{eK)k zYUXpGD!OuD*ZSgQn=5ZiqLb?1-4k!Vx~R1NglF{zg$*_xOD?t?xTK)gsM;-|y5UY0 z+rN$3`ERCNNR|Hj)l6l>lUuL1C~PoU0g4GX)-~e4=XOd*%}w&oxZG!(@%K!`np<;p z)n6ZOI`Bzx8e1@vcXJ2GRU!w1^sir)e0}Zwt+mz{-|Z}n*j&1N&I*5Srqjz46wh+5 znZTq~4)Wy814cX#npfYl{KoU=XTNNQZHkUr%KK@Pc@i8GSOs)jxEn>C_Sl4jltvy1 z;`MWnE7q$rv$-~{sG9dN=Uf<>)Hxap2I(UKL_xzHypTB zASn>BsUxu=bhDGB&+e_(S>c=ZZ$4#Tbmc%+%x0rBzE^x-{my=xnIYjO9w{32Bedbb zr_~bgH!x|6i9{R^wPA|CcaQn%>FI*Udxav@WlL4|?OAKBHBIy7l@&tB`@`#?r-$C7JrZ3EZVWNz;a zH|0_ObJKLw8rO482QCE^F?ow!)ZY+t{(vU)?uC;M%l5p=3I5p;v}1el;uDQa6HF@; z%wK+-a$u5vr-K+vn8M9Rb2)S(UF;8dT`~UfjDP>3)tjd$7JOeek@@wDqNPdYVV8EB zFtALk@nqSguz~5MTf)z&XSFw+vsmYqGk5CN^aWda!>=4z6|l?Y&D^Ue-L3UkZg}CC z@N=(&%`M>wxmK@~W7ay6F8T+8Y?+V8+!tJ`vwzo0vl#LHmb~+8et&-0xQHce=A+1s z@tXeYLvNa0{F!a`u;=lrsQ-QmC#Sn8a5HI7$k}uFllE*Do$d1)S8evSZ#RnxWb{6m z^`>|3gH0(8UtjpWRlnfD0?xd% z6SLP}ZaQ#j0VwmoU|G|eZEpRI=ghsy!q$a~fzsPMJkXYKHFE8Q085V1XX`g6|LY}Xds&VIO#Z~4t* z@!JZeqwJ0OZkN3;KGRzsG0%J1(Fq4GDJ;&MrOkNdvcRentv?Dce~V}i-aj|Dgvq_U`aQ>|G34$jVSK%Coo~VX z!*}QJdYx^W;^P$YaiT%Q-NO}v5s6o!#4D z0o$jmC0*JSZ~N2@*6()o`sbz5t?^cMit>@@7RIpW!C6PbHb!q}dfI#8$Hu^jU3IIM zPvOwzGY4h5x)r{LO=@$_2R@OO>P8ab%pHpukX)y zHH*IA@MPE0*{qFA7b-!jwN*vmtvALq&%IT6*E)@H-i$x-(TnyRMm3+oTXxHHmemJ^ z#S%aKaP9LHiYR(}=_JT;ydcMMC0M2|e7EY#-Kn?HT(*+o+U4Ns58hpjSNG{db2PJe zY3ja*%{P;hSf*(NMo9`pNS$&_IH}~uxn|G0Gs`reyC$5JS~?lzR4JBeI*alWboczW zFzICl|w`7~)y>g=x0a1kwE}bdNOy1WtbT;JWUuW>2Q{I-VaJA;^ z&X@NUpC4e{^W`ajk&;wnscX0JhhwU1=N_ArD$({>e4p?V=Q&I))7rS34oq_8VFpEa zR%-S0g~BnrjZR0h)~onjDP?!aJ#28TLUO*@KM{oue_lS#@J%?W#Kt;JT4IUVry{rd zNR~>KkX{|T-TRb{jE(NJt;~`*mbTvV!nxf{EYr%@#^{35o5F#h4OP#(wrwkmiHkaM zT9TDHY`5_0EcxgA`cut6H+*1P!**3W;o4iB z-yhX?`y%K%~o<2J5z$Di%OrS7|E`RI#I{jE?`_xlWOw*#T%a*2J zeb{=wuxxHtfcAS`c_#0DDol|A5sfL`IeZUSOT5+fb>n{Fh@!WpQ34TCS5!8n2;OaYdaY0U ze{7G8?T*&VvSIDdk3Y7bzSZq4m-`V`yMhl2ReOK2s{Q-$`r&@zh=W`CA9*IQ2A+N7 zoN!Xfit+Wt&hDgg!>!s=x7rrXwa@XAk$5856luYj{r1}26`_W5Vb|)~Di;ez94z5~ z<(j}6+SlK*Z^~w-*JpQXUszNYI;WN7H?j3r|uefYZUVTGt@vY;l%{~Rz z^DzJTajW>^>W77W&gOMFBGcC0f2FC*bb7MStsV{?-k?w6hmI&+TOY=F|K4r$a~U6Z z*2JE?z5S8s>2sUCXYc;+=9KXBx``G)lXvqaP+7EPdO+WTh^wba=Bs-M*D9)1tc#u9mvbW!tE&9zL(3o3&9iVwXc7yjgi9gz@#VYs(+} zhljY9pF-(pP$ZjdV5M4sCYCKJ+Ny@WGv7AJ-xa+<;`=C z&-Cx-yn22@e@oHX$%&vo>C^+0TzjM<^8WIamfw9Si_!(uXuP`l;6{nc-0JAXmrHM# zExI~k2m1wJ7pRvZ!qBiRmg6vI@{~oURlhZ=3l#PtLuzerYLPML#~9C zb#0ULUM9UhHRsGaYt)`*3iIi;7his}wcHrbJbm4LHFZglKNO-k#F?~PDk|53@~~0k z(`z-MxlZ95yu!K-?1WC0Ue5(Ne+sBaE4Cpd{F!8P)qZc6uqau{`YSs%hmi_Spvv?pL;!?$}=}Y;$96r>PHUYOlT5w;ojHx2aJ!NR-LP*?prxthwYyh?N_5BvRd>^!vU^k(R0K>y*ieNRTo#@lD@HP z-Cwz+!dc&j`}+LaqD7v<5ua2APc$9iQjvbY;m@gO;t`!vbNBuJ z+8?nySNz@ED;h-!wzoD*zI#9_6xmQ-c>@K0j^E!Jmhh zJ&3gPG{`E7{+w4_{Uix2SgzrC2ys$neuJP%$sW)#~8+av@+HO^I`@5ETlacYG zWq<#+tC^>I+*G7dsad4P@RlC=U>j}tPy#=esinX-B{NYzY072+`QE3WKv|I zaNJ&1>E|}ae1B(OJ^C2bXZokte&8BQSi;MH&ri5JMY?cCyt3bW>siv@9bfr+m?C_$ zLytXSj1AnD^5>%I>+SEm4tkkxd2mezxg_XpSX%csm|;_$&{sYmvkh6{THT>fUy~?=Zjg|DL7ZDC0{d%+sP5Urv?YzVNH@r=}h|b9>k0iqogR z$W|9$c-Z&boJAPZEI~P_bwH_q{FygK#NmEdaa-3`H$8NAXHN zURk~%FJa}>ukm*-T`e^J?5mvico?b`K4jRR?BEUwv1Sd zRe7K8?cAfQmlbu~?AzXCu?L+e|CgTaJn$(*FV~G_8k;7lTy{CYb;&y5x@_3Vq?r{j z4{a{|Dfu;Laz)*-@*RICS8}Q&hVL$$oSn+>CVWrZjaJ(u=W2h0#*6km86C3mGX0s_*Vv2rxOKM9jNH5Z)QJuM#VsCp zUi^`E_y4shRj&yLxI*?F@Pi~VkA$D%AE&Ri4t#!4@SiMyWeel9+iB1Cq)6GDad}_Q z|2jpw@u{a8#LvE$=P)g(jazZoawoKM_3vQcb)5>9^gnF{KPSAx10Qx6o~KC`B7>7VaQ@^jfg2u2jy z2B(6G^Le1+Ty(>ge-2+IUTm4U^Ze_{f$KsF_f)$^-%C8H>cb7{{YZjp-Vlb9*S|a?P)uU%h$y!)N^ayMCkVXPOqhIe7coGc40$c9(#9oFUDi z8k8yG)!i%J;&XGopM8FR&FQbwi!C!}qIHcJy#M}6zk9~!^Ksr6zb?7FIc@u3h6B@mqug~mJtS&$FghOX%*-Ox{3b>ymp}OHy zdD=81*bJ7pvn{BEynCSPUz72|SsSA4ubn#+l*Te`NkCPte?sO8c2MU?IAYb!m#5f& zKRj_s^$}ax?3uT1to7CzZ=NFAsH!<7?!It@)GJWm?G@P5QytHTt0n&V{`yJEr^pu8 zYsR(FNe;7v*Cx-)k!UMcc8{yleIMkHq zaQ%Cu`!~gH*_phZ&w?_$!GWqR>BcK;o38a=PD`_#T*1A+zvY!*{-d+87rwQ;>TFZm z@JH;>V%x^2fh%0nKn;(8gr9fM=%fqrMI6@8Z}y&bb!wX;e4&PthFx-&m%(FRW-6_0!mYAn2^0d;Il_+h$fC)SsQ4z4nfo z@$a*jUMoNBUF&y@`|lh3KWlHz;r*Ju@TqgcPu&*xYNpeR16aZ=7XASx_LaBJ-1&C1 z@W!s{_#G*qDytd8zW>^qbX+&uzv)NSS+$F@D&Z6)H z)3u?Jli5qQnp%I|H8b+uk^9Pto0C^3{91cAU{l1OsMYh$(icAsp8s&wH1$Ux@13n| ze;WP+GT!%t@AUkFxQ3;(=APTVSzK$Xrlk0t^J!`Ik&4?w4z0~T_i^g!W7nc0KL`F6 z6M*J%>@>B$yU|>|Y}r+Q>HkyMITIeTtKXql4p4uJ^8Bgz~0bWi7q$h!LDi{stgvwos7yY`xJ z8i(h8u$$oTt)8Iiu&?Ul%@y%`lVY}j<}m(k(3JRo_txQh^$j&#a+l^D;L==B^jvnD z&LZgzcg&2nEmjoY_?wqD&A4-W0n@aqneVoA{r&Xt^2dLN=09QrwV(LY{S#U*>puha z&8-+;U+aJVpgVfkqd8SqA2B_7e@4fhFa05l&hidWr_GEd%;N9gDq(oDYi>hn%F0K5 zznMRmr%h9C-~54T&3CaiheY$w7szxR;99;vKA-9I`XrVxg`;Z@1ZA)CTN`#z?DShd zwF?X6=BOn2#_yDy+wND8Be?94aD<%8wG5|(Oo7Se5t}-~5-clU+yJG&{D~Y9uVTZF zi>s@=+2x$@Gt_2|ZKJ5){u$gSl=;*O4d%0GKtva`VwfL&(`pLyRzpQ;J z@zM9sC)VvdSf+&^{dz+%LaIb%LsRFBp0j7-i~_Uwr`^AIc$YYT z$ECZIy?%kZYEeQF|6I>l76=@-|G;RL_Wt90nM2N|nOU}0)xU@jE@oD^#sk65|p3?6AtDNUyqC|(R@a4q^H*V8#oE|I?p~xk4 zVCn%bg;`gRn)vQ35ii-YujGHiL;oE)KT3FCRr4Dz$>-+D3BLbqLPp{Wk-3NpSTB2m z>lDB23Cb;-0~Q1w*i?5+@2~2%g+C8C8ed=lb;Fpf1tS`l{+_SgsMKv+_Zr=XI3(W&91tdl)Dqux}5Z7mqExZQ2Dy#do`1H^E^-)qt&of ztZmg(?o@BFes6>SoePVeb?S1g*}(PdvpRgl$cz6uE&mS~F*~1iZKE6OLFRQjoccuZi^U|4u5tE#%_N#9&c>(I`sYyrh zm*h6F?=sn_DpZ!Z!o--#JILexca~{vwxA+5g~?l&r}lT(wrwg`Iu|C2w|N;Wqgdc0 zwqep<%s?<|xVkIPv}fl&=01-{hXOJ|l@&DYf%?V2<9CSt)ZaEe{ci)K{Mm`Ju{!hK zm#gJvrPd!@SDmR zN_(gi_x?Ut_*R>XQY{C#)K{-IZ(Qma0U1nO6elq&BW?S(wf)O~-{@b%=zy3q`RE54 zBj_uSm?_By8hbu2>>SDluHG^>y@=Z{X18}8Gtbs2(|?~ACQ68BO0^~Ga0x_6>2ZQg zX5Y{je~)dt$?Dfu5g`YxUjJBZQ0WjZa{knoXGW|J;)e~2Qe86yT^O0PJF>*&L2V?R z4R^%ap2=HsCCm-jYV+*=&C_KmybVhkq9ocjMu#rQR=&S9gGhf>?w_#x^$5%6Dx-f?{rWjL4qaXY~NZTYprEVmQLMcW%%W=>+0Os z8z!-?Nt!9Su{@=N;Wg43*XwJp{K+yZHG@e&| zR-vbkvYy*-Py(7dV>tcxgcQSd$+nNXY>J~^gfzhBgG3`<#ZJtU3EW@h8hzn(yZ`au z-2baWMOZiFWnX9TpI6>?`H7r4&ttjDYg;a?WoTUL7zmmT;@)uOP{7qmtKV{7&1GD> z_Q_=4HT!zAl8;<{yTc$vFLw!Oq<<&KHTnmNq9tCHBxM*iE){F@lf7~F+i8^sea0=% z4+ZSJcM{YD)bLI?spJK2THLw%&?H)6yRh?QR-Nr}ZS7)h^HL>_@l|fy;xP^6!BkKd zaXBD$W0_ssm#z6qejtMzmd1V4-}Bo>CUo7DQm6fl8HZXI7R{Xu9^jY(nKX-%uzHm* zJ7J<=y{6aNC#B4wdD|Jq?*7|b7wYmJj!-;5N$g}8C`b$%Rl8rXtaf;mV;4Gn;o=e>Hk?C}8K7iJ(!=C!iMl+5^8n%)V;zeaWkBtqZNcJzMa& zTX@5R>1R2cUonL>#kHw5*u_X_T{rUr%~{<7WdYHM-QV82&lEcPNapIH3+J5G6OQ#u zA8FXt@HOgx*p6FuNh_r47bHsPcXVD*2m&RfqS?zHIr#ElbE*Iw~hlCHU zOkYr1_7hY-TxZmo{`tn$3;vRAh0CWf@9&ReWb$r)wk&fUOMt)g3MJ`7y9`2vlyo-i zFbD~cKmpHbzC~S*H2B^r;00 zBNRDv`xv*Ta?c)*~BVDe^pr8d0^*T0u?f2{bQ1E@3-@$lep2t;{AyFb`Abp~$ z;PP{I{bj3)+n1!?T+o=$^deiLtxDy|@(xXhgiH+!P&Q|e$Vz;%Bzl*EvGQT53b}@B zHijYBc5eV>Z7oodRK*&$SZb<4aX|TYVdrS6wvWqgq;$DfgB)-QRHw#)+8ug(e%pj- z1z(c-P|o06k+fn>aUwVXKn2f~hR}^AoM--4>u(o!K5xYH*t$|AN~8?zL{Qlw%;>Gl zGq<*y-(+3nO(~Dk?V0DpK5g3PdK47+nV@2pH{#Wi){W*RB~cQqn&L7fj=2|=M2U!k zOqdEX;ckQJpHF5xmPE!bXZSAB_Hl>IOfgqaMka6Pt)PZT)+SwR}Oxt_{B;y5|29A>FjJ4Te5Hf9( zM>J>}5+qi|a7~Nh><)vFYnwDcf~!D+T%e>Cs{M0okxGY>gSl)sc$#pMa73faoO}tlZijg#TAM)0-Yb9Bvsi{*SsbA=oVPGd zC_iwuiosv1?PE^jJcH-U;u)E|_b=;tv7jMymNnywsf!*nmOSrVxW}hS!y$n+u-9&% zs0GWKr3|;E+BRM= k6L!A5PKQ-*;eYn{hV2iGf`5HyU|?YIboFyt=akR{0A(tZRR910 literal 0 HcmV?d00001 -- GitLab From 2074132235786a35abbbf4f458a827be9fb0eef5 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Mon, 27 Oct 2025 12:01:04 +0000 Subject: [PATCH 020/111] NBI component - IETF ACL connector: - Directionality of ACL rules --- src/nbi/service/ietf_acl/Acls.py | 29 +++++++++++---------- src/nbi/service/ietf_acl/ietf_acl_parser.py | 16 +++++++++--- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/src/nbi/service/ietf_acl/Acls.py b/src/nbi/service/ietf_acl/Acls.py index c537c8172..e966f2c0c 100644 --- a/src/nbi/service/ietf_acl/Acls.py +++ b/src/nbi/service/ietf_acl/Acls.py @@ -46,12 +46,11 @@ def compose_interface_direction_acl_rules( if acl_set is None: MSG = 'Interface({:s})/{:s}/AclSet({:s}) not found' raise NotFound(MSG.format( - str(interface_name), acl_direction_title, - str(acl_set_name) + str(interface_name), acl_direction_title, str(acl_set_name) )) acl_config_rule = config_rule_from_ietf_acl( - device_name, interface_name, acl_set + device_name, interface_name, acl_direction, acl_set ) MSG = 'Adding {:s} ACL Config Rule: {:s}' LOGGER.info(MSG.format( @@ -114,17 +113,19 @@ class Acls(Resource): interface_data = interface_name__to__interface_data.get(interface_name) if interface_data is None: continue - ingress_acl_config_rules = compose_interface_direction_acl_rules( - device_name, interface_name, interface_data, AclDirectionEnum.INGRESS, - acl_name__to__acl_data - ) - device.device_config.config_rules.extend(ingress_acl_config_rules) - - egress_acl_config_rules = compose_interface_direction_acl_rules( - device_name, interface_name, interface_data, AclDirectionEnum.EGRESS, - acl_name__to__acl_data - ) - device.device_config.config_rules.extend(egress_acl_config_rules) + if 'ingress' in interface_data: + ingress_acl_config_rules = compose_interface_direction_acl_rules( + device_name, interface_name, interface_data, AclDirectionEnum.INGRESS, + acl_name__to__acl_data + ) + device.device_config.config_rules.extend(ingress_acl_config_rules) + + if 'egress' in interface_data: + egress_acl_config_rules = compose_interface_direction_acl_rules( + device_name, interface_name, interface_data, AclDirectionEnum.EGRESS, + acl_name__to__acl_data + ) + device.device_config.config_rules.extend(egress_acl_config_rules) device_client = DeviceClient() device_client.ConfigureDevice(device) diff --git a/src/nbi/service/ietf_acl/ietf_acl_parser.py b/src/nbi/service/ietf_acl/ietf_acl_parser.py index b7977fe35..65e9129a2 100644 --- a/src/nbi/service/ietf_acl/ietf_acl_parser.py +++ b/src/nbi/service/ietf_acl/ietf_acl_parser.py @@ -17,12 +17,13 @@ from typing import List, Dict, Optional from pydantic import BaseModel, Field from werkzeug.exceptions import NotImplemented from common.proto.acl_pb2 import AclForwardActionEnum, AclRuleTypeEnum, AclEntry -from common.proto.context_pb2 import ConfigActionEnum, ConfigRule +from common.proto.context_pb2 import ConfigActionEnum, ConfigRule, AclDirectionEnum as Proto_AclDirectionEnum class AclDirectionEnum(Enum): + BOTH = 'both' INGRESS = 'ingress' - EGRESS = 'egress' + EGRESS = 'egress' class Ipv4(BaseModel): @@ -132,14 +133,23 @@ TFS_IETF_FORWARDING_ACTION_MAPPING = { def config_rule_from_ietf_acl( - device_name: str, endpoint_name: str, acl_set_data: Dict + device_name : str, endpoint_name : str, acl_direction : AclDirectionEnum, + acl_set_data : Dict ) -> ConfigRule: acl_config_rule = ConfigRule() acl_config_rule.action = ConfigActionEnum.CONFIGACTION_SET + acl_endpoint_id = acl_config_rule.acl.endpoint_id acl_endpoint_id.device_id.device_uuid.uuid = device_name acl_endpoint_id.endpoint_uuid.uuid = endpoint_name + if acl_direction == AclDirectionEnum.INGRESS: + acl_config_rule.acl.direction = Proto_AclDirectionEnum.ACLDIRECTION_INGRESS + elif acl_direction == AclDirectionEnum.EGRESS: + acl_config_rule.acl.direction = Proto_AclDirectionEnum.ACLDIRECTION_EGRESS + else: + acl_config_rule.acl.direction = Proto_AclDirectionEnum.ACLDIRECTION_BOTH + acl_name = acl_set_data['name'] acl_type = acl_set_data['type'] if acl_type.startswith('ietf-access-control-list:'): -- GitLab From cd5326866452c8d8f476b3edfa0fce81e10f7c41 Mon Sep 17 00:00:00 2001 From: gifrerenom Date: Mon, 27 Oct 2025 12:12:10 +0000 Subject: [PATCH 021/111] Update Policy and ZTP gRPC code --- .../generated-sources/grpc/acl/Acl.java | 56 +- .../grpc/context/ContextOuterClass.java | 1330 ++++++++++------- .../generated-sources/grpc/device/Device.java | 14 +- .../grpc/ip_link/IpLink.java | 14 +- .../grpc/monitoring/Monitoring.java | 322 ++-- .../generated-sources/grpc/policy/Policy.java | 140 +- .../grpc/policy/PolicyAction.java | 28 +- .../grpc/policy/PolicyCondition.java | 14 +- .../generated-sources/grpc/acl/Acl.java | 56 +- .../grpc/context/ContextOuterClass.java | 1330 ++++++++++------- .../generated-sources/grpc/device/Device.java | 14 +- .../grpc/ip_link/IpLink.java | 14 +- .../grpc/monitoring/Monitoring.java | 322 ++-- .../generated-sources/grpc/ztp/Ztp.java | 84 +- 14 files changed, 2136 insertions(+), 1602 deletions(-) diff --git a/src/policy/target/generated-sources/grpc/acl/Acl.java b/src/policy/target/generated-sources/grpc/acl/Acl.java index 037bd3858..64d70d842 100644 --- a/src/policy/target/generated-sources/grpc/acl/Acl.java +++ b/src/policy/target/generated-sources/grpc/acl/Acl.java @@ -397,8 +397,8 @@ public final class Acl { } } - public interface AclMatchOrBuilder extends // @@protoc_insertion_point(interface_extends:acl.AclMatch) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:acl.AclMatch) + AclMatchOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * uint32 dscp = 1; @@ -476,8 +476,9 @@ public final class Acl { /** * Protobuf type {@code acl.AclMatch} */ - public static final class AclMatch extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:acl.AclMatch) - AclMatchOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:acl.AclMatch) + AclMatch extends // @@protoc_insertion_point(message_implements:acl.AclMatch) + com.google.protobuf.GeneratedMessageV3 implements AclMatchOrBuilder { private static final long serialVersionUID = 0L; @@ -919,8 +920,9 @@ public final class Acl { /** * Protobuf type {@code acl.AclMatch} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:acl.AclMatch) - acl.Acl.AclMatchOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:acl.AclMatch) + Builder extends // @@protoc_insertion_point(builder_implements:acl.AclMatch) + com.google.protobuf.GeneratedMessageV3.Builder implements acl.Acl.AclMatchOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return acl.Acl.internal_static_acl_AclMatch_descriptor; @@ -1655,8 +1657,8 @@ public final class Acl { } } - public interface AclActionOrBuilder extends // @@protoc_insertion_point(interface_extends:acl.AclAction) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:acl.AclAction) + AclActionOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .acl.AclForwardActionEnum forward_action = 1; @@ -1686,8 +1688,9 @@ public final class Acl { /** * Protobuf type {@code acl.AclAction} */ - public static final class AclAction extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:acl.AclAction) - AclActionOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:acl.AclAction) + AclAction extends // @@protoc_insertion_point(message_implements:acl.AclAction) + com.google.protobuf.GeneratedMessageV3 implements AclActionOrBuilder { private static final long serialVersionUID = 0L; @@ -1912,8 +1915,9 @@ public final class Acl { /** * Protobuf type {@code acl.AclAction} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:acl.AclAction) - acl.Acl.AclActionOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:acl.AclAction) + Builder extends // @@protoc_insertion_point(builder_implements:acl.AclAction) + com.google.protobuf.GeneratedMessageV3.Builder implements acl.Acl.AclActionOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return acl.Acl.internal_static_acl_AclAction_descriptor; @@ -2233,8 +2237,8 @@ public final class Acl { } } - public interface AclEntryOrBuilder extends // @@protoc_insertion_point(interface_extends:acl.AclEntry) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:acl.AclEntry) + AclEntryOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * uint32 sequence_id = 1; @@ -2292,8 +2296,9 @@ public final class Acl { /** * Protobuf type {@code acl.AclEntry} */ - public static final class AclEntry extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:acl.AclEntry) - AclEntryOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:acl.AclEntry) + AclEntry extends // @@protoc_insertion_point(message_implements:acl.AclEntry) + com.google.protobuf.GeneratedMessageV3 implements AclEntryOrBuilder { private static final long serialVersionUID = 0L; @@ -2614,8 +2619,9 @@ public final class Acl { /** * Protobuf type {@code acl.AclEntry} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:acl.AclEntry) - acl.Acl.AclEntryOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:acl.AclEntry) + Builder extends // @@protoc_insertion_point(builder_implements:acl.AclEntry) + com.google.protobuf.GeneratedMessageV3.Builder implements acl.Acl.AclEntryOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return acl.Acl.internal_static_acl_AclEntry_descriptor; @@ -3200,8 +3206,8 @@ public final class Acl { } } - public interface AclRuleSetOrBuilder extends // @@protoc_insertion_point(interface_extends:acl.AclRuleSet) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:acl.AclRuleSet) + AclRuleSetOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * string name = 1; @@ -3280,8 +3286,9 @@ public final class Acl { /** * Protobuf type {@code acl.AclRuleSet} */ - public static final class AclRuleSet extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:acl.AclRuleSet) - AclRuleSetOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:acl.AclRuleSet) + AclRuleSet extends // @@protoc_insertion_point(message_implements:acl.AclRuleSet) + com.google.protobuf.GeneratedMessageV3 implements AclRuleSetOrBuilder { private static final long serialVersionUID = 0L; @@ -3677,8 +3684,9 @@ public final class Acl { /** * Protobuf type {@code acl.AclRuleSet} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:acl.AclRuleSet) - acl.Acl.AclRuleSetOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:acl.AclRuleSet) + Builder extends // @@protoc_insertion_point(builder_implements:acl.AclRuleSet) + com.google.protobuf.GeneratedMessageV3.Builder implements acl.Acl.AclRuleSetOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return acl.Acl.internal_static_acl_AclRuleSet_descriptor; diff --git a/src/policy/target/generated-sources/grpc/context/ContextOuterClass.java b/src/policy/target/generated-sources/grpc/context/ContextOuterClass.java index ceec864c6..e89bfb9fc 100644 --- a/src/policy/target/generated-sources/grpc/context/ContextOuterClass.java +++ b/src/policy/target/generated-sources/grpc/context/ContextOuterClass.java @@ -1652,8 +1652,8 @@ public final class ContextOuterClass { } } - public interface EmptyOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Empty) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.Empty) + EmptyOrBuilder extends com.google.protobuf.MessageOrBuilder { } /** @@ -1663,8 +1663,9 @@ public final class ContextOuterClass { * * Protobuf type {@code context.Empty} */ - public static final class Empty extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Empty) - EmptyOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.Empty) + Empty extends // @@protoc_insertion_point(message_implements:context.Empty) + com.google.protobuf.GeneratedMessageV3 implements EmptyOrBuilder { private static final long serialVersionUID = 0L; @@ -1825,8 +1826,9 @@ public final class ContextOuterClass { * * Protobuf type {@code context.Empty} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Empty) - context.ContextOuterClass.EmptyOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.Empty) + Builder extends // @@protoc_insertion_point(builder_implements:context.Empty) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.EmptyOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_Empty_descriptor; @@ -1990,8 +1992,8 @@ public final class ContextOuterClass { } } - public interface UuidOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Uuid) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.Uuid) + UuidOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * string uuid = 1; @@ -2009,8 +2011,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Uuid} */ - public static final class Uuid extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Uuid) - UuidOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.Uuid) + Uuid extends // @@protoc_insertion_point(message_implements:context.Uuid) + com.google.protobuf.GeneratedMessageV3 implements UuidOrBuilder { private static final long serialVersionUID = 0L; @@ -2216,8 +2219,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Uuid} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Uuid) - context.ContextOuterClass.UuidOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.Uuid) + Builder extends // @@protoc_insertion_point(builder_implements:context.Uuid) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.UuidOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_Uuid_descriptor; @@ -2482,8 +2486,8 @@ public final class ContextOuterClass { } } - public interface TimestampOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Timestamp) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.Timestamp) + TimestampOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * double timestamp = 1; @@ -2495,8 +2499,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Timestamp} */ - public static final class Timestamp extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Timestamp) - TimestampOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.Timestamp) + Timestamp extends // @@protoc_insertion_point(message_implements:context.Timestamp) + com.google.protobuf.GeneratedMessageV3 implements TimestampOrBuilder { private static final long serialVersionUID = 0L; @@ -2676,8 +2681,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Timestamp} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Timestamp) - context.ContextOuterClass.TimestampOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.Timestamp) + Builder extends // @@protoc_insertion_point(builder_implements:context.Timestamp) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.TimestampOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_Timestamp_descriptor; @@ -2899,8 +2905,8 @@ public final class ContextOuterClass { } } - public interface EventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Event) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.Event) + EventOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.Timestamp timestamp = 1; @@ -2935,8 +2941,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Event} */ - public static final class Event extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Event) - EventOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.Event) + Event extends // @@protoc_insertion_point(message_implements:context.Event) + com.google.protobuf.GeneratedMessageV3 implements EventOrBuilder { private static final long serialVersionUID = 0L; @@ -3173,8 +3180,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Event} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Event) - context.ContextOuterClass.EventOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.Event) + Builder extends // @@protoc_insertion_point(builder_implements:context.Event) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.EventOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_Event_descriptor; @@ -3557,8 +3565,8 @@ public final class ContextOuterClass { } } - public interface AnyEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.AnyEvent) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.AnyEvent) + AnyEventOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.ContextEvent context = 1; @@ -3685,8 +3693,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.AnyEvent} */ - public static final class AnyEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.AnyEvent) - AnyEventOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.AnyEvent) + AnyEvent extends // @@protoc_insertion_point(message_implements:context.AnyEvent) + com.google.protobuf.GeneratedMessageV3 implements AnyEventOrBuilder { private static final long serialVersionUID = 0L; @@ -4253,8 +4262,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.AnyEvent} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.AnyEvent) - context.ContextOuterClass.AnyEventOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.AnyEvent) + Builder extends // @@protoc_insertion_point(builder_implements:context.AnyEvent) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.AnyEventOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_AnyEvent_descriptor; @@ -5570,8 +5580,8 @@ public final class ContextOuterClass { } } - public interface ContextIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ContextId) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.ContextId) + ContextIdOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.Uuid context_uuid = 1; @@ -5598,8 +5608,9 @@ public final class ContextOuterClass { * * Protobuf type {@code context.ContextId} */ - public static final class ContextId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ContextId) - ContextIdOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.ContextId) + ContextId extends // @@protoc_insertion_point(message_implements:context.ContextId) + com.google.protobuf.GeneratedMessageV3 implements ContextIdOrBuilder { private static final long serialVersionUID = 0L; @@ -5806,8 +5817,9 @@ public final class ContextOuterClass { * * Protobuf type {@code context.ContextId} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ContextId) - context.ContextOuterClass.ContextIdOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.ContextId) + Builder extends // @@protoc_insertion_point(builder_implements:context.ContextId) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ContextIdOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_ContextId_descriptor; @@ -6117,8 +6129,8 @@ public final class ContextOuterClass { } } - public interface ContextOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Context) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.Context) + ContextOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.ContextId context_id = 1; @@ -6245,8 +6257,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Context} */ - public static final class Context extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Context) - ContextOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.Context) + Context extends // @@protoc_insertion_point(message_implements:context.Context) + com.google.protobuf.GeneratedMessageV3 implements ContextOrBuilder { private static final long serialVersionUID = 0L; @@ -6718,8 +6731,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Context} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Context) - context.ContextOuterClass.ContextOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.Context) + Builder extends // @@protoc_insertion_point(builder_implements:context.Context) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ContextOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_Context_descriptor; @@ -8127,8 +8141,8 @@ public final class ContextOuterClass { } } - public interface ContextIdListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ContextIdList) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.ContextIdList) + ContextIdListOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * repeated .context.ContextId context_ids = 1; @@ -8159,8 +8173,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ContextIdList} */ - public static final class ContextIdList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ContextIdList) - ContextIdListOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.ContextIdList) + ContextIdList extends // @@protoc_insertion_point(message_implements:context.ContextIdList) + com.google.protobuf.GeneratedMessageV3 implements ContextIdListOrBuilder { private static final long serialVersionUID = 0L; @@ -8375,8 +8390,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ContextIdList} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ContextIdList) - context.ContextOuterClass.ContextIdListOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.ContextIdList) + Builder extends // @@protoc_insertion_point(builder_implements:context.ContextIdList) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ContextIdListOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_ContextIdList_descriptor; @@ -8843,8 +8859,8 @@ public final class ContextOuterClass { } } - public interface ContextListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ContextList) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.ContextList) + ContextListOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * repeated .context.Context contexts = 1; @@ -8875,8 +8891,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ContextList} */ - public static final class ContextList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ContextList) - ContextListOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.ContextList) + ContextList extends // @@protoc_insertion_point(message_implements:context.ContextList) + com.google.protobuf.GeneratedMessageV3 implements ContextListOrBuilder { private static final long serialVersionUID = 0L; @@ -9091,8 +9108,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ContextList} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ContextList) - context.ContextOuterClass.ContextListOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.ContextList) + Builder extends // @@protoc_insertion_point(builder_implements:context.ContextList) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ContextListOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_ContextList_descriptor; @@ -9559,8 +9577,8 @@ public final class ContextOuterClass { } } - public interface ContextEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ContextEvent) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.ContextEvent) + ContextEventOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.Event event = 1; @@ -9600,8 +9618,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ContextEvent} */ - public static final class ContextEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ContextEvent) - ContextEventOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.ContextEvent) + ContextEvent extends // @@protoc_insertion_point(message_implements:context.ContextEvent) + com.google.protobuf.GeneratedMessageV3 implements ContextEventOrBuilder { private static final long serialVersionUID = 0L; @@ -9850,8 +9869,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ContextEvent} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ContextEvent) - context.ContextOuterClass.ContextEventOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.ContextEvent) + Builder extends // @@protoc_insertion_point(builder_implements:context.ContextEvent) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ContextEventOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_ContextEvent_descriptor; @@ -10297,8 +10317,8 @@ public final class ContextOuterClass { } } - public interface TopologyIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.TopologyId) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.TopologyId) + TopologyIdOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.ContextId context_id = 1; @@ -10342,8 +10362,9 @@ public final class ContextOuterClass { * * Protobuf type {@code context.TopologyId} */ - public static final class TopologyId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.TopologyId) - TopologyIdOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.TopologyId) + TopologyId extends // @@protoc_insertion_point(message_implements:context.TopologyId) + com.google.protobuf.GeneratedMessageV3 implements TopologyIdOrBuilder { private static final long serialVersionUID = 0L; @@ -10596,8 +10617,9 @@ public final class ContextOuterClass { * * Protobuf type {@code context.TopologyId} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.TopologyId) - context.ContextOuterClass.TopologyIdOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.TopologyId) + Builder extends // @@protoc_insertion_point(builder_implements:context.TopologyId) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.TopologyIdOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_TopologyId_descriptor; @@ -11043,8 +11065,8 @@ public final class ContextOuterClass { } } - public interface TopologyOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Topology) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.Topology) + TopologyOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.TopologyId topology_id = 1; @@ -11154,8 +11176,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Topology} */ - public static final class Topology extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Topology) - TopologyOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.Topology) + Topology extends // @@protoc_insertion_point(message_implements:context.Topology) + com.google.protobuf.GeneratedMessageV3 implements TopologyOrBuilder { private static final long serialVersionUID = 0L; @@ -11581,8 +11604,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Topology} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Topology) - context.ContextOuterClass.TopologyOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.Topology) + Builder extends // @@protoc_insertion_point(builder_implements:context.Topology) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.TopologyOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_Topology_descriptor; @@ -12854,8 +12878,8 @@ public final class ContextOuterClass { } } - public interface TopologyDetailsOrBuilder extends // @@protoc_insertion_point(interface_extends:context.TopologyDetails) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.TopologyDetails) + TopologyDetailsOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.TopologyId topology_id = 1; @@ -12965,8 +12989,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.TopologyDetails} */ - public static final class TopologyDetails extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.TopologyDetails) - TopologyDetailsOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.TopologyDetails) + TopologyDetails extends // @@protoc_insertion_point(message_implements:context.TopologyDetails) + com.google.protobuf.GeneratedMessageV3 implements TopologyDetailsOrBuilder { private static final long serialVersionUID = 0L; @@ -13392,8 +13417,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.TopologyDetails} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.TopologyDetails) - context.ContextOuterClass.TopologyDetailsOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.TopologyDetails) + Builder extends // @@protoc_insertion_point(builder_implements:context.TopologyDetails) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.TopologyDetailsOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_TopologyDetails_descriptor; @@ -14665,8 +14691,8 @@ public final class ContextOuterClass { } } - public interface TopologyIdListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.TopologyIdList) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.TopologyIdList) + TopologyIdListOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * repeated .context.TopologyId topology_ids = 1; @@ -14697,8 +14723,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.TopologyIdList} */ - public static final class TopologyIdList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.TopologyIdList) - TopologyIdListOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.TopologyIdList) + TopologyIdList extends // @@protoc_insertion_point(message_implements:context.TopologyIdList) + com.google.protobuf.GeneratedMessageV3 implements TopologyIdListOrBuilder { private static final long serialVersionUID = 0L; @@ -14913,8 +14940,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.TopologyIdList} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.TopologyIdList) - context.ContextOuterClass.TopologyIdListOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.TopologyIdList) + Builder extends // @@protoc_insertion_point(builder_implements:context.TopologyIdList) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.TopologyIdListOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_TopologyIdList_descriptor; @@ -15381,8 +15409,8 @@ public final class ContextOuterClass { } } - public interface TopologyListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.TopologyList) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.TopologyList) + TopologyListOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * repeated .context.Topology topologies = 1; @@ -15413,8 +15441,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.TopologyList} */ - public static final class TopologyList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.TopologyList) - TopologyListOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.TopologyList) + TopologyList extends // @@protoc_insertion_point(message_implements:context.TopologyList) + com.google.protobuf.GeneratedMessageV3 implements TopologyListOrBuilder { private static final long serialVersionUID = 0L; @@ -15629,8 +15658,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.TopologyList} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.TopologyList) - context.ContextOuterClass.TopologyListOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.TopologyList) + Builder extends // @@protoc_insertion_point(builder_implements:context.TopologyList) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.TopologyListOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_TopologyList_descriptor; @@ -16097,8 +16127,8 @@ public final class ContextOuterClass { } } - public interface TopologyEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.TopologyEvent) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.TopologyEvent) + TopologyEventOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.Event event = 1; @@ -16138,8 +16168,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.TopologyEvent} */ - public static final class TopologyEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.TopologyEvent) - TopologyEventOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.TopologyEvent) + TopologyEvent extends // @@protoc_insertion_point(message_implements:context.TopologyEvent) + com.google.protobuf.GeneratedMessageV3 implements TopologyEventOrBuilder { private static final long serialVersionUID = 0L; @@ -16388,8 +16419,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.TopologyEvent} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.TopologyEvent) - context.ContextOuterClass.TopologyEventOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.TopologyEvent) + Builder extends // @@protoc_insertion_point(builder_implements:context.TopologyEvent) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.TopologyEventOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_TopologyEvent_descriptor; @@ -16835,8 +16867,8 @@ public final class ContextOuterClass { } } - public interface DeviceIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.DeviceId) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.DeviceId) + DeviceIdOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.Uuid device_uuid = 1; @@ -16863,8 +16895,9 @@ public final class ContextOuterClass { * * Protobuf type {@code context.DeviceId} */ - public static final class DeviceId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.DeviceId) - DeviceIdOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.DeviceId) + DeviceId extends // @@protoc_insertion_point(message_implements:context.DeviceId) + com.google.protobuf.GeneratedMessageV3 implements DeviceIdOrBuilder { private static final long serialVersionUID = 0L; @@ -17071,8 +17104,9 @@ public final class ContextOuterClass { * * Protobuf type {@code context.DeviceId} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.DeviceId) - context.ContextOuterClass.DeviceIdOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.DeviceId) + Builder extends // @@protoc_insertion_point(builder_implements:context.DeviceId) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.DeviceIdOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_DeviceId_descriptor; @@ -17382,8 +17416,8 @@ public final class ContextOuterClass { } } - public interface DeviceOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Device) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.Device) + DeviceOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.DeviceId device_id = 1; @@ -17590,8 +17624,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Device} */ - public static final class Device extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Device) - DeviceOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.Device) + Device extends // @@protoc_insertion_point(message_implements:context.Device) + com.google.protobuf.GeneratedMessageV3 implements DeviceOrBuilder { private static final long serialVersionUID = 0L; @@ -18255,8 +18290,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Device} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Device) - context.ContextOuterClass.DeviceOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.Device) + Builder extends // @@protoc_insertion_point(builder_implements:context.Device) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.DeviceOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_Device_descriptor; @@ -19967,8 +20003,8 @@ public final class ContextOuterClass { } } - public interface ComponentOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Component) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.Component) + ComponentOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.Uuid component_uuid = 1; @@ -20084,8 +20120,9 @@ public final class ContextOuterClass { * * Protobuf type {@code context.Component} */ - public static final class Component extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Component) - ComponentOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.Component) + Component extends // @@protoc_insertion_point(message_implements:context.Component) + com.google.protobuf.GeneratedMessageV3 implements ComponentOrBuilder { private static final long serialVersionUID = 0L; @@ -20555,8 +20592,9 @@ public final class ContextOuterClass { * * Protobuf type {@code context.Component} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Component) - context.ContextOuterClass.ComponentOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.Component) + Builder extends // @@protoc_insertion_point(builder_implements:context.Component) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ComponentOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_Component_descriptor; @@ -21334,8 +21372,8 @@ public final class ContextOuterClass { } } - public interface DeviceConfigOrBuilder extends // @@protoc_insertion_point(interface_extends:context.DeviceConfig) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.DeviceConfig) + DeviceConfigOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * repeated .context.ConfigRule config_rules = 1; @@ -21366,8 +21404,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.DeviceConfig} */ - public static final class DeviceConfig extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.DeviceConfig) - DeviceConfigOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.DeviceConfig) + DeviceConfig extends // @@protoc_insertion_point(message_implements:context.DeviceConfig) + com.google.protobuf.GeneratedMessageV3 implements DeviceConfigOrBuilder { private static final long serialVersionUID = 0L; @@ -21582,8 +21621,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.DeviceConfig} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.DeviceConfig) - context.ContextOuterClass.DeviceConfigOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.DeviceConfig) + Builder extends // @@protoc_insertion_point(builder_implements:context.DeviceConfig) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.DeviceConfigOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_DeviceConfig_descriptor; @@ -22050,8 +22090,8 @@ public final class ContextOuterClass { } } - public interface DeviceIdListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.DeviceIdList) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.DeviceIdList) + DeviceIdListOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * repeated .context.DeviceId device_ids = 1; @@ -22082,8 +22122,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.DeviceIdList} */ - public static final class DeviceIdList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.DeviceIdList) - DeviceIdListOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.DeviceIdList) + DeviceIdList extends // @@protoc_insertion_point(message_implements:context.DeviceIdList) + com.google.protobuf.GeneratedMessageV3 implements DeviceIdListOrBuilder { private static final long serialVersionUID = 0L; @@ -22298,8 +22339,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.DeviceIdList} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.DeviceIdList) - context.ContextOuterClass.DeviceIdListOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.DeviceIdList) + Builder extends // @@protoc_insertion_point(builder_implements:context.DeviceIdList) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.DeviceIdListOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_DeviceIdList_descriptor; @@ -22766,8 +22808,8 @@ public final class ContextOuterClass { } } - public interface DeviceListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.DeviceList) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.DeviceList) + DeviceListOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * repeated .context.Device devices = 1; @@ -22798,8 +22840,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.DeviceList} */ - public static final class DeviceList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.DeviceList) - DeviceListOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.DeviceList) + DeviceList extends // @@protoc_insertion_point(message_implements:context.DeviceList) + com.google.protobuf.GeneratedMessageV3 implements DeviceListOrBuilder { private static final long serialVersionUID = 0L; @@ -23014,8 +23057,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.DeviceList} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.DeviceList) - context.ContextOuterClass.DeviceListOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.DeviceList) + Builder extends // @@protoc_insertion_point(builder_implements:context.DeviceList) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.DeviceListOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_DeviceList_descriptor; @@ -23482,8 +23526,8 @@ public final class ContextOuterClass { } } - public interface DeviceFilterOrBuilder extends // @@protoc_insertion_point(interface_extends:context.DeviceFilter) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.DeviceFilter) + DeviceFilterOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.DeviceIdList device_ids = 1; @@ -23524,8 +23568,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.DeviceFilter} */ - public static final class DeviceFilter extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.DeviceFilter) - DeviceFilterOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.DeviceFilter) + DeviceFilter extends // @@protoc_insertion_point(message_implements:context.DeviceFilter) + com.google.protobuf.GeneratedMessageV3 implements DeviceFilterOrBuilder { private static final long serialVersionUID = 0L; @@ -23797,8 +23842,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.DeviceFilter} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.DeviceFilter) - context.ContextOuterClass.DeviceFilterOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.DeviceFilter) + Builder extends // @@protoc_insertion_point(builder_implements:context.DeviceFilter) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.DeviceFilterOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_DeviceFilter_descriptor; @@ -24252,8 +24298,8 @@ public final class ContextOuterClass { } } - public interface DeviceEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.DeviceEvent) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.DeviceEvent) + DeviceEventOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.Event event = 1; @@ -24310,8 +24356,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.DeviceEvent} */ - public static final class DeviceEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.DeviceEvent) - DeviceEventOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.DeviceEvent) + DeviceEvent extends // @@protoc_insertion_point(message_implements:context.DeviceEvent) + com.google.protobuf.GeneratedMessageV3 implements DeviceEventOrBuilder { private static final long serialVersionUID = 0L; @@ -24606,8 +24653,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.DeviceEvent} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.DeviceEvent) - context.ContextOuterClass.DeviceEventOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.DeviceEvent) + Builder extends // @@protoc_insertion_point(builder_implements:context.DeviceEvent) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.DeviceEventOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_DeviceEvent_descriptor; @@ -25189,8 +25237,8 @@ public final class ContextOuterClass { } } - public interface LinkIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.LinkId) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.LinkId) + LinkIdOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.Uuid link_uuid = 1; @@ -25217,8 +25265,9 @@ public final class ContextOuterClass { * * Protobuf type {@code context.LinkId} */ - public static final class LinkId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.LinkId) - LinkIdOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.LinkId) + LinkId extends // @@protoc_insertion_point(message_implements:context.LinkId) + com.google.protobuf.GeneratedMessageV3 implements LinkIdOrBuilder { private static final long serialVersionUID = 0L; @@ -25425,8 +25474,9 @@ public final class ContextOuterClass { * * Protobuf type {@code context.LinkId} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.LinkId) - context.ContextOuterClass.LinkIdOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.LinkId) + Builder extends // @@protoc_insertion_point(builder_implements:context.LinkId) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.LinkIdOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_LinkId_descriptor; @@ -25736,8 +25786,8 @@ public final class ContextOuterClass { } } - public interface LinkAttributesOrBuilder extends // @@protoc_insertion_point(interface_extends:context.LinkAttributes) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.LinkAttributes) + LinkAttributesOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * bool is_bidirectional = 1; @@ -25761,8 +25811,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.LinkAttributes} */ - public static final class LinkAttributes extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.LinkAttributes) - LinkAttributesOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.LinkAttributes) + LinkAttributes extends // @@protoc_insertion_point(message_implements:context.LinkAttributes) + com.google.protobuf.GeneratedMessageV3 implements LinkAttributesOrBuilder { private static final long serialVersionUID = 0L; @@ -25988,8 +26039,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.LinkAttributes} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.LinkAttributes) - context.ContextOuterClass.LinkAttributesOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.LinkAttributes) + Builder extends // @@protoc_insertion_point(builder_implements:context.LinkAttributes) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.LinkAttributesOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_LinkAttributes_descriptor; @@ -26307,8 +26359,8 @@ public final class ContextOuterClass { } } - public interface LinkOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Link) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.Link) + LinkOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.LinkId link_id = 1; @@ -26397,8 +26449,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Link} */ - public static final class Link extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Link) - LinkOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.Link) + Link extends // @@protoc_insertion_point(message_implements:context.Link) + com.google.protobuf.GeneratedMessageV3 implements LinkOrBuilder { private static final long serialVersionUID = 0L; @@ -26788,8 +26841,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Link} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Link) - context.ContextOuterClass.LinkOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.Link) + Builder extends // @@protoc_insertion_point(builder_implements:context.Link) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.LinkOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_Link_descriptor; @@ -27692,8 +27746,8 @@ public final class ContextOuterClass { } } - public interface LinkIdListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.LinkIdList) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.LinkIdList) + LinkIdListOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * repeated .context.LinkId link_ids = 1; @@ -27724,8 +27778,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.LinkIdList} */ - public static final class LinkIdList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.LinkIdList) - LinkIdListOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.LinkIdList) + LinkIdList extends // @@protoc_insertion_point(message_implements:context.LinkIdList) + com.google.protobuf.GeneratedMessageV3 implements LinkIdListOrBuilder { private static final long serialVersionUID = 0L; @@ -27940,8 +27995,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.LinkIdList} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.LinkIdList) - context.ContextOuterClass.LinkIdListOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.LinkIdList) + Builder extends // @@protoc_insertion_point(builder_implements:context.LinkIdList) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.LinkIdListOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_LinkIdList_descriptor; @@ -28408,8 +28464,8 @@ public final class ContextOuterClass { } } - public interface LinkListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.LinkList) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.LinkList) + LinkListOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * repeated .context.Link links = 1; @@ -28440,8 +28496,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.LinkList} */ - public static final class LinkList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.LinkList) - LinkListOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.LinkList) + LinkList extends // @@protoc_insertion_point(message_implements:context.LinkList) + com.google.protobuf.GeneratedMessageV3 implements LinkListOrBuilder { private static final long serialVersionUID = 0L; @@ -28656,8 +28713,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.LinkList} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.LinkList) - context.ContextOuterClass.LinkListOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.LinkList) + Builder extends // @@protoc_insertion_point(builder_implements:context.LinkList) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.LinkListOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_LinkList_descriptor; @@ -29124,8 +29182,8 @@ public final class ContextOuterClass { } } - public interface LinkEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.LinkEvent) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.LinkEvent) + LinkEventOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.Event event = 1; @@ -29165,8 +29223,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.LinkEvent} */ - public static final class LinkEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.LinkEvent) - LinkEventOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.LinkEvent) + LinkEvent extends // @@protoc_insertion_point(message_implements:context.LinkEvent) + com.google.protobuf.GeneratedMessageV3 implements LinkEventOrBuilder { private static final long serialVersionUID = 0L; @@ -29415,8 +29474,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.LinkEvent} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.LinkEvent) - context.ContextOuterClass.LinkEventOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.LinkEvent) + Builder extends // @@protoc_insertion_point(builder_implements:context.LinkEvent) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.LinkEventOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_LinkEvent_descriptor; @@ -29862,8 +29922,8 @@ public final class ContextOuterClass { } } - public interface ServiceIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ServiceId) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.ServiceId) + ServiceIdOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.ContextId context_id = 1; @@ -29907,8 +29967,9 @@ public final class ContextOuterClass { * * Protobuf type {@code context.ServiceId} */ - public static final class ServiceId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ServiceId) - ServiceIdOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.ServiceId) + ServiceId extends // @@protoc_insertion_point(message_implements:context.ServiceId) + com.google.protobuf.GeneratedMessageV3 implements ServiceIdOrBuilder { private static final long serialVersionUID = 0L; @@ -30161,8 +30222,9 @@ public final class ContextOuterClass { * * Protobuf type {@code context.ServiceId} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ServiceId) - context.ContextOuterClass.ServiceIdOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.ServiceId) + Builder extends // @@protoc_insertion_point(builder_implements:context.ServiceId) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceIdOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_ServiceId_descriptor; @@ -30608,8 +30670,8 @@ public final class ContextOuterClass { } } - public interface ServiceOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Service) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.Service) + ServiceOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.ServiceId service_id = 1; @@ -30757,8 +30819,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Service} */ - public static final class Service extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Service) - ServiceOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.Service) + Service extends // @@protoc_insertion_point(message_implements:context.Service) + com.google.protobuf.GeneratedMessageV3 implements ServiceOrBuilder { private static final long serialVersionUID = 0L; @@ -31298,8 +31361,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Service} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Service) - context.ContextOuterClass.ServiceOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.Service) + Builder extends // @@protoc_insertion_point(builder_implements:context.Service) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_Service_descriptor; @@ -32763,8 +32827,8 @@ public final class ContextOuterClass { } } - public interface ServiceStatusOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ServiceStatus) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.ServiceStatus) + ServiceStatusOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.ServiceStatusEnum service_status = 1; @@ -32782,8 +32846,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ServiceStatus} */ - public static final class ServiceStatus extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ServiceStatus) - ServiceStatusOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.ServiceStatus) + ServiceStatus extends // @@protoc_insertion_point(message_implements:context.ServiceStatus) + com.google.protobuf.GeneratedMessageV3 implements ServiceStatusOrBuilder { private static final long serialVersionUID = 0L; @@ -32974,8 +33039,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ServiceStatus} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ServiceStatus) - context.ContextOuterClass.ServiceStatusOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.ServiceStatus) + Builder extends // @@protoc_insertion_point(builder_implements:context.ServiceStatus) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceStatusOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_ServiceStatus_descriptor; @@ -33222,8 +33288,8 @@ public final class ContextOuterClass { } } - public interface ServiceConfigOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ServiceConfig) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.ServiceConfig) + ServiceConfigOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * repeated .context.ConfigRule config_rules = 1; @@ -33254,8 +33320,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ServiceConfig} */ - public static final class ServiceConfig extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ServiceConfig) - ServiceConfigOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.ServiceConfig) + ServiceConfig extends // @@protoc_insertion_point(message_implements:context.ServiceConfig) + com.google.protobuf.GeneratedMessageV3 implements ServiceConfigOrBuilder { private static final long serialVersionUID = 0L; @@ -33470,8 +33537,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ServiceConfig} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ServiceConfig) - context.ContextOuterClass.ServiceConfigOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.ServiceConfig) + Builder extends // @@protoc_insertion_point(builder_implements:context.ServiceConfig) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceConfigOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_ServiceConfig_descriptor; @@ -33938,8 +34006,8 @@ public final class ContextOuterClass { } } - public interface ServiceIdListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ServiceIdList) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.ServiceIdList) + ServiceIdListOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * repeated .context.ServiceId service_ids = 1; @@ -33970,8 +34038,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ServiceIdList} */ - public static final class ServiceIdList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ServiceIdList) - ServiceIdListOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.ServiceIdList) + ServiceIdList extends // @@protoc_insertion_point(message_implements:context.ServiceIdList) + com.google.protobuf.GeneratedMessageV3 implements ServiceIdListOrBuilder { private static final long serialVersionUID = 0L; @@ -34186,8 +34255,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ServiceIdList} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ServiceIdList) - context.ContextOuterClass.ServiceIdListOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.ServiceIdList) + Builder extends // @@protoc_insertion_point(builder_implements:context.ServiceIdList) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceIdListOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_ServiceIdList_descriptor; @@ -34654,8 +34724,8 @@ public final class ContextOuterClass { } } - public interface ServiceListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ServiceList) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.ServiceList) + ServiceListOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * repeated .context.Service services = 1; @@ -34686,8 +34756,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ServiceList} */ - public static final class ServiceList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ServiceList) - ServiceListOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.ServiceList) + ServiceList extends // @@protoc_insertion_point(message_implements:context.ServiceList) + com.google.protobuf.GeneratedMessageV3 implements ServiceListOrBuilder { private static final long serialVersionUID = 0L; @@ -34902,8 +34973,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ServiceList} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ServiceList) - context.ContextOuterClass.ServiceListOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.ServiceList) + Builder extends // @@protoc_insertion_point(builder_implements:context.ServiceList) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceListOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_ServiceList_descriptor; @@ -35370,8 +35442,8 @@ public final class ContextOuterClass { } } - public interface ServiceFilterOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ServiceFilter) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.ServiceFilter) + ServiceFilterOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.ServiceIdList service_ids = 1; @@ -35412,8 +35484,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ServiceFilter} */ - public static final class ServiceFilter extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ServiceFilter) - ServiceFilterOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.ServiceFilter) + ServiceFilter extends // @@protoc_insertion_point(message_implements:context.ServiceFilter) + com.google.protobuf.GeneratedMessageV3 implements ServiceFilterOrBuilder { private static final long serialVersionUID = 0L; @@ -35685,8 +35758,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ServiceFilter} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ServiceFilter) - context.ContextOuterClass.ServiceFilterOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.ServiceFilter) + Builder extends // @@protoc_insertion_point(builder_implements:context.ServiceFilter) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceFilterOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_ServiceFilter_descriptor; @@ -36140,8 +36214,8 @@ public final class ContextOuterClass { } } - public interface ServiceEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ServiceEvent) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.ServiceEvent) + ServiceEventOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.Event event = 1; @@ -36181,8 +36255,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ServiceEvent} */ - public static final class ServiceEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ServiceEvent) - ServiceEventOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.ServiceEvent) + ServiceEvent extends // @@protoc_insertion_point(message_implements:context.ServiceEvent) + com.google.protobuf.GeneratedMessageV3 implements ServiceEventOrBuilder { private static final long serialVersionUID = 0L; @@ -36431,8 +36506,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ServiceEvent} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ServiceEvent) - context.ContextOuterClass.ServiceEventOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.ServiceEvent) + Builder extends // @@protoc_insertion_point(builder_implements:context.ServiceEvent) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceEventOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_ServiceEvent_descriptor; @@ -36878,8 +36954,8 @@ public final class ContextOuterClass { } } - public interface SliceIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.SliceId) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.SliceId) + SliceIdOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.ContextId context_id = 1; @@ -36923,8 +36999,9 @@ public final class ContextOuterClass { * * Protobuf type {@code context.SliceId} */ - public static final class SliceId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.SliceId) - SliceIdOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.SliceId) + SliceId extends // @@protoc_insertion_point(message_implements:context.SliceId) + com.google.protobuf.GeneratedMessageV3 implements SliceIdOrBuilder { private static final long serialVersionUID = 0L; @@ -37177,8 +37254,9 @@ public final class ContextOuterClass { * * Protobuf type {@code context.SliceId} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.SliceId) - context.ContextOuterClass.SliceIdOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.SliceId) + Builder extends // @@protoc_insertion_point(builder_implements:context.SliceId) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceIdOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_SliceId_descriptor; @@ -37624,8 +37702,8 @@ public final class ContextOuterClass { } } - public interface SliceOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Slice) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.Slice) + SliceOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.SliceId slice_id = 1; @@ -37828,8 +37906,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Slice} */ - public static final class Slice extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Slice) - SliceOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.Slice) + Slice extends // @@protoc_insertion_point(message_implements:context.Slice) + com.google.protobuf.GeneratedMessageV3 implements SliceOrBuilder { private static final long serialVersionUID = 0L; @@ -38497,8 +38576,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Slice} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Slice) - context.ContextOuterClass.SliceOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.Slice) + Builder extends // @@protoc_insertion_point(builder_implements:context.Slice) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_Slice_descriptor; @@ -40603,8 +40683,8 @@ public final class ContextOuterClass { } } - public interface SliceOwnerOrBuilder extends // @@protoc_insertion_point(interface_extends:context.SliceOwner) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.SliceOwner) + SliceOwnerOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.Uuid owner_uuid = 1; @@ -40639,8 +40719,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.SliceOwner} */ - public static final class SliceOwner extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.SliceOwner) - SliceOwnerOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.SliceOwner) + SliceOwner extends // @@protoc_insertion_point(message_implements:context.SliceOwner) + com.google.protobuf.GeneratedMessageV3 implements SliceOwnerOrBuilder { private static final long serialVersionUID = 0L; @@ -40892,8 +40973,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.SliceOwner} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.SliceOwner) - context.ContextOuterClass.SliceOwnerOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.SliceOwner) + Builder extends // @@protoc_insertion_point(builder_implements:context.SliceOwner) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceOwnerOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_SliceOwner_descriptor; @@ -41294,8 +41376,8 @@ public final class ContextOuterClass { } } - public interface SliceStatusOrBuilder extends // @@protoc_insertion_point(interface_extends:context.SliceStatus) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.SliceStatus) + SliceStatusOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.SliceStatusEnum slice_status = 1; @@ -41313,8 +41395,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.SliceStatus} */ - public static final class SliceStatus extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.SliceStatus) - SliceStatusOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.SliceStatus) + SliceStatus extends // @@protoc_insertion_point(message_implements:context.SliceStatus) + com.google.protobuf.GeneratedMessageV3 implements SliceStatusOrBuilder { private static final long serialVersionUID = 0L; @@ -41505,8 +41588,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.SliceStatus} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.SliceStatus) - context.ContextOuterClass.SliceStatusOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.SliceStatus) + Builder extends // @@protoc_insertion_point(builder_implements:context.SliceStatus) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceStatusOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_SliceStatus_descriptor; @@ -41753,8 +41837,8 @@ public final class ContextOuterClass { } } - public interface SliceConfigOrBuilder extends // @@protoc_insertion_point(interface_extends:context.SliceConfig) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.SliceConfig) + SliceConfigOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * repeated .context.ConfigRule config_rules = 1; @@ -41785,8 +41869,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.SliceConfig} */ - public static final class SliceConfig extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.SliceConfig) - SliceConfigOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.SliceConfig) + SliceConfig extends // @@protoc_insertion_point(message_implements:context.SliceConfig) + com.google.protobuf.GeneratedMessageV3 implements SliceConfigOrBuilder { private static final long serialVersionUID = 0L; @@ -42001,8 +42086,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.SliceConfig} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.SliceConfig) - context.ContextOuterClass.SliceConfigOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.SliceConfig) + Builder extends // @@protoc_insertion_point(builder_implements:context.SliceConfig) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceConfigOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_SliceConfig_descriptor; @@ -42469,8 +42555,8 @@ public final class ContextOuterClass { } } - public interface SliceIdListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.SliceIdList) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.SliceIdList) + SliceIdListOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * repeated .context.SliceId slice_ids = 1; @@ -42501,8 +42587,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.SliceIdList} */ - public static final class SliceIdList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.SliceIdList) - SliceIdListOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.SliceIdList) + SliceIdList extends // @@protoc_insertion_point(message_implements:context.SliceIdList) + com.google.protobuf.GeneratedMessageV3 implements SliceIdListOrBuilder { private static final long serialVersionUID = 0L; @@ -42717,8 +42804,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.SliceIdList} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.SliceIdList) - context.ContextOuterClass.SliceIdListOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.SliceIdList) + Builder extends // @@protoc_insertion_point(builder_implements:context.SliceIdList) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceIdListOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_SliceIdList_descriptor; @@ -43185,8 +43273,8 @@ public final class ContextOuterClass { } } - public interface SliceListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.SliceList) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.SliceList) + SliceListOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * repeated .context.Slice slices = 1; @@ -43217,8 +43305,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.SliceList} */ - public static final class SliceList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.SliceList) - SliceListOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.SliceList) + SliceList extends // @@protoc_insertion_point(message_implements:context.SliceList) + com.google.protobuf.GeneratedMessageV3 implements SliceListOrBuilder { private static final long serialVersionUID = 0L; @@ -43433,8 +43522,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.SliceList} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.SliceList) - context.ContextOuterClass.SliceListOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.SliceList) + Builder extends // @@protoc_insertion_point(builder_implements:context.SliceList) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceListOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_SliceList_descriptor; @@ -43901,8 +43991,8 @@ public final class ContextOuterClass { } } - public interface SliceFilterOrBuilder extends // @@protoc_insertion_point(interface_extends:context.SliceFilter) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.SliceFilter) + SliceFilterOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.SliceIdList slice_ids = 1; @@ -43955,8 +44045,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.SliceFilter} */ - public static final class SliceFilter extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.SliceFilter) - SliceFilterOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.SliceFilter) + SliceFilter extends // @@protoc_insertion_point(message_implements:context.SliceFilter) + com.google.protobuf.GeneratedMessageV3 implements SliceFilterOrBuilder { private static final long serialVersionUID = 0L; @@ -44274,8 +44365,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.SliceFilter} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.SliceFilter) - context.ContextOuterClass.SliceFilterOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.SliceFilter) + Builder extends // @@protoc_insertion_point(builder_implements:context.SliceFilter) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceFilterOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_SliceFilter_descriptor; @@ -44825,8 +44917,8 @@ public final class ContextOuterClass { } } - public interface SliceEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.SliceEvent) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.SliceEvent) + SliceEventOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.Event event = 1; @@ -44866,8 +44958,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.SliceEvent} */ - public static final class SliceEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.SliceEvent) - SliceEventOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.SliceEvent) + SliceEvent extends // @@protoc_insertion_point(message_implements:context.SliceEvent) + com.google.protobuf.GeneratedMessageV3 implements SliceEventOrBuilder { private static final long serialVersionUID = 0L; @@ -45116,8 +45209,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.SliceEvent} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.SliceEvent) - context.ContextOuterClass.SliceEventOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.SliceEvent) + Builder extends // @@protoc_insertion_point(builder_implements:context.SliceEvent) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceEventOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_SliceEvent_descriptor; @@ -45563,8 +45657,8 @@ public final class ContextOuterClass { } } - public interface ConnectionIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionId) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.ConnectionId) + ConnectionIdOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.Uuid connection_uuid = 1; @@ -45591,8 +45685,9 @@ public final class ContextOuterClass { * * Protobuf type {@code context.ConnectionId} */ - public static final class ConnectionId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionId) - ConnectionIdOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.ConnectionId) + ConnectionId extends // @@protoc_insertion_point(message_implements:context.ConnectionId) + com.google.protobuf.GeneratedMessageV3 implements ConnectionIdOrBuilder { private static final long serialVersionUID = 0L; @@ -45799,8 +45894,9 @@ public final class ContextOuterClass { * * Protobuf type {@code context.ConnectionId} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionId) - context.ContextOuterClass.ConnectionIdOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionId) + Builder extends // @@protoc_insertion_point(builder_implements:context.ConnectionId) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionIdOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_ConnectionId_descriptor; @@ -46110,8 +46206,8 @@ public final class ContextOuterClass { } } - public interface ConnectionSettings_L0OrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L0) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L0) + ConnectionSettings_L0OrBuilder extends com.google.protobuf.MessageOrBuilder { /** * string lsp_symbolic_name = 1; @@ -46129,8 +46225,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ConnectionSettings_L0} */ - public static final class ConnectionSettings_L0 extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L0) - ConnectionSettings_L0OrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L0) + ConnectionSettings_L0 extends // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L0) + com.google.protobuf.GeneratedMessageV3 implements ConnectionSettings_L0OrBuilder { private static final long serialVersionUID = 0L; @@ -46336,8 +46433,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ConnectionSettings_L0} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L0) - context.ContextOuterClass.ConnectionSettings_L0OrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L0) + Builder extends // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L0) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionSettings_L0OrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_ConnectionSettings_L0_descriptor; @@ -46602,8 +46700,8 @@ public final class ContextOuterClass { } } - public interface ConnectionSettings_L2OrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L2) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L2) + ConnectionSettings_L2OrBuilder extends com.google.protobuf.MessageOrBuilder { /** * string src_mac_address = 1; @@ -46657,8 +46755,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ConnectionSettings_L2} */ - public static final class ConnectionSettings_L2 extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L2) - ConnectionSettings_L2OrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L2) + ConnectionSettings_L2 extends // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L2) + com.google.protobuf.GeneratedMessageV3 implements ConnectionSettings_L2OrBuilder { private static final long serialVersionUID = 0L; @@ -47005,8 +47104,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ConnectionSettings_L2} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L2) - context.ContextOuterClass.ConnectionSettings_L2OrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L2) + Builder extends // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L2) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionSettings_L2OrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_ConnectionSettings_L2_descriptor; @@ -47554,8 +47654,8 @@ public final class ContextOuterClass { } } - public interface ConnectionSettings_L3OrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L3) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L3) + ConnectionSettings_L3OrBuilder extends com.google.protobuf.MessageOrBuilder { /** * string src_ip_address = 1; @@ -47603,8 +47703,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ConnectionSettings_L3} */ - public static final class ConnectionSettings_L3 extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L3) - ConnectionSettings_L3OrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L3) + ConnectionSettings_L3 extends // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L3) + com.google.protobuf.GeneratedMessageV3 implements ConnectionSettings_L3OrBuilder { private static final long serialVersionUID = 0L; @@ -47928,8 +48029,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ConnectionSettings_L3} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L3) - context.ContextOuterClass.ConnectionSettings_L3OrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L3) + Builder extends // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L3) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionSettings_L3OrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_ConnectionSettings_L3_descriptor; @@ -48429,8 +48531,8 @@ public final class ContextOuterClass { } } - public interface ConnectionSettings_L4OrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L4) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L4) + ConnectionSettings_L4OrBuilder extends com.google.protobuf.MessageOrBuilder { /** * uint32 src_port = 1; @@ -48460,8 +48562,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ConnectionSettings_L4} */ - public static final class ConnectionSettings_L4 extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L4) - ConnectionSettings_L4OrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L4) + ConnectionSettings_L4 extends // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L4) + com.google.protobuf.GeneratedMessageV3 implements ConnectionSettings_L4OrBuilder { private static final long serialVersionUID = 0L; @@ -48710,8 +48813,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ConnectionSettings_L4} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L4) - context.ContextOuterClass.ConnectionSettings_L4OrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L4) + Builder extends // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L4) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionSettings_L4OrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_ConnectionSettings_L4_descriptor; @@ -49077,8 +49181,8 @@ public final class ContextOuterClass { } } - public interface ConnectionSettingsOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionSettings) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.ConnectionSettings) + ConnectionSettingsOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.ConnectionSettings_L0 l0 = 1; @@ -49152,8 +49256,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ConnectionSettings} */ - public static final class ConnectionSettings extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionSettings) - ConnectionSettingsOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.ConnectionSettings) + ConnectionSettings extends // @@protoc_insertion_point(message_implements:context.ConnectionSettings) + com.google.protobuf.GeneratedMessageV3 implements ConnectionSettingsOrBuilder { private static final long serialVersionUID = 0L; @@ -49494,8 +49599,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ConnectionSettings} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionSettings) - context.ContextOuterClass.ConnectionSettingsOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionSettings) + Builder extends // @@protoc_insertion_point(builder_implements:context.ConnectionSettings) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionSettingsOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_ConnectionSettings_descriptor; @@ -50213,8 +50319,8 @@ public final class ContextOuterClass { } } - public interface ConnectionOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Connection) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.Connection) + ConnectionOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.ConnectionId connection_id = 1; @@ -50321,8 +50427,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Connection} */ - public static final class Connection extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Connection) - ConnectionOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.Connection) + Connection extends // @@protoc_insertion_point(message_implements:context.Connection) + com.google.protobuf.GeneratedMessageV3 implements ConnectionOrBuilder { private static final long serialVersionUID = 0L; @@ -50733,8 +50840,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Connection} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Connection) - context.ContextOuterClass.ConnectionOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.Connection) + Builder extends // @@protoc_insertion_point(builder_implements:context.Connection) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_Connection_descriptor; @@ -51898,8 +52006,8 @@ public final class ContextOuterClass { } } - public interface ConnectionIdListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionIdList) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.ConnectionIdList) + ConnectionIdListOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * repeated .context.ConnectionId connection_ids = 1; @@ -51930,8 +52038,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ConnectionIdList} */ - public static final class ConnectionIdList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionIdList) - ConnectionIdListOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.ConnectionIdList) + ConnectionIdList extends // @@protoc_insertion_point(message_implements:context.ConnectionIdList) + com.google.protobuf.GeneratedMessageV3 implements ConnectionIdListOrBuilder { private static final long serialVersionUID = 0L; @@ -52146,8 +52255,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ConnectionIdList} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionIdList) - context.ContextOuterClass.ConnectionIdListOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionIdList) + Builder extends // @@protoc_insertion_point(builder_implements:context.ConnectionIdList) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionIdListOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_ConnectionIdList_descriptor; @@ -52614,8 +52724,8 @@ public final class ContextOuterClass { } } - public interface ConnectionListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionList) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.ConnectionList) + ConnectionListOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * repeated .context.Connection connections = 1; @@ -52646,8 +52756,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ConnectionList} */ - public static final class ConnectionList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionList) - ConnectionListOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.ConnectionList) + ConnectionList extends // @@protoc_insertion_point(message_implements:context.ConnectionList) + com.google.protobuf.GeneratedMessageV3 implements ConnectionListOrBuilder { private static final long serialVersionUID = 0L; @@ -52862,8 +52973,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ConnectionList} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionList) - context.ContextOuterClass.ConnectionListOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionList) + Builder extends // @@protoc_insertion_point(builder_implements:context.ConnectionList) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionListOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_ConnectionList_descriptor; @@ -53330,8 +53442,8 @@ public final class ContextOuterClass { } } - public interface ConnectionEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionEvent) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.ConnectionEvent) + ConnectionEventOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.Event event = 1; @@ -53371,8 +53483,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ConnectionEvent} */ - public static final class ConnectionEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionEvent) - ConnectionEventOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.ConnectionEvent) + ConnectionEvent extends // @@protoc_insertion_point(message_implements:context.ConnectionEvent) + com.google.protobuf.GeneratedMessageV3 implements ConnectionEventOrBuilder { private static final long serialVersionUID = 0L; @@ -53621,8 +53734,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ConnectionEvent} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionEvent) - context.ContextOuterClass.ConnectionEventOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionEvent) + Builder extends // @@protoc_insertion_point(builder_implements:context.ConnectionEvent) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionEventOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_ConnectionEvent_descriptor; @@ -54068,8 +54182,8 @@ public final class ContextOuterClass { } } - public interface EndPointIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.EndPointId) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.EndPointId) + EndPointIdOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.TopologyId topology_id = 1; @@ -54130,8 +54244,9 @@ public final class ContextOuterClass { * * Protobuf type {@code context.EndPointId} */ - public static final class EndPointId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.EndPointId) - EndPointIdOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.EndPointId) + EndPointId extends // @@protoc_insertion_point(message_implements:context.EndPointId) + com.google.protobuf.GeneratedMessageV3 implements EndPointIdOrBuilder { private static final long serialVersionUID = 0L; @@ -54430,8 +54545,9 @@ public final class ContextOuterClass { * * Protobuf type {@code context.EndPointId} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.EndPointId) - context.ContextOuterClass.EndPointIdOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.EndPointId) + Builder extends // @@protoc_insertion_point(builder_implements:context.EndPointId) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.EndPointIdOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_EndPointId_descriptor; @@ -55013,8 +55129,8 @@ public final class ContextOuterClass { } } - public interface EndPointOrBuilder extends // @@protoc_insertion_point(interface_extends:context.EndPoint) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.EndPoint) + EndPointOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.EndPointId endpoint_id = 1; @@ -55143,8 +55259,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.EndPoint} */ - public static final class EndPoint extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.EndPoint) - EndPointOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.EndPoint) + EndPoint extends // @@protoc_insertion_point(message_implements:context.EndPoint) + com.google.protobuf.GeneratedMessageV3 implements EndPointOrBuilder { private static final long serialVersionUID = 0L; @@ -55680,8 +55797,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.EndPoint} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.EndPoint) - context.ContextOuterClass.EndPointOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.EndPoint) + Builder extends // @@protoc_insertion_point(builder_implements:context.EndPoint) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.EndPointOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_EndPoint_descriptor; @@ -56664,8 +56782,8 @@ public final class ContextOuterClass { } } - public interface EndPointNameOrBuilder extends // @@protoc_insertion_point(interface_extends:context.EndPointName) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.EndPointName) + EndPointNameOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.EndPointId endpoint_id = 1; @@ -56724,8 +56842,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.EndPointName} */ - public static final class EndPointName extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.EndPointName) - EndPointNameOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.EndPointName) + EndPointName extends // @@protoc_insertion_point(message_implements:context.EndPointName) + com.google.protobuf.GeneratedMessageV3 implements EndPointNameOrBuilder { private static final long serialVersionUID = 0L; @@ -57075,8 +57194,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.EndPointName} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.EndPointName) - context.ContextOuterClass.EndPointNameOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.EndPointName) + Builder extends // @@protoc_insertion_point(builder_implements:context.EndPointName) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.EndPointNameOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_EndPointName_descriptor; @@ -57659,8 +57779,8 @@ public final class ContextOuterClass { } } - public interface EndPointIdListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.EndPointIdList) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.EndPointIdList) + EndPointIdListOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * repeated .context.EndPointId endpoint_ids = 1; @@ -57691,8 +57811,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.EndPointIdList} */ - public static final class EndPointIdList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.EndPointIdList) - EndPointIdListOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.EndPointIdList) + EndPointIdList extends // @@protoc_insertion_point(message_implements:context.EndPointIdList) + com.google.protobuf.GeneratedMessageV3 implements EndPointIdListOrBuilder { private static final long serialVersionUID = 0L; @@ -57907,8 +58028,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.EndPointIdList} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.EndPointIdList) - context.ContextOuterClass.EndPointIdListOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.EndPointIdList) + Builder extends // @@protoc_insertion_point(builder_implements:context.EndPointIdList) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.EndPointIdListOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_EndPointIdList_descriptor; @@ -58375,8 +58497,8 @@ public final class ContextOuterClass { } } - public interface EndPointNameListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.EndPointNameList) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.EndPointNameList) + EndPointNameListOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * repeated .context.EndPointName endpoint_names = 1; @@ -58407,8 +58529,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.EndPointNameList} */ - public static final class EndPointNameList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.EndPointNameList) - EndPointNameListOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.EndPointNameList) + EndPointNameList extends // @@protoc_insertion_point(message_implements:context.EndPointNameList) + com.google.protobuf.GeneratedMessageV3 implements EndPointNameListOrBuilder { private static final long serialVersionUID = 0L; @@ -58623,8 +58746,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.EndPointNameList} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.EndPointNameList) - context.ContextOuterClass.EndPointNameListOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.EndPointNameList) + Builder extends // @@protoc_insertion_point(builder_implements:context.EndPointNameList) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.EndPointNameListOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_EndPointNameList_descriptor; @@ -59091,8 +59215,8 @@ public final class ContextOuterClass { } } - public interface ConfigRule_CustomOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConfigRule_Custom) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.ConfigRule_Custom) + ConfigRule_CustomOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * string resource_key = 1; @@ -59122,8 +59246,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ConfigRule_Custom} */ - public static final class ConfigRule_Custom extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConfigRule_Custom) - ConfigRule_CustomOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.ConfigRule_Custom) + ConfigRule_Custom extends // @@protoc_insertion_point(message_implements:context.ConfigRule_Custom) + com.google.protobuf.GeneratedMessageV3 implements ConfigRule_CustomOrBuilder { private static final long serialVersionUID = 0L; @@ -59378,8 +59503,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ConfigRule_Custom} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConfigRule_Custom) - context.ContextOuterClass.ConfigRule_CustomOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.ConfigRule_Custom) + Builder extends // @@protoc_insertion_point(builder_implements:context.ConfigRule_Custom) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConfigRule_CustomOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_ConfigRule_Custom_descriptor; @@ -59735,8 +59861,8 @@ public final class ContextOuterClass { } } - public interface ConfigRule_ACLOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConfigRule_ACL) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.ConfigRule_ACL) + ConfigRule_ACLOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.EndPointId endpoint_id = 1; @@ -59776,8 +59902,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ConfigRule_ACL} */ - public static final class ConfigRule_ACL extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConfigRule_ACL) - ConfigRule_ACLOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.ConfigRule_ACL) + ConfigRule_ACL extends // @@protoc_insertion_point(message_implements:context.ConfigRule_ACL) + com.google.protobuf.GeneratedMessageV3 implements ConfigRule_ACLOrBuilder { private static final long serialVersionUID = 0L; @@ -60026,8 +60153,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ConfigRule_ACL} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConfigRule_ACL) - context.ContextOuterClass.ConfigRule_ACLOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.ConfigRule_ACL) + Builder extends // @@protoc_insertion_point(builder_implements:context.ConfigRule_ACL) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConfigRule_ACLOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_ConfigRule_ACL_descriptor; @@ -60473,8 +60601,8 @@ public final class ContextOuterClass { } } - public interface ConfigRule_IP_LINKOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConfigRule_IP_LINK) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.ConfigRule_IP_LINK) + ConfigRule_IP_LINKOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.EndPointId endpoint_id = 1; @@ -60514,8 +60642,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ConfigRule_IP_LINK} */ - public static final class ConfigRule_IP_LINK extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConfigRule_IP_LINK) - ConfigRule_IP_LINKOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.ConfigRule_IP_LINK) + ConfigRule_IP_LINK extends // @@protoc_insertion_point(message_implements:context.ConfigRule_IP_LINK) + com.google.protobuf.GeneratedMessageV3 implements ConfigRule_IP_LINKOrBuilder { private static final long serialVersionUID = 0L; @@ -60764,8 +60893,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ConfigRule_IP_LINK} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConfigRule_IP_LINK) - context.ContextOuterClass.ConfigRule_IP_LINKOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.ConfigRule_IP_LINK) + Builder extends // @@protoc_insertion_point(builder_implements:context.ConfigRule_IP_LINK) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConfigRule_IP_LINKOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_ConfigRule_IP_LINK_descriptor; @@ -61211,8 +61341,8 @@ public final class ContextOuterClass { } } - public interface ConfigRuleOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConfigRule) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.ConfigRule) + ConfigRuleOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.ConfigActionEnum action = 1; @@ -61283,8 +61413,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ConfigRule} */ - public static final class ConfigRule extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConfigRule) - ConfigRuleOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.ConfigRule) + ConfigRule extends // @@protoc_insertion_point(message_implements:context.ConfigRule) + com.google.protobuf.GeneratedMessageV3 implements ConfigRuleOrBuilder { private static final long serialVersionUID = 0L; @@ -61678,8 +61809,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ConfigRule} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConfigRule) - context.ContextOuterClass.ConfigRuleOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.ConfigRule) + Builder extends // @@protoc_insertion_point(builder_implements:context.ConfigRule) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConfigRuleOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_ConfigRule_descriptor; @@ -62432,8 +62564,8 @@ public final class ContextOuterClass { } } - public interface Constraint_CustomOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_Custom) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.Constraint_Custom) + Constraint_CustomOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * string constraint_type = 1; @@ -62463,8 +62595,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Constraint_Custom} */ - public static final class Constraint_Custom extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_Custom) - Constraint_CustomOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.Constraint_Custom) + Constraint_Custom extends // @@protoc_insertion_point(message_implements:context.Constraint_Custom) + com.google.protobuf.GeneratedMessageV3 implements Constraint_CustomOrBuilder { private static final long serialVersionUID = 0L; @@ -62719,8 +62852,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Constraint_Custom} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_Custom) - context.ContextOuterClass.Constraint_CustomOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_Custom) + Builder extends // @@protoc_insertion_point(builder_implements:context.Constraint_Custom) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_CustomOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_Constraint_Custom_descriptor; @@ -63076,8 +63210,8 @@ public final class ContextOuterClass { } } - public interface Constraint_ScheduleOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_Schedule) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.Constraint_Schedule) + Constraint_ScheduleOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * double start_timestamp = 1; @@ -63095,8 +63229,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Constraint_Schedule} */ - public static final class Constraint_Schedule extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_Schedule) - Constraint_ScheduleOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.Constraint_Schedule) + Constraint_Schedule extends // @@protoc_insertion_point(message_implements:context.Constraint_Schedule) + com.google.protobuf.GeneratedMessageV3 implements Constraint_ScheduleOrBuilder { private static final long serialVersionUID = 0L; @@ -63299,8 +63434,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Constraint_Schedule} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_Schedule) - context.ContextOuterClass.Constraint_ScheduleOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_Schedule) + Builder extends // @@protoc_insertion_point(builder_implements:context.Constraint_Schedule) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_ScheduleOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_Constraint_Schedule_descriptor; @@ -63570,8 +63706,8 @@ public final class ContextOuterClass { } } - public interface GPS_PositionOrBuilder extends // @@protoc_insertion_point(interface_extends:context.GPS_Position) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.GPS_Position) + GPS_PositionOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * float latitude = 1; @@ -63589,8 +63725,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.GPS_Position} */ - public static final class GPS_Position extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.GPS_Position) - GPS_PositionOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.GPS_Position) + GPS_Position extends // @@protoc_insertion_point(message_implements:context.GPS_Position) + com.google.protobuf.GeneratedMessageV3 implements GPS_PositionOrBuilder { private static final long serialVersionUID = 0L; @@ -63793,8 +63930,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.GPS_Position} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.GPS_Position) - context.ContextOuterClass.GPS_PositionOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.GPS_Position) + Builder extends // @@protoc_insertion_point(builder_implements:context.GPS_Position) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.GPS_PositionOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_GPS_Position_descriptor; @@ -64064,8 +64202,8 @@ public final class ContextOuterClass { } } - public interface LocationOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Location) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.Location) + LocationOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * string region = 1; @@ -64144,8 +64282,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Location} */ - public static final class Location extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Location) - LocationOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.Location) + Location extends // @@protoc_insertion_point(message_implements:context.Location) + com.google.protobuf.GeneratedMessageV3 implements LocationOrBuilder { private static final long serialVersionUID = 0L; @@ -64606,8 +64745,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Location} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Location) - context.ContextOuterClass.LocationOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.Location) + Builder extends // @@protoc_insertion_point(builder_implements:context.Location) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.LocationOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_Location_descriptor; @@ -65302,8 +65442,8 @@ public final class ContextOuterClass { } } - public interface Constraint_EndPointLocationOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_EndPointLocation) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.Constraint_EndPointLocation) + Constraint_EndPointLocationOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.EndPointId endpoint_id = 1; @@ -65343,8 +65483,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Constraint_EndPointLocation} */ - public static final class Constraint_EndPointLocation extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_EndPointLocation) - Constraint_EndPointLocationOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.Constraint_EndPointLocation) + Constraint_EndPointLocation extends // @@protoc_insertion_point(message_implements:context.Constraint_EndPointLocation) + com.google.protobuf.GeneratedMessageV3 implements Constraint_EndPointLocationOrBuilder { private static final long serialVersionUID = 0L; @@ -65593,8 +65734,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Constraint_EndPointLocation} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_EndPointLocation) - context.ContextOuterClass.Constraint_EndPointLocationOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_EndPointLocation) + Builder extends // @@protoc_insertion_point(builder_implements:context.Constraint_EndPointLocation) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_EndPointLocationOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_Constraint_EndPointLocation_descriptor; @@ -66040,8 +66182,8 @@ public final class ContextOuterClass { } } - public interface Constraint_EndPointPriorityOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_EndPointPriority) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.Constraint_EndPointPriority) + Constraint_EndPointPriorityOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.EndPointId endpoint_id = 1; @@ -66070,8 +66212,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Constraint_EndPointPriority} */ - public static final class Constraint_EndPointPriority extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_EndPointPriority) - Constraint_EndPointPriorityOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.Constraint_EndPointPriority) + Constraint_EndPointPriority extends // @@protoc_insertion_point(message_implements:context.Constraint_EndPointPriority) + com.google.protobuf.GeneratedMessageV3 implements Constraint_EndPointPriorityOrBuilder { private static final long serialVersionUID = 0L; @@ -66297,8 +66440,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Constraint_EndPointPriority} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_EndPointPriority) - context.ContextOuterClass.Constraint_EndPointPriorityOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_EndPointPriority) + Builder extends // @@protoc_insertion_point(builder_implements:context.Constraint_EndPointPriority) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_EndPointPriorityOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_Constraint_EndPointPriority_descriptor; @@ -66656,8 +66800,8 @@ public final class ContextOuterClass { } } - public interface Constraint_SLA_LatencyOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Latency) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Latency) + Constraint_SLA_LatencyOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * float e2e_latency_ms = 1; @@ -66669,8 +66813,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Constraint_SLA_Latency} */ - public static final class Constraint_SLA_Latency extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Latency) - Constraint_SLA_LatencyOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Latency) + Constraint_SLA_Latency extends // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Latency) + com.google.protobuf.GeneratedMessageV3 implements Constraint_SLA_LatencyOrBuilder { private static final long serialVersionUID = 0L; @@ -66850,8 +66995,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Constraint_SLA_Latency} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Latency) - context.ContextOuterClass.Constraint_SLA_LatencyOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Latency) + Builder extends // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Latency) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_SLA_LatencyOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_Constraint_SLA_Latency_descriptor; @@ -67073,8 +67219,8 @@ public final class ContextOuterClass { } } - public interface Constraint_SLA_CapacityOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Capacity) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Capacity) + Constraint_SLA_CapacityOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * float capacity_gbps = 1; @@ -67086,8 +67232,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Constraint_SLA_Capacity} */ - public static final class Constraint_SLA_Capacity extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Capacity) - Constraint_SLA_CapacityOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Capacity) + Constraint_SLA_Capacity extends // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Capacity) + com.google.protobuf.GeneratedMessageV3 implements Constraint_SLA_CapacityOrBuilder { private static final long serialVersionUID = 0L; @@ -67267,8 +67414,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Constraint_SLA_Capacity} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Capacity) - context.ContextOuterClass.Constraint_SLA_CapacityOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Capacity) + Builder extends // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Capacity) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_SLA_CapacityOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_Constraint_SLA_Capacity_descriptor; @@ -67490,8 +67638,8 @@ public final class ContextOuterClass { } } - public interface Constraint_SLA_AvailabilityOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Availability) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Availability) + Constraint_SLA_AvailabilityOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * uint32 num_disjoint_paths = 1; @@ -67519,8 +67667,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Constraint_SLA_Availability} */ - public static final class Constraint_SLA_Availability extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Availability) - Constraint_SLA_AvailabilityOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Availability) + Constraint_SLA_Availability extends // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Availability) + com.google.protobuf.GeneratedMessageV3 implements Constraint_SLA_AvailabilityOrBuilder { private static final long serialVersionUID = 0L; @@ -67750,8 +67899,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Constraint_SLA_Availability} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Availability) - context.ContextOuterClass.Constraint_SLA_AvailabilityOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Availability) + Builder extends // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Availability) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_SLA_AvailabilityOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_Constraint_SLA_Availability_descriptor; @@ -68081,8 +68231,8 @@ public final class ContextOuterClass { } } - public interface Constraint_SLA_Isolation_levelOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Isolation_level) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Isolation_level) + Constraint_SLA_Isolation_levelOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * repeated .context.IsolationLevelEnum isolation_level = 1; @@ -68120,8 +68270,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Constraint_SLA_Isolation_level} */ - public static final class Constraint_SLA_Isolation_level extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Isolation_level) - Constraint_SLA_Isolation_levelOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Isolation_level) + Constraint_SLA_Isolation_level extends // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Isolation_level) + com.google.protobuf.GeneratedMessageV3 implements Constraint_SLA_Isolation_levelOrBuilder { private static final long serialVersionUID = 0L; @@ -68367,8 +68518,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Constraint_SLA_Isolation_level} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Isolation_level) - context.ContextOuterClass.Constraint_SLA_Isolation_levelOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Isolation_level) + Builder extends // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Isolation_level) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_SLA_Isolation_levelOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_Constraint_SLA_Isolation_level_descriptor; @@ -68730,8 +68882,8 @@ public final class ContextOuterClass { } } - public interface Constraint_ExclusionsOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_Exclusions) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.Constraint_Exclusions) + Constraint_ExclusionsOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * bool is_permanent = 1; @@ -68818,8 +68970,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Constraint_Exclusions} */ - public static final class Constraint_Exclusions extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_Exclusions) - Constraint_ExclusionsOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.Constraint_Exclusions) + Constraint_Exclusions extends // @@protoc_insertion_point(message_implements:context.Constraint_Exclusions) + com.google.protobuf.GeneratedMessageV3 implements Constraint_ExclusionsOrBuilder { private static final long serialVersionUID = 0L; @@ -69173,8 +69326,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Constraint_Exclusions} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_Exclusions) - context.ContextOuterClass.Constraint_ExclusionsOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_Exclusions) + Builder extends // @@protoc_insertion_point(builder_implements:context.Constraint_Exclusions) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_ExclusionsOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_Constraint_Exclusions_descriptor; @@ -70267,8 +70421,8 @@ public final class ContextOuterClass { } } - public interface QoSProfileIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.QoSProfileId) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.QoSProfileId) + QoSProfileIdOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.Uuid qos_profile_id = 1; @@ -70291,8 +70445,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.QoSProfileId} */ - public static final class QoSProfileId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.QoSProfileId) - QoSProfileIdOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.QoSProfileId) + QoSProfileId extends // @@protoc_insertion_point(message_implements:context.QoSProfileId) + com.google.protobuf.GeneratedMessageV3 implements QoSProfileIdOrBuilder { private static final long serialVersionUID = 0L; @@ -70495,8 +70650,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.QoSProfileId} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.QoSProfileId) - context.ContextOuterClass.QoSProfileIdOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.QoSProfileId) + Builder extends // @@protoc_insertion_point(builder_implements:context.QoSProfileId) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.QoSProfileIdOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_QoSProfileId_descriptor; @@ -70806,8 +70962,8 @@ public final class ContextOuterClass { } } - public interface Constraint_QoSProfileOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_QoSProfile) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.Constraint_QoSProfile) + Constraint_QoSProfileOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.QoSProfileId qos_profile_id = 1; @@ -70842,8 +70998,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Constraint_QoSProfile} */ - public static final class Constraint_QoSProfile extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_QoSProfile) - Constraint_QoSProfileOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.Constraint_QoSProfile) + Constraint_QoSProfile extends // @@protoc_insertion_point(message_implements:context.Constraint_QoSProfile) + com.google.protobuf.GeneratedMessageV3 implements Constraint_QoSProfileOrBuilder { private static final long serialVersionUID = 0L; @@ -71095,8 +71252,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Constraint_QoSProfile} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_QoSProfile) - context.ContextOuterClass.Constraint_QoSProfileOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_QoSProfile) + Builder extends // @@protoc_insertion_point(builder_implements:context.Constraint_QoSProfile) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_QoSProfileOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_Constraint_QoSProfile_descriptor; @@ -71497,8 +71655,8 @@ public final class ContextOuterClass { } } - public interface ConstraintOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.Constraint) + ConstraintOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.ConstraintActionEnum action = 1; @@ -71688,8 +71846,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Constraint} */ - public static final class Constraint extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint) - ConstraintOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.Constraint) + Constraint extends // @@protoc_insertion_point(message_implements:context.Constraint) + com.google.protobuf.GeneratedMessageV3 implements ConstraintOrBuilder { private static final long serialVersionUID = 0L; @@ -72443,8 +72602,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.Constraint} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint) - context.ContextOuterClass.ConstraintOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.Constraint) + Builder extends // @@protoc_insertion_point(builder_implements:context.Constraint) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConstraintOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_Constraint_descriptor; @@ -74310,8 +74470,8 @@ public final class ContextOuterClass { } } - public interface TeraFlowControllerOrBuilder extends // @@protoc_insertion_point(interface_extends:context.TeraFlowController) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.TeraFlowController) + TeraFlowControllerOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.ContextId context_id = 1; @@ -74356,8 +74516,9 @@ public final class ContextOuterClass { * * Protobuf type {@code context.TeraFlowController} */ - public static final class TeraFlowController extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.TeraFlowController) - TeraFlowControllerOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.TeraFlowController) + TeraFlowController extends // @@protoc_insertion_point(message_implements:context.TeraFlowController) + com.google.protobuf.GeneratedMessageV3 implements TeraFlowControllerOrBuilder { private static final long serialVersionUID = 0L; @@ -74636,8 +74797,9 @@ public final class ContextOuterClass { * * Protobuf type {@code context.TeraFlowController} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.TeraFlowController) - context.ContextOuterClass.TeraFlowControllerOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.TeraFlowController) + Builder extends // @@protoc_insertion_point(builder_implements:context.TeraFlowController) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.TeraFlowControllerOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_TeraFlowController_descriptor; @@ -75086,8 +75248,8 @@ public final class ContextOuterClass { } } - public interface AuthenticationResultOrBuilder extends // @@protoc_insertion_point(interface_extends:context.AuthenticationResult) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.AuthenticationResult) + AuthenticationResultOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.ContextId context_id = 1; @@ -75116,8 +75278,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.AuthenticationResult} */ - public static final class AuthenticationResult extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.AuthenticationResult) - AuthenticationResultOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.AuthenticationResult) + AuthenticationResult extends // @@protoc_insertion_point(message_implements:context.AuthenticationResult) + com.google.protobuf.GeneratedMessageV3 implements AuthenticationResultOrBuilder { private static final long serialVersionUID = 0L; @@ -75343,8 +75506,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.AuthenticationResult} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.AuthenticationResult) - context.ContextOuterClass.AuthenticationResultOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.AuthenticationResult) + Builder extends // @@protoc_insertion_point(builder_implements:context.AuthenticationResult) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.AuthenticationResultOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_AuthenticationResult_descriptor; @@ -75702,8 +75866,8 @@ public final class ContextOuterClass { } } - public interface OpticalConfigIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalConfigId) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.OpticalConfigId) + OpticalConfigIdOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * string opticalconfig_uuid = 1; @@ -75725,8 +75889,9 @@ public final class ContextOuterClass { * * Protobuf type {@code context.OpticalConfigId} */ - public static final class OpticalConfigId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalConfigId) - OpticalConfigIdOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.OpticalConfigId) + OpticalConfigId extends // @@protoc_insertion_point(message_implements:context.OpticalConfigId) + com.google.protobuf.GeneratedMessageV3 implements OpticalConfigIdOrBuilder { private static final long serialVersionUID = 0L; @@ -75936,8 +76101,9 @@ public final class ContextOuterClass { * * 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 { + public static final class // @@protoc_insertion_point(builder_implements:context.OpticalConfigId) + Builder extends // @@protoc_insertion_point(builder_implements:context.OpticalConfigId) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalConfigIdOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_OpticalConfigId_descriptor; @@ -76202,8 +76368,8 @@ public final class ContextOuterClass { } } - public interface OpticalConfigOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalConfig) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.OpticalConfig) + OpticalConfigOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.OpticalConfigId opticalconfig_id = 1; @@ -76255,8 +76421,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.OpticalConfig} */ - public static final class OpticalConfig extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalConfig) - OpticalConfigOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.OpticalConfig) + OpticalConfig extends // @@protoc_insertion_point(message_implements:context.OpticalConfig) + com.google.protobuf.GeneratedMessageV3 implements OpticalConfigOrBuilder { private static final long serialVersionUID = 0L; @@ -76554,8 +76721,9 @@ public final class ContextOuterClass { /** * 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 class // @@protoc_insertion_point(builder_implements:context.OpticalConfig) + Builder extends // @@protoc_insertion_point(builder_implements:context.OpticalConfig) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalConfigOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_OpticalConfig_descriptor; @@ -77092,8 +77260,8 @@ public final class ContextOuterClass { } } - public interface OpticalConfigListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalConfigList) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.OpticalConfigList) + OpticalConfigListOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * repeated .context.OpticalConfig opticalconfigs = 1; @@ -77124,8 +77292,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.OpticalConfigList} */ - public static final class OpticalConfigList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalConfigList) - OpticalConfigListOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.OpticalConfigList) + OpticalConfigList extends // @@protoc_insertion_point(message_implements:context.OpticalConfigList) + com.google.protobuf.GeneratedMessageV3 implements OpticalConfigListOrBuilder { private static final long serialVersionUID = 0L; @@ -77340,8 +77509,9 @@ public final class ContextOuterClass { /** * 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 class // @@protoc_insertion_point(builder_implements:context.OpticalConfigList) + Builder extends // @@protoc_insertion_point(builder_implements:context.OpticalConfigList) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalConfigListOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_OpticalConfigList_descriptor; @@ -77808,8 +77978,8 @@ public final class ContextOuterClass { } } - public interface OpticalConfigEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalConfigEvent) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.OpticalConfigEvent) + OpticalConfigEventOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.Event event = 1; @@ -77849,8 +78019,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.OpticalConfigEvent} */ - public static final class OpticalConfigEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalConfigEvent) - OpticalConfigEventOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.OpticalConfigEvent) + OpticalConfigEvent extends // @@protoc_insertion_point(message_implements:context.OpticalConfigEvent) + com.google.protobuf.GeneratedMessageV3 implements OpticalConfigEventOrBuilder { private static final long serialVersionUID = 0L; @@ -78099,8 +78270,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.OpticalConfigEvent} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalConfigEvent) - context.ContextOuterClass.OpticalConfigEventOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.OpticalConfigEvent) + Builder extends // @@protoc_insertion_point(builder_implements:context.OpticalConfigEvent) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalConfigEventOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_OpticalConfigEvent_descriptor; @@ -78546,8 +78718,8 @@ public final class ContextOuterClass { } } - public interface OpticalEndPointIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalEndPointId) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.OpticalEndPointId) + OpticalEndPointIdOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.DeviceId device_id = 2; @@ -78587,8 +78759,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.OpticalEndPointId} */ - public static final class OpticalEndPointId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalEndPointId) - OpticalEndPointIdOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.OpticalEndPointId) + OpticalEndPointId extends // @@protoc_insertion_point(message_implements:context.OpticalEndPointId) + com.google.protobuf.GeneratedMessageV3 implements OpticalEndPointIdOrBuilder { private static final long serialVersionUID = 0L; @@ -78837,8 +79010,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.OpticalEndPointId} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalEndPointId) - context.ContextOuterClass.OpticalEndPointIdOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.OpticalEndPointId) + Builder extends // @@protoc_insertion_point(builder_implements:context.OpticalEndPointId) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalEndPointIdOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_OpticalEndPointId_descriptor; @@ -79284,8 +79458,8 @@ public final class ContextOuterClass { } } - public interface OpticalLinkListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalLinkList) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.OpticalLinkList) + OpticalLinkListOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * repeated .context.OpticalLink optical_links = 1; @@ -79316,8 +79490,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.OpticalLinkList} */ - public static final class OpticalLinkList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalLinkList) - OpticalLinkListOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.OpticalLinkList) + OpticalLinkList extends // @@protoc_insertion_point(message_implements:context.OpticalLinkList) + com.google.protobuf.GeneratedMessageV3 implements OpticalLinkListOrBuilder { private static final long serialVersionUID = 0L; @@ -79532,8 +79707,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.OpticalLinkList} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalLinkList) - context.ContextOuterClass.OpticalLinkListOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.OpticalLinkList) + Builder extends // @@protoc_insertion_point(builder_implements:context.OpticalLinkList) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalLinkListOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_OpticalLinkList_descriptor; @@ -80000,8 +80176,8 @@ public final class ContextOuterClass { } } - public interface OpticalLinkDetailsOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalLinkDetails) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.OpticalLinkDetails) + OpticalLinkDetailsOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * float length = 1; @@ -80160,8 +80336,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.OpticalLinkDetails} */ - public static final class OpticalLinkDetails extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalLinkDetails) - OpticalLinkDetailsOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.OpticalLinkDetails) + OpticalLinkDetails extends // @@protoc_insertion_point(message_implements:context.OpticalLinkDetails) + com.google.protobuf.GeneratedMessageV3 implements OpticalLinkDetailsOrBuilder { private static final long serialVersionUID = 0L; @@ -80836,8 +81013,9 @@ public final class ContextOuterClass { /** * 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 class // @@protoc_insertion_point(builder_implements:context.OpticalLinkDetails) + Builder extends // @@protoc_insertion_point(builder_implements:context.OpticalLinkDetails) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalLinkDetailsOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_OpticalLinkDetails_descriptor; @@ -81925,8 +82103,8 @@ public final class ContextOuterClass { } } - public interface OpticalLinkOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalLink) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.OpticalLink) + OpticalLinkOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * string name = 1; @@ -82003,8 +82181,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.OpticalLink} */ - public static final class OpticalLink extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalLink) - OpticalLinkOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.OpticalLink) + OpticalLink extends // @@protoc_insertion_point(message_implements:context.OpticalLink) + com.google.protobuf.GeneratedMessageV3 implements OpticalLinkOrBuilder { private static final long serialVersionUID = 0L; @@ -82360,8 +82539,9 @@ public final class ContextOuterClass { /** * 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 class // @@protoc_insertion_point(builder_implements:context.OpticalLink) + Builder extends // @@protoc_insertion_point(builder_implements:context.OpticalLink) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalLinkOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_OpticalLink_descriptor; @@ -83191,8 +83371,8 @@ public final class ContextOuterClass { } } - public interface ChannelIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ChannelId) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.ChannelId) + ChannelIdOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.Uuid channel_uuid = 1; @@ -83215,8 +83395,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ChannelId} */ - public static final class ChannelId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ChannelId) - ChannelIdOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.ChannelId) + ChannelId extends // @@protoc_insertion_point(message_implements:context.ChannelId) + com.google.protobuf.GeneratedMessageV3 implements ChannelIdOrBuilder { private static final long serialVersionUID = 0L; @@ -83419,8 +83600,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ChannelId} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ChannelId) - context.ContextOuterClass.ChannelIdOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.ChannelId) + Builder extends // @@protoc_insertion_point(builder_implements:context.ChannelId) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ChannelIdOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_ChannelId_descriptor; @@ -83730,8 +83912,8 @@ public final class ContextOuterClass { } } - public interface OpticalBandIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalBandId) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.OpticalBandId) + OpticalBandIdOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.Uuid opticalband_uuid = 1; @@ -83754,8 +83936,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.OpticalBandId} */ - public static final class OpticalBandId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalBandId) - OpticalBandIdOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.OpticalBandId) + OpticalBandId extends // @@protoc_insertion_point(message_implements:context.OpticalBandId) + com.google.protobuf.GeneratedMessageV3 implements OpticalBandIdOrBuilder { private static final long serialVersionUID = 0L; @@ -83958,8 +84141,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.OpticalBandId} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalBandId) - context.ContextOuterClass.OpticalBandIdOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.OpticalBandId) + Builder extends // @@protoc_insertion_point(builder_implements:context.OpticalBandId) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalBandIdOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_OpticalBandId_descriptor; @@ -84269,8 +84453,8 @@ public final class ContextOuterClass { } } - public interface OpticalBandOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalBand) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.OpticalBand) + OpticalBandOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.OpticalBandId opticalband_id = 1; @@ -84398,8 +84582,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.OpticalBand} */ - public static final class OpticalBand extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalBand) - OpticalBandOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.OpticalBand) + OpticalBand extends // @@protoc_insertion_point(message_implements:context.OpticalBand) + com.google.protobuf.GeneratedMessageV3 implements OpticalBandOrBuilder { private static final long serialVersionUID = 0L; @@ -84960,8 +85145,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.OpticalBand} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalBand) - context.ContextOuterClass.OpticalBandOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.OpticalBand) + Builder extends // @@protoc_insertion_point(builder_implements:context.OpticalBand) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalBandOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_OpticalBand_descriptor; @@ -86137,8 +86323,8 @@ public final class ContextOuterClass { } } - public interface OpticalBandListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalBandList) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.OpticalBandList) + OpticalBandListOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * repeated .context.OpticalBand opticalbands = 1; @@ -86169,8 +86355,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.OpticalBandList} */ - public static final class OpticalBandList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalBandList) - OpticalBandListOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.OpticalBandList) + OpticalBandList extends // @@protoc_insertion_point(message_implements:context.OpticalBandList) + com.google.protobuf.GeneratedMessageV3 implements OpticalBandListOrBuilder { private static final long serialVersionUID = 0L; @@ -86385,8 +86572,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.OpticalBandList} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalBandList) - context.ContextOuterClass.OpticalBandListOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.OpticalBandList) + Builder extends // @@protoc_insertion_point(builder_implements:context.OpticalBandList) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalBandListOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_OpticalBandList_descriptor; @@ -86853,8 +87041,8 @@ public final class ContextOuterClass { } } - public interface ServiceConfigRuleOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ServiceConfigRule) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:context.ServiceConfigRule) + ServiceConfigRuleOrBuilder extends com.google.protobuf.MessageOrBuilder { /** * .context.ServiceId service_id = 1; @@ -86894,8 +87082,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ServiceConfigRule} */ - public static final class ServiceConfigRule extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ServiceConfigRule) - ServiceConfigRuleOrBuilder { + public static final class // @@protoc_insertion_point(message_implements:context.ServiceConfigRule) + ServiceConfigRule extends // @@protoc_insertion_point(message_implements:context.ServiceConfigRule) + com.google.protobuf.GeneratedMessageV3 implements ServiceConfigRuleOrBuilder { private static final long serialVersionUID = 0L; @@ -87144,8 +87333,9 @@ public final class ContextOuterClass { /** * Protobuf type {@code context.ServiceConfigRule} */ - public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ServiceConfigRule) - context.ContextOuterClass.ServiceConfigRuleOrBuilder { + public static final class // @@protoc_insertion_point(builder_implements:context.ServiceConfigRule) + Builder extends // @@protoc_insertion_point(builder_implements:context.ServiceConfigRule) + com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceConfigRuleOrBuilder { public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { return context.ContextOuterClass.internal_static_context_ServiceConfigRule_descriptor; diff --git a/src/policy/target/generated-sources/grpc/device/Device.java b/src/policy/target/generated-sources/grpc/device/Device.java index 87c434732..51f0b742d 100644 --- a/src/policy/target/generated-sources/grpc/device/Device.java +++ b/src/policy/target/generated-sources/grpc/device/Device.java @@ -14,8 +14,8 @@ public final class Device { registerAllExtensions((com.google.protobuf.ExtensionRegistryLite) registry); } - public interface MonitoringSettingsOrBuilder extends // @@protoc_insertion_point(interface_extends:device.MonitoringSettings) - com.google.protobuf.MessageOrBuilder { + public interface // @@protoc_insertion_point(interface_extends:device.MonitoringSettings) + MonitoringSettingsOrBuilder extends com.google.protobuf.MessageOrBuilder { /** *
@@ -91,8 +91,9 @@ public final class Device {
     /**
      * Protobuf type {@code device.MonitoringSettings}
      */
-    public static final class MonitoringSettings extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:device.MonitoringSettings)
-    MonitoringSettingsOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:device.MonitoringSettings)
+    MonitoringSettings extends // @@protoc_insertion_point(message_implements:device.MonitoringSettings)
+    com.google.protobuf.GeneratedMessageV3 implements MonitoringSettingsOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -411,8 +412,9 @@ public final class Device {
         /**
          * Protobuf type {@code device.MonitoringSettings}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:device.MonitoringSettings)
-        device.Device.MonitoringSettingsOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:device.MonitoringSettings)
+        Builder extends // @@protoc_insertion_point(builder_implements:device.MonitoringSettings)
+        com.google.protobuf.GeneratedMessageV3.Builder implements device.Device.MonitoringSettingsOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return device.Device.internal_static_device_MonitoringSettings_descriptor;
diff --git a/src/policy/target/generated-sources/grpc/ip_link/IpLink.java b/src/policy/target/generated-sources/grpc/ip_link/IpLink.java
index 865a27401..f8ed44bf2 100644
--- a/src/policy/target/generated-sources/grpc/ip_link/IpLink.java
+++ b/src/policy/target/generated-sources/grpc/ip_link/IpLink.java
@@ -14,8 +14,8 @@ public final class IpLink {
         registerAllExtensions((com.google.protobuf.ExtensionRegistryLite) registry);
     }
 
-    public interface IpLinkRuleSetOrBuilder extends // @@protoc_insertion_point(interface_extends:ip_link.IpLinkRuleSet)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:ip_link.IpLinkRuleSet)
+    IpLinkRuleSetOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * string ip = 1;
@@ -57,8 +57,9 @@ public final class IpLink {
     /**
      * Protobuf type {@code ip_link.IpLinkRuleSet}
      */
-    public static final class IpLinkRuleSet extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:ip_link.IpLinkRuleSet)
-    IpLinkRuleSetOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:ip_link.IpLinkRuleSet)
+    IpLinkRuleSet extends // @@protoc_insertion_point(message_implements:ip_link.IpLinkRuleSet)
+    com.google.protobuf.GeneratedMessageV3 implements IpLinkRuleSetOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -362,8 +363,9 @@ public final class IpLink {
         /**
          * Protobuf type {@code ip_link.IpLinkRuleSet}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:ip_link.IpLinkRuleSet)
-        ip_link.IpLink.IpLinkRuleSetOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:ip_link.IpLinkRuleSet)
+        Builder extends // @@protoc_insertion_point(builder_implements:ip_link.IpLinkRuleSet)
+        com.google.protobuf.GeneratedMessageV3.Builder implements ip_link.IpLink.IpLinkRuleSetOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return ip_link.IpLink.internal_static_ip_link_IpLinkRuleSet_descriptor;
diff --git a/src/policy/target/generated-sources/grpc/monitoring/Monitoring.java b/src/policy/target/generated-sources/grpc/monitoring/Monitoring.java
index 8394fe275..ed1f1a40e 100644
--- a/src/policy/target/generated-sources/grpc/monitoring/Monitoring.java
+++ b/src/policy/target/generated-sources/grpc/monitoring/Monitoring.java
@@ -14,8 +14,8 @@ public final class Monitoring {
         registerAllExtensions((com.google.protobuf.ExtensionRegistryLite) registry);
     }
 
-    public interface KpiDescriptorOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.KpiDescriptor)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.KpiDescriptor)
+    KpiDescriptorOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.KpiId kpi_id = 1;
@@ -189,8 +189,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.KpiDescriptor}
      */
-    public static final class KpiDescriptor extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.KpiDescriptor)
-    KpiDescriptorOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.KpiDescriptor)
+    KpiDescriptor extends // @@protoc_insertion_point(message_implements:monitoring.KpiDescriptor)
+    com.google.protobuf.GeneratedMessageV3 implements KpiDescriptorOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -810,8 +811,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.KpiDescriptor}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.KpiDescriptor)
-        monitoring.Monitoring.KpiDescriptorOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.KpiDescriptor)
+        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.KpiDescriptor)
+        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.KpiDescriptorOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_KpiDescriptor_descriptor;
@@ -2394,8 +2396,8 @@ public final class Monitoring {
         }
     }
 
-    public interface MonitorKpiRequestOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.MonitorKpiRequest)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.MonitorKpiRequest)
+    MonitorKpiRequestOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.KpiId kpi_id = 1;
@@ -2434,8 +2436,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.MonitorKpiRequest}
      */
-    public static final class MonitorKpiRequest extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.MonitorKpiRequest)
-    MonitorKpiRequestOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.MonitorKpiRequest)
+    MonitorKpiRequest extends // @@protoc_insertion_point(message_implements:monitoring.MonitorKpiRequest)
+    com.google.protobuf.GeneratedMessageV3 implements MonitorKpiRequestOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -2688,8 +2691,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.MonitorKpiRequest}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.MonitorKpiRequest)
-        monitoring.Monitoring.MonitorKpiRequestOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.MonitorKpiRequest)
+        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.MonitorKpiRequest)
+        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.MonitorKpiRequestOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_MonitorKpiRequest_descriptor;
@@ -3107,8 +3111,8 @@ public final class Monitoring {
         }
     }
 
-    public interface KpiQueryOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.KpiQuery)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.KpiQuery)
+    KpiQueryOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .monitoring.KpiId kpi_ids = 1;
@@ -3213,8 +3217,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.KpiQuery}
      */
-    public static final class KpiQuery extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.KpiQuery)
-    KpiQueryOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.KpiQuery)
+    KpiQuery extends // @@protoc_insertion_point(message_implements:monitoring.KpiQuery)
+    com.google.protobuf.GeneratedMessageV3 implements KpiQueryOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -3595,8 +3600,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.KpiQuery}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.KpiQuery)
-        monitoring.Monitoring.KpiQueryOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.KpiQuery)
+        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.KpiQuery)
+        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.KpiQueryOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_KpiQuery_descriptor;
@@ -4515,8 +4521,8 @@ public final class Monitoring {
         }
     }
 
-    public interface RawKpiOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.RawKpi)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.RawKpi)
+    RawKpiOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Timestamp timestamp = 1;
@@ -4560,8 +4566,9 @@ public final class Monitoring {
      *
      * Protobuf type {@code monitoring.RawKpi}
      */
-    public static final class RawKpi extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.RawKpi)
-    RawKpiOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.RawKpi)
+    RawKpi extends // @@protoc_insertion_point(message_implements:monitoring.RawKpi)
+    com.google.protobuf.GeneratedMessageV3 implements RawKpiOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -4814,8 +4821,9 @@ public final class Monitoring {
          *
          * Protobuf type {@code monitoring.RawKpi}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.RawKpi)
-        monitoring.Monitoring.RawKpiOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.RawKpi)
+        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.RawKpi)
+        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.RawKpiOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_RawKpi_descriptor;
@@ -5261,8 +5269,8 @@ public final class Monitoring {
         }
     }
 
-    public interface RawKpiListOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.RawKpiList)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.RawKpiList)
+    RawKpiListOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.KpiId kpi_id = 1;
@@ -5314,8 +5322,9 @@ public final class Monitoring {
      *
      * Protobuf type {@code monitoring.RawKpiList}
      */
-    public static final class RawKpiList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.RawKpiList)
-    RawKpiListOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.RawKpiList)
+    RawKpiList extends // @@protoc_insertion_point(message_implements:monitoring.RawKpiList)
+    com.google.protobuf.GeneratedMessageV3 implements RawKpiListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -5580,8 +5589,9 @@ public final class Monitoring {
          *
          * Protobuf type {@code monitoring.RawKpiList}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.RawKpiList)
-        monitoring.Monitoring.RawKpiListOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.RawKpiList)
+        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.RawKpiList)
+        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.RawKpiListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_RawKpiList_descriptor;
@@ -6184,8 +6194,8 @@ public final class Monitoring {
         }
     }
 
-    public interface RawKpiTableOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.RawKpiTable)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.RawKpiTable)
+    RawKpiTableOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .monitoring.RawKpiList raw_kpi_lists = 1;
@@ -6220,8 +6230,9 @@ public final class Monitoring {
      *
      * Protobuf type {@code monitoring.RawKpiTable}
      */
-    public static final class RawKpiTable extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.RawKpiTable)
-    RawKpiTableOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.RawKpiTable)
+    RawKpiTable extends // @@protoc_insertion_point(message_implements:monitoring.RawKpiTable)
+    com.google.protobuf.GeneratedMessageV3 implements RawKpiTableOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -6440,8 +6451,9 @@ public final class Monitoring {
          *
          * Protobuf type {@code monitoring.RawKpiTable}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.RawKpiTable)
-        monitoring.Monitoring.RawKpiTableOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.RawKpiTable)
+        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.RawKpiTable)
+        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.RawKpiTableOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_RawKpiTable_descriptor;
@@ -6908,8 +6920,8 @@ public final class Monitoring {
         }
     }
 
-    public interface KpiIdOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.KpiId)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.KpiId)
+    KpiIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid kpi_id = 1;
@@ -6932,8 +6944,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.KpiId}
      */
-    public static final class KpiId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.KpiId)
-    KpiIdOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.KpiId)
+    KpiId extends // @@protoc_insertion_point(message_implements:monitoring.KpiId)
+    com.google.protobuf.GeneratedMessageV3 implements KpiIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -7136,8 +7149,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.KpiId}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.KpiId)
-        monitoring.Monitoring.KpiIdOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.KpiId)
+        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.KpiId)
+        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.KpiIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_KpiId_descriptor;
@@ -7447,8 +7461,8 @@ public final class Monitoring {
         }
     }
 
-    public interface KpiOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.Kpi)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.Kpi)
+    KpiOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.KpiId kpi_id = 1;
@@ -7505,8 +7519,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.Kpi}
      */
-    public static final class Kpi extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.Kpi)
-    KpiOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.Kpi)
+    Kpi extends // @@protoc_insertion_point(message_implements:monitoring.Kpi)
+    com.google.protobuf.GeneratedMessageV3 implements KpiOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -7801,8 +7816,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.Kpi}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.Kpi)
-        monitoring.Monitoring.KpiOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.Kpi)
+        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.Kpi)
+        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.KpiOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_Kpi_descriptor;
@@ -8384,8 +8400,8 @@ public final class Monitoring {
         }
     }
 
-    public interface KpiValueRangeOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.KpiValueRange)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.KpiValueRange)
+    KpiValueRangeOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.KpiValue kpiMinValue = 1;
@@ -8455,8 +8471,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.KpiValueRange}
      */
-    public static final class KpiValueRange extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.KpiValueRange)
-    KpiValueRangeOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.KpiValueRange)
+    KpiValueRange extends // @@protoc_insertion_point(message_implements:monitoring.KpiValueRange)
+    com.google.protobuf.GeneratedMessageV3 implements KpiValueRangeOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -8786,8 +8803,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.KpiValueRange}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.KpiValueRange)
-        monitoring.Monitoring.KpiValueRangeOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.KpiValueRange)
+        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.KpiValueRange)
+        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.KpiValueRangeOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_KpiValueRange_descriptor;
@@ -9413,8 +9431,8 @@ public final class Monitoring {
         }
     }
 
-    public interface KpiValueOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.KpiValue)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.KpiValue)
+    KpiValueOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * int32 int32Val = 1;
@@ -9512,8 +9530,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.KpiValue}
      */
-    public static final class KpiValue extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.KpiValue)
-    KpiValueOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.KpiValue)
+    KpiValue extends // @@protoc_insertion_point(message_implements:monitoring.KpiValue)
+    com.google.protobuf.GeneratedMessageV3 implements KpiValueOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -10031,8 +10050,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.KpiValue}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.KpiValue)
-        monitoring.Monitoring.KpiValueOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.KpiValue)
+        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.KpiValue)
+        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.KpiValueOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_KpiValue_descriptor;
@@ -10682,8 +10702,8 @@ public final class Monitoring {
         }
     }
 
-    public interface KpiListOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.KpiList)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.KpiList)
+    KpiListOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .monitoring.Kpi kpi = 1;
@@ -10714,8 +10734,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.KpiList}
      */
-    public static final class KpiList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.KpiList)
-    KpiListOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.KpiList)
+    KpiList extends // @@protoc_insertion_point(message_implements:monitoring.KpiList)
+    com.google.protobuf.GeneratedMessageV3 implements KpiListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -10930,8 +10951,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.KpiList}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.KpiList)
-        monitoring.Monitoring.KpiListOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.KpiList)
+        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.KpiList)
+        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.KpiListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_KpiList_descriptor;
@@ -11398,8 +11420,8 @@ public final class Monitoring {
         }
     }
 
-    public interface KpiDescriptorListOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.KpiDescriptorList)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.KpiDescriptorList)
+    KpiDescriptorListOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .monitoring.KpiDescriptor kpi_descriptor_list = 1;
@@ -11430,8 +11452,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.KpiDescriptorList}
      */
-    public static final class KpiDescriptorList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.KpiDescriptorList)
-    KpiDescriptorListOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.KpiDescriptorList)
+    KpiDescriptorList extends // @@protoc_insertion_point(message_implements:monitoring.KpiDescriptorList)
+    com.google.protobuf.GeneratedMessageV3 implements KpiDescriptorListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -11646,8 +11669,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.KpiDescriptorList}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.KpiDescriptorList)
-        monitoring.Monitoring.KpiDescriptorListOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.KpiDescriptorList)
+        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.KpiDescriptorList)
+        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.KpiDescriptorListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_KpiDescriptorList_descriptor;
@@ -12114,8 +12138,8 @@ public final class Monitoring {
         }
     }
 
-    public interface SubsDescriptorOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.SubsDescriptor)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.SubsDescriptor)
+    SubsDescriptorOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.SubscriptionID subs_id = 1;
@@ -12225,8 +12249,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.SubsDescriptor}
      */
-    public static final class SubsDescriptor extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.SubsDescriptor)
-    SubsDescriptorOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.SubsDescriptor)
+    SubsDescriptor extends // @@protoc_insertion_point(message_implements:monitoring.SubsDescriptor)
+    com.google.protobuf.GeneratedMessageV3 implements SubsDescriptorOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -12637,8 +12662,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.SubsDescriptor}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.SubsDescriptor)
-        monitoring.Monitoring.SubsDescriptorOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.SubsDescriptor)
+        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.SubsDescriptor)
+        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.SubsDescriptorOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_SubsDescriptor_descriptor;
@@ -13524,8 +13550,8 @@ public final class Monitoring {
         }
     }
 
-    public interface SubscriptionIDOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.SubscriptionID)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.SubscriptionID)
+    SubscriptionIDOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid subs_id = 1;
@@ -13548,8 +13574,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.SubscriptionID}
      */
-    public static final class SubscriptionID extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.SubscriptionID)
-    SubscriptionIDOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.SubscriptionID)
+    SubscriptionID extends // @@protoc_insertion_point(message_implements:monitoring.SubscriptionID)
+    com.google.protobuf.GeneratedMessageV3 implements SubscriptionIDOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -13752,8 +13779,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.SubscriptionID}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.SubscriptionID)
-        monitoring.Monitoring.SubscriptionIDOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.SubscriptionID)
+        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.SubscriptionID)
+        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.SubscriptionIDOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_SubscriptionID_descriptor;
@@ -14063,8 +14091,8 @@ public final class Monitoring {
         }
     }
 
-    public interface SubsResponseOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.SubsResponse)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.SubsResponse)
+    SubsResponseOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.SubscriptionID subs_id = 1;
@@ -14104,8 +14132,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.SubsResponse}
      */
-    public static final class SubsResponse extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.SubsResponse)
-    SubsResponseOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.SubsResponse)
+    SubsResponse extends // @@protoc_insertion_point(message_implements:monitoring.SubsResponse)
+    com.google.protobuf.GeneratedMessageV3 implements SubsResponseOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -14354,8 +14383,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.SubsResponse}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.SubsResponse)
-        monitoring.Monitoring.SubsResponseOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.SubsResponse)
+        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.SubsResponse)
+        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.SubsResponseOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_SubsResponse_descriptor;
@@ -14801,8 +14831,8 @@ public final class Monitoring {
         }
     }
 
-    public interface SubsListOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.SubsList)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.SubsList)
+    SubsListOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .monitoring.SubsDescriptor subs_descriptor = 1;
@@ -14833,8 +14863,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.SubsList}
      */
-    public static final class SubsList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.SubsList)
-    SubsListOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.SubsList)
+    SubsList extends // @@protoc_insertion_point(message_implements:monitoring.SubsList)
+    com.google.protobuf.GeneratedMessageV3 implements SubsListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -15049,8 +15080,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.SubsList}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.SubsList)
-        monitoring.Monitoring.SubsListOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.SubsList)
+        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.SubsList)
+        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.SubsListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_SubsList_descriptor;
@@ -15517,8 +15549,8 @@ public final class Monitoring {
         }
     }
 
-    public interface AlarmDescriptorOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.AlarmDescriptor)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.AlarmDescriptor)
+    AlarmDescriptorOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.AlarmID alarm_id = 1;
@@ -15616,8 +15648,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.AlarmDescriptor}
      */
-    public static final class AlarmDescriptor extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.AlarmDescriptor)
-    AlarmDescriptorOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.AlarmDescriptor)
+    AlarmDescriptor extends // @@protoc_insertion_point(message_implements:monitoring.AlarmDescriptor)
+    com.google.protobuf.GeneratedMessageV3 implements AlarmDescriptorOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -16056,8 +16089,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.AlarmDescriptor}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.AlarmDescriptor)
-        monitoring.Monitoring.AlarmDescriptorOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.AlarmDescriptor)
+        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.AlarmDescriptor)
+        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.AlarmDescriptorOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_AlarmDescriptor_descriptor;
@@ -16957,8 +16991,8 @@ public final class Monitoring {
         }
     }
 
-    public interface AlarmIDOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.AlarmID)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.AlarmID)
+    AlarmIDOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid alarm_id = 1;
@@ -16981,8 +17015,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.AlarmID}
      */
-    public static final class AlarmID extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.AlarmID)
-    AlarmIDOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.AlarmID)
+    AlarmID extends // @@protoc_insertion_point(message_implements:monitoring.AlarmID)
+    com.google.protobuf.GeneratedMessageV3 implements AlarmIDOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -17185,8 +17220,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.AlarmID}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.AlarmID)
-        monitoring.Monitoring.AlarmIDOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.AlarmID)
+        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.AlarmID)
+        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.AlarmIDOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_AlarmID_descriptor;
@@ -17496,8 +17532,8 @@ public final class Monitoring {
         }
     }
 
-    public interface AlarmSubscriptionOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.AlarmSubscription)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.AlarmSubscription)
+    AlarmSubscriptionOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.AlarmID alarm_id = 1;
@@ -17532,8 +17568,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.AlarmSubscription}
      */
-    public static final class AlarmSubscription extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.AlarmSubscription)
-    AlarmSubscriptionOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.AlarmSubscription)
+    AlarmSubscription extends // @@protoc_insertion_point(message_implements:monitoring.AlarmSubscription)
+    com.google.protobuf.GeneratedMessageV3 implements AlarmSubscriptionOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -17782,8 +17819,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.AlarmSubscription}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.AlarmSubscription)
-        monitoring.Monitoring.AlarmSubscriptionOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.AlarmSubscription)
+        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.AlarmSubscription)
+        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.AlarmSubscriptionOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_AlarmSubscription_descriptor;
@@ -18189,8 +18227,8 @@ public final class Monitoring {
         }
     }
 
-    public interface AlarmResponseOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.AlarmResponse)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.AlarmResponse)
+    AlarmResponseOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.AlarmID alarm_id = 1;
@@ -18242,8 +18280,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.AlarmResponse}
      */
-    public static final class AlarmResponse extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.AlarmResponse)
-    AlarmResponseOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.AlarmResponse)
+    AlarmResponse extends // @@protoc_insertion_point(message_implements:monitoring.AlarmResponse)
+    com.google.protobuf.GeneratedMessageV3 implements AlarmResponseOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -18541,8 +18580,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.AlarmResponse}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.AlarmResponse)
-        monitoring.Monitoring.AlarmResponseOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.AlarmResponse)
+        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.AlarmResponse)
+        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.AlarmResponseOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_AlarmResponse_descriptor;
@@ -19079,8 +19119,8 @@ public final class Monitoring {
         }
     }
 
-    public interface AlarmListOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.AlarmList)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.AlarmList)
+    AlarmListOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .monitoring.AlarmDescriptor alarm_descriptor = 1;
@@ -19111,8 +19151,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.AlarmList}
      */
-    public static final class AlarmList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.AlarmList)
-    AlarmListOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.AlarmList)
+    AlarmList extends // @@protoc_insertion_point(message_implements:monitoring.AlarmList)
+    com.google.protobuf.GeneratedMessageV3 implements AlarmListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -19327,8 +19368,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.AlarmList}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.AlarmList)
-        monitoring.Monitoring.AlarmListOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.AlarmList)
+        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.AlarmList)
+        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.AlarmListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_AlarmList_descriptor;
@@ -19795,8 +19837,8 @@ public final class Monitoring {
         }
     }
 
-    public interface SSEMonitoringSubscriptionConfigOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.SSEMonitoringSubscriptionConfig)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.SSEMonitoringSubscriptionConfig)
+    SSEMonitoringSubscriptionConfigOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.DeviceId device_id = 1;
@@ -19875,8 +19917,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.SSEMonitoringSubscriptionConfig}
      */
-    public static final class SSEMonitoringSubscriptionConfig extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.SSEMonitoringSubscriptionConfig)
-    SSEMonitoringSubscriptionConfigOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.SSEMonitoringSubscriptionConfig)
+    SSEMonitoringSubscriptionConfig extends // @@protoc_insertion_point(message_implements:monitoring.SSEMonitoringSubscriptionConfig)
+    com.google.protobuf.GeneratedMessageV3 implements SSEMonitoringSubscriptionConfigOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -20381,8 +20424,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.SSEMonitoringSubscriptionConfig}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.SSEMonitoringSubscriptionConfig)
-        monitoring.Monitoring.SSEMonitoringSubscriptionConfigOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.SSEMonitoringSubscriptionConfig)
+        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.SSEMonitoringSubscriptionConfig)
+        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.SSEMonitoringSubscriptionConfigOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_SSEMonitoringSubscriptionConfig_descriptor;
@@ -21058,8 +21102,8 @@ public final class Monitoring {
         }
     }
 
-    public interface SSEMonitoringSubscriptionResponseOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.SSEMonitoringSubscriptionResponse)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.SSEMonitoringSubscriptionResponse)
+    SSEMonitoringSubscriptionResponseOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * string identifier = 1;
@@ -21089,8 +21133,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.SSEMonitoringSubscriptionResponse}
      */
-    public static final class SSEMonitoringSubscriptionResponse extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.SSEMonitoringSubscriptionResponse)
-    SSEMonitoringSubscriptionResponseOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.SSEMonitoringSubscriptionResponse)
+    SSEMonitoringSubscriptionResponse extends // @@protoc_insertion_point(message_implements:monitoring.SSEMonitoringSubscriptionResponse)
+    com.google.protobuf.GeneratedMessageV3 implements SSEMonitoringSubscriptionResponseOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -21345,8 +21390,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.SSEMonitoringSubscriptionResponse}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.SSEMonitoringSubscriptionResponse)
-        monitoring.Monitoring.SSEMonitoringSubscriptionResponseOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.SSEMonitoringSubscriptionResponse)
+        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.SSEMonitoringSubscriptionResponse)
+        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.SSEMonitoringSubscriptionResponseOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_SSEMonitoringSubscriptionResponse_descriptor;
diff --git a/src/policy/target/generated-sources/grpc/policy/Policy.java b/src/policy/target/generated-sources/grpc/policy/Policy.java
index 04d033e66..9f07cd0de 100644
--- a/src/policy/target/generated-sources/grpc/policy/Policy.java
+++ b/src/policy/target/generated-sources/grpc/policy/Policy.java
@@ -303,8 +303,8 @@ public final class Policy {
         }
     }
 
-    public interface PolicyRuleIdOrBuilder extends // @@protoc_insertion_point(interface_extends:policy.PolicyRuleId)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:policy.PolicyRuleId)
+    PolicyRuleIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid uuid = 1;
@@ -327,8 +327,9 @@ public final class Policy {
     /**
      * Protobuf type {@code policy.PolicyRuleId}
      */
-    public static final class PolicyRuleId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:policy.PolicyRuleId)
-    PolicyRuleIdOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:policy.PolicyRuleId)
+    PolicyRuleId extends // @@protoc_insertion_point(message_implements:policy.PolicyRuleId)
+    com.google.protobuf.GeneratedMessageV3 implements PolicyRuleIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -531,8 +532,9 @@ public final class Policy {
         /**
          * Protobuf type {@code policy.PolicyRuleId}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:policy.PolicyRuleId)
-        policy.Policy.PolicyRuleIdOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:policy.PolicyRuleId)
+        Builder extends // @@protoc_insertion_point(builder_implements:policy.PolicyRuleId)
+        com.google.protobuf.GeneratedMessageV3.Builder implements policy.Policy.PolicyRuleIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return policy.Policy.internal_static_policy_PolicyRuleId_descriptor;
@@ -842,8 +844,8 @@ public final class Policy {
         }
     }
 
-    public interface PolicyRuleStateOrBuilder extends // @@protoc_insertion_point(interface_extends:policy.PolicyRuleState)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:policy.PolicyRuleState)
+    PolicyRuleStateOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .policy.PolicyRuleStateEnum policyRuleState = 1;
@@ -873,8 +875,9 @@ public final class Policy {
     /**
      * Protobuf type {@code policy.PolicyRuleState}
      */
-    public static final class PolicyRuleState extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:policy.PolicyRuleState)
-    PolicyRuleStateOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:policy.PolicyRuleState)
+    PolicyRuleState extends // @@protoc_insertion_point(message_implements:policy.PolicyRuleState)
+    com.google.protobuf.GeneratedMessageV3 implements PolicyRuleStateOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -1114,8 +1117,9 @@ public final class Policy {
         /**
          * Protobuf type {@code policy.PolicyRuleState}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:policy.PolicyRuleState)
-        policy.Policy.PolicyRuleStateOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:policy.PolicyRuleState)
+        Builder extends // @@protoc_insertion_point(builder_implements:policy.PolicyRuleState)
+        com.google.protobuf.GeneratedMessageV3.Builder implements policy.Policy.PolicyRuleStateOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return policy.Policy.internal_static_policy_PolicyRuleState_descriptor;
@@ -1453,8 +1457,8 @@ public final class Policy {
         }
     }
 
-    public interface PolicyRuleBasicOrBuilder extends // @@protoc_insertion_point(interface_extends:policy.PolicyRuleBasic)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:policy.PolicyRuleBasic)
+    PolicyRuleBasicOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .policy.PolicyRuleId policyRuleId = 1;
@@ -1590,8 +1594,9 @@ public final class Policy {
      *
      * Protobuf type {@code policy.PolicyRuleBasic}
      */
-    public static final class PolicyRuleBasic extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:policy.PolicyRuleBasic)
-    PolicyRuleBasicOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:policy.PolicyRuleBasic)
+    PolicyRuleBasic extends // @@protoc_insertion_point(message_implements:policy.PolicyRuleBasic)
+    com.google.protobuf.GeneratedMessageV3 implements PolicyRuleBasicOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -2015,8 +2020,9 @@ public final class Policy {
          *
          * Protobuf type {@code policy.PolicyRuleBasic}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:policy.PolicyRuleBasic)
-        policy.Policy.PolicyRuleBasicOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:policy.PolicyRuleBasic)
+        Builder extends // @@protoc_insertion_point(builder_implements:policy.PolicyRuleBasic)
+        com.google.protobuf.GeneratedMessageV3.Builder implements policy.Policy.PolicyRuleBasicOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return policy.Policy.internal_static_policy_PolicyRuleBasic_descriptor;
@@ -3083,8 +3089,8 @@ public final class Policy {
         }
     }
 
-    public interface PolicyRuleServiceOrBuilder extends // @@protoc_insertion_point(interface_extends:policy.PolicyRuleService)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:policy.PolicyRuleService)
+    PolicyRuleServiceOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * 
@@ -3197,8 +3203,9 @@ public final class Policy {
      *
      * Protobuf type {@code policy.PolicyRuleService}
      */
-    public static final class PolicyRuleService extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:policy.PolicyRuleService)
-    PolicyRuleServiceOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:policy.PolicyRuleService)
+    PolicyRuleService extends // @@protoc_insertion_point(message_implements:policy.PolicyRuleService)
+    com.google.protobuf.GeneratedMessageV3 implements PolicyRuleServiceOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -3553,8 +3560,9 @@ public final class Policy {
          *
          * Protobuf type {@code policy.PolicyRuleService}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:policy.PolicyRuleService)
-        policy.Policy.PolicyRuleServiceOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:policy.PolicyRuleService)
+        Builder extends // @@protoc_insertion_point(builder_implements:policy.PolicyRuleService)
+        com.google.protobuf.GeneratedMessageV3.Builder implements policy.Policy.PolicyRuleServiceOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return policy.Policy.internal_static_policy_PolicyRuleService_descriptor;
@@ -4437,8 +4445,8 @@ public final class Policy {
         }
     }
 
-    public interface PolicyRuleDeviceOrBuilder extends // @@protoc_insertion_point(interface_extends:policy.PolicyRuleDevice)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:policy.PolicyRuleDevice)
+    PolicyRuleDeviceOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * 
@@ -4522,8 +4530,9 @@ public final class Policy {
      *
      * Protobuf type {@code policy.PolicyRuleDevice}
      */
-    public static final class PolicyRuleDevice extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:policy.PolicyRuleDevice)
-    PolicyRuleDeviceOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:policy.PolicyRuleDevice)
+    PolicyRuleDevice extends // @@protoc_insertion_point(message_implements:policy.PolicyRuleDevice)
+    com.google.protobuf.GeneratedMessageV3 implements PolicyRuleDeviceOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -4820,8 +4829,9 @@ public final class Policy {
          *
          * Protobuf type {@code policy.PolicyRuleDevice}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:policy.PolicyRuleDevice)
-        policy.Policy.PolicyRuleDeviceOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:policy.PolicyRuleDevice)
+        Builder extends // @@protoc_insertion_point(builder_implements:policy.PolicyRuleDevice)
+        com.google.protobuf.GeneratedMessageV3.Builder implements policy.Policy.PolicyRuleDeviceOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return policy.Policy.internal_static_policy_PolicyRuleDevice_descriptor;
@@ -5532,8 +5542,8 @@ public final class Policy {
         }
     }
 
-    public interface PolicyRuleOrBuilder extends // @@protoc_insertion_point(interface_extends:policy.PolicyRule)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:policy.PolicyRule)
+    PolicyRuleOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .policy.PolicyRuleService service = 1;
@@ -5579,8 +5589,9 @@ public final class Policy {
      *
      * Protobuf type {@code policy.PolicyRule}
      */
-    public static final class PolicyRule extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:policy.PolicyRule)
-    PolicyRuleOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:policy.PolicyRule)
+    PolicyRule extends // @@protoc_insertion_point(message_implements:policy.PolicyRule)
+    com.google.protobuf.GeneratedMessageV3 implements PolicyRuleOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -5894,8 +5905,9 @@ public final class Policy {
          *
          * Protobuf type {@code policy.PolicyRule}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:policy.PolicyRule)
-        policy.Policy.PolicyRuleOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:policy.PolicyRule)
+        Builder extends // @@protoc_insertion_point(builder_implements:policy.PolicyRule)
+        com.google.protobuf.GeneratedMessageV3.Builder implements policy.Policy.PolicyRuleOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return policy.Policy.internal_static_policy_PolicyRule_descriptor;
@@ -6416,8 +6428,8 @@ public final class Policy {
         }
     }
 
-    public interface PolicyRuleIdListOrBuilder extends // @@protoc_insertion_point(interface_extends:policy.PolicyRuleIdList)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:policy.PolicyRuleIdList)
+    PolicyRuleIdListOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .policy.PolicyRuleId policyRuleIdList = 1;
@@ -6452,8 +6464,9 @@ public final class Policy {
      *
      * Protobuf type {@code policy.PolicyRuleIdList}
      */
-    public static final class PolicyRuleIdList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:policy.PolicyRuleIdList)
-    PolicyRuleIdListOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:policy.PolicyRuleIdList)
+    PolicyRuleIdList extends // @@protoc_insertion_point(message_implements:policy.PolicyRuleIdList)
+    com.google.protobuf.GeneratedMessageV3 implements PolicyRuleIdListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -6672,8 +6685,9 @@ public final class Policy {
          *
          * Protobuf type {@code policy.PolicyRuleIdList}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:policy.PolicyRuleIdList)
-        policy.Policy.PolicyRuleIdListOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:policy.PolicyRuleIdList)
+        Builder extends // @@protoc_insertion_point(builder_implements:policy.PolicyRuleIdList)
+        com.google.protobuf.GeneratedMessageV3.Builder implements policy.Policy.PolicyRuleIdListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return policy.Policy.internal_static_policy_PolicyRuleIdList_descriptor;
@@ -7140,8 +7154,8 @@ public final class Policy {
         }
     }
 
-    public interface PolicyRuleServiceListOrBuilder extends // @@protoc_insertion_point(interface_extends:policy.PolicyRuleServiceList)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:policy.PolicyRuleServiceList)
+    PolicyRuleServiceListOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .policy.PolicyRuleService policyRuleServiceList = 1;
@@ -7176,8 +7190,9 @@ public final class Policy {
      *
      * Protobuf type {@code policy.PolicyRuleServiceList}
      */
-    public static final class PolicyRuleServiceList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:policy.PolicyRuleServiceList)
-    PolicyRuleServiceListOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:policy.PolicyRuleServiceList)
+    PolicyRuleServiceList extends // @@protoc_insertion_point(message_implements:policy.PolicyRuleServiceList)
+    com.google.protobuf.GeneratedMessageV3 implements PolicyRuleServiceListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -7396,8 +7411,9 @@ public final class Policy {
          *
          * Protobuf type {@code policy.PolicyRuleServiceList}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:policy.PolicyRuleServiceList)
-        policy.Policy.PolicyRuleServiceListOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:policy.PolicyRuleServiceList)
+        Builder extends // @@protoc_insertion_point(builder_implements:policy.PolicyRuleServiceList)
+        com.google.protobuf.GeneratedMessageV3.Builder implements policy.Policy.PolicyRuleServiceListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return policy.Policy.internal_static_policy_PolicyRuleServiceList_descriptor;
@@ -7864,8 +7880,8 @@ public final class Policy {
         }
     }
 
-    public interface PolicyRuleDeviceListOrBuilder extends // @@protoc_insertion_point(interface_extends:policy.PolicyRuleDeviceList)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:policy.PolicyRuleDeviceList)
+    PolicyRuleDeviceListOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .policy.PolicyRuleDevice policyRuleDeviceList = 1;
@@ -7900,8 +7916,9 @@ public final class Policy {
      *
      * Protobuf type {@code policy.PolicyRuleDeviceList}
      */
-    public static final class PolicyRuleDeviceList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:policy.PolicyRuleDeviceList)
-    PolicyRuleDeviceListOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:policy.PolicyRuleDeviceList)
+    PolicyRuleDeviceList extends // @@protoc_insertion_point(message_implements:policy.PolicyRuleDeviceList)
+    com.google.protobuf.GeneratedMessageV3 implements PolicyRuleDeviceListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -8120,8 +8137,9 @@ public final class Policy {
          *
          * Protobuf type {@code policy.PolicyRuleDeviceList}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:policy.PolicyRuleDeviceList)
-        policy.Policy.PolicyRuleDeviceListOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:policy.PolicyRuleDeviceList)
+        Builder extends // @@protoc_insertion_point(builder_implements:policy.PolicyRuleDeviceList)
+        com.google.protobuf.GeneratedMessageV3.Builder implements policy.Policy.PolicyRuleDeviceListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return policy.Policy.internal_static_policy_PolicyRuleDeviceList_descriptor;
@@ -8588,8 +8606,8 @@ public final class Policy {
         }
     }
 
-    public interface PolicyRuleListOrBuilder extends // @@protoc_insertion_point(interface_extends:policy.PolicyRuleList)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:policy.PolicyRuleList)
+    PolicyRuleListOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .policy.PolicyRule policyRules = 1;
@@ -8624,8 +8642,9 @@ public final class Policy {
      *
      * Protobuf type {@code policy.PolicyRuleList}
      */
-    public static final class PolicyRuleList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:policy.PolicyRuleList)
-    PolicyRuleListOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:policy.PolicyRuleList)
+    PolicyRuleList extends // @@protoc_insertion_point(message_implements:policy.PolicyRuleList)
+    com.google.protobuf.GeneratedMessageV3 implements PolicyRuleListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -8844,8 +8863,9 @@ public final class Policy {
          *
          * Protobuf type {@code policy.PolicyRuleList}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:policy.PolicyRuleList)
-        policy.Policy.PolicyRuleListOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:policy.PolicyRuleList)
+        Builder extends // @@protoc_insertion_point(builder_implements:policy.PolicyRuleList)
+        com.google.protobuf.GeneratedMessageV3.Builder implements policy.Policy.PolicyRuleListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return policy.Policy.internal_static_policy_PolicyRuleList_descriptor;
diff --git a/src/policy/target/generated-sources/grpc/policy/PolicyAction.java b/src/policy/target/generated-sources/grpc/policy/PolicyAction.java
index 097097d6f..eb5ee9f5e 100644
--- a/src/policy/target/generated-sources/grpc/policy/PolicyAction.java
+++ b/src/policy/target/generated-sources/grpc/policy/PolicyAction.java
@@ -160,8 +160,8 @@ public final class PolicyAction {
         }
     }
 
-    public interface PolicyRuleActionOrBuilder extends // @@protoc_insertion_point(interface_extends:policy.PolicyRuleAction)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:policy.PolicyRuleAction)
+    PolicyRuleActionOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .policy.PolicyRuleActionEnum action = 1;
@@ -208,8 +208,9 @@ public final class PolicyAction {
      *
      * Protobuf type {@code policy.PolicyRuleAction}
      */
-    public static final class PolicyRuleAction extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:policy.PolicyRuleAction)
-    PolicyRuleActionOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:policy.PolicyRuleAction)
+    PolicyRuleAction extends // @@protoc_insertion_point(message_implements:policy.PolicyRuleAction)
+    com.google.protobuf.GeneratedMessageV3 implements PolicyRuleActionOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -462,8 +463,9 @@ public final class PolicyAction {
          *
          * Protobuf type {@code policy.PolicyRuleAction}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:policy.PolicyRuleAction)
-        policy.PolicyAction.PolicyRuleActionOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:policy.PolicyRuleAction)
+        Builder extends // @@protoc_insertion_point(builder_implements:policy.PolicyRuleAction)
+        com.google.protobuf.GeneratedMessageV3.Builder implements policy.PolicyAction.PolicyRuleActionOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return policy.PolicyAction.internal_static_policy_PolicyRuleAction_descriptor;
@@ -1003,8 +1005,8 @@ public final class PolicyAction {
         }
     }
 
-    public interface PolicyRuleActionConfigOrBuilder extends // @@protoc_insertion_point(interface_extends:policy.PolicyRuleActionConfig)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:policy.PolicyRuleActionConfig)
+    PolicyRuleActionConfigOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * string action_key = 1;
@@ -1038,8 +1040,9 @@ public final class PolicyAction {
      *
      * Protobuf type {@code policy.PolicyRuleActionConfig}
      */
-    public static final class PolicyRuleActionConfig extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:policy.PolicyRuleActionConfig)
-    PolicyRuleActionConfigOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:policy.PolicyRuleActionConfig)
+    PolicyRuleActionConfig extends // @@protoc_insertion_point(message_implements:policy.PolicyRuleActionConfig)
+    com.google.protobuf.GeneratedMessageV3 implements PolicyRuleActionConfigOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -1298,8 +1301,9 @@ public final class PolicyAction {
          *
          * Protobuf type {@code policy.PolicyRuleActionConfig}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:policy.PolicyRuleActionConfig)
-        policy.PolicyAction.PolicyRuleActionConfigOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:policy.PolicyRuleActionConfig)
+        Builder extends // @@protoc_insertion_point(builder_implements:policy.PolicyRuleActionConfig)
+        com.google.protobuf.GeneratedMessageV3.Builder implements policy.PolicyAction.PolicyRuleActionConfigOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return policy.PolicyAction.internal_static_policy_PolicyRuleActionConfig_descriptor;
diff --git a/src/policy/target/generated-sources/grpc/policy/PolicyCondition.java b/src/policy/target/generated-sources/grpc/policy/PolicyCondition.java
index f5b5fd967..9dd6ed753 100644
--- a/src/policy/target/generated-sources/grpc/policy/PolicyCondition.java
+++ b/src/policy/target/generated-sources/grpc/policy/PolicyCondition.java
@@ -372,8 +372,8 @@ public final class PolicyCondition {
         }
     }
 
-    public interface PolicyRuleConditionOrBuilder extends // @@protoc_insertion_point(interface_extends:policy.PolicyRuleCondition)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:policy.PolicyRuleCondition)
+    PolicyRuleConditionOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * 
@@ -441,8 +441,9 @@ public final class PolicyCondition {
      *
      * Protobuf type {@code policy.PolicyRuleCondition}
      */
-    public static final class PolicyRuleCondition extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:policy.PolicyRuleCondition)
-    PolicyRuleConditionOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:policy.PolicyRuleCondition)
+    PolicyRuleCondition extends // @@protoc_insertion_point(message_implements:policy.PolicyRuleCondition)
+    com.google.protobuf.GeneratedMessageV3 implements PolicyRuleConditionOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -741,8 +742,9 @@ public final class PolicyCondition {
          *
          * Protobuf type {@code policy.PolicyRuleCondition}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:policy.PolicyRuleCondition)
-        policy.PolicyCondition.PolicyRuleConditionOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:policy.PolicyRuleCondition)
+        Builder extends // @@protoc_insertion_point(builder_implements:policy.PolicyRuleCondition)
+        com.google.protobuf.GeneratedMessageV3.Builder implements policy.PolicyCondition.PolicyRuleConditionOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return policy.PolicyCondition.internal_static_policy_PolicyRuleCondition_descriptor;
diff --git a/src/ztp/target/generated-sources/grpc/acl/Acl.java b/src/ztp/target/generated-sources/grpc/acl/Acl.java
index 037bd3858..69677b4cc 100644
--- a/src/ztp/target/generated-sources/grpc/acl/Acl.java
+++ b/src/ztp/target/generated-sources/grpc/acl/Acl.java
@@ -397,8 +397,8 @@ public final class Acl {
         }
     }
 
-    public interface AclMatchOrBuilder extends // @@protoc_insertion_point(interface_extends:acl.AclMatch)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:acl.AclMatch)
+    AclMatchOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * uint32 dscp = 1;
@@ -476,8 +476,9 @@ public final class Acl {
     /**
      * Protobuf type {@code acl.AclMatch}
      */
-    public static final class AclMatch extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:acl.AclMatch)
-    AclMatchOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:acl.AclMatch)
+    // @@protoc_insertion_point(message_implements:acl.AclMatch)
+    AclMatch extends com.google.protobuf.GeneratedMessageV3 implements AclMatchOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -919,8 +920,9 @@ public final class Acl {
         /**
          * Protobuf type {@code acl.AclMatch}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:acl.AclMatch)
-        acl.Acl.AclMatchOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:acl.AclMatch)
+        // @@protoc_insertion_point(builder_implements:acl.AclMatch)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements acl.Acl.AclMatchOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return acl.Acl.internal_static_acl_AclMatch_descriptor;
@@ -1655,8 +1657,8 @@ public final class Acl {
         }
     }
 
-    public interface AclActionOrBuilder extends // @@protoc_insertion_point(interface_extends:acl.AclAction)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:acl.AclAction)
+    AclActionOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .acl.AclForwardActionEnum forward_action = 1;
@@ -1686,8 +1688,9 @@ public final class Acl {
     /**
      * Protobuf type {@code acl.AclAction}
      */
-    public static final class AclAction extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:acl.AclAction)
-    AclActionOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:acl.AclAction)
+    // @@protoc_insertion_point(message_implements:acl.AclAction)
+    AclAction extends com.google.protobuf.GeneratedMessageV3 implements AclActionOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -1912,8 +1915,9 @@ public final class Acl {
         /**
          * Protobuf type {@code acl.AclAction}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:acl.AclAction)
-        acl.Acl.AclActionOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:acl.AclAction)
+        // @@protoc_insertion_point(builder_implements:acl.AclAction)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements acl.Acl.AclActionOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return acl.Acl.internal_static_acl_AclAction_descriptor;
@@ -2233,8 +2237,8 @@ public final class Acl {
         }
     }
 
-    public interface AclEntryOrBuilder extends // @@protoc_insertion_point(interface_extends:acl.AclEntry)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:acl.AclEntry)
+    AclEntryOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * uint32 sequence_id = 1;
@@ -2292,8 +2296,9 @@ public final class Acl {
     /**
      * Protobuf type {@code acl.AclEntry}
      */
-    public static final class AclEntry extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:acl.AclEntry)
-    AclEntryOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:acl.AclEntry)
+    // @@protoc_insertion_point(message_implements:acl.AclEntry)
+    AclEntry extends com.google.protobuf.GeneratedMessageV3 implements AclEntryOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -2614,8 +2619,9 @@ public final class Acl {
         /**
          * Protobuf type {@code acl.AclEntry}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:acl.AclEntry)
-        acl.Acl.AclEntryOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:acl.AclEntry)
+        // @@protoc_insertion_point(builder_implements:acl.AclEntry)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements acl.Acl.AclEntryOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return acl.Acl.internal_static_acl_AclEntry_descriptor;
@@ -3200,8 +3206,8 @@ public final class Acl {
         }
     }
 
-    public interface AclRuleSetOrBuilder extends // @@protoc_insertion_point(interface_extends:acl.AclRuleSet)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:acl.AclRuleSet)
+    AclRuleSetOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * string name = 1;
@@ -3280,8 +3286,9 @@ public final class Acl {
     /**
      * Protobuf type {@code acl.AclRuleSet}
      */
-    public static final class AclRuleSet extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:acl.AclRuleSet)
-    AclRuleSetOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:acl.AclRuleSet)
+    // @@protoc_insertion_point(message_implements:acl.AclRuleSet)
+    AclRuleSet extends com.google.protobuf.GeneratedMessageV3 implements AclRuleSetOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -3677,8 +3684,9 @@ public final class Acl {
         /**
          * Protobuf type {@code acl.AclRuleSet}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:acl.AclRuleSet)
-        acl.Acl.AclRuleSetOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:acl.AclRuleSet)
+        // @@protoc_insertion_point(builder_implements:acl.AclRuleSet)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements acl.Acl.AclRuleSetOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return acl.Acl.internal_static_acl_AclRuleSet_descriptor;
diff --git a/src/ztp/target/generated-sources/grpc/context/ContextOuterClass.java b/src/ztp/target/generated-sources/grpc/context/ContextOuterClass.java
index ceec864c6..a6770316d 100644
--- a/src/ztp/target/generated-sources/grpc/context/ContextOuterClass.java
+++ b/src/ztp/target/generated-sources/grpc/context/ContextOuterClass.java
@@ -1652,8 +1652,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface EmptyOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Empty)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.Empty)
+    EmptyOrBuilder extends com.google.protobuf.MessageOrBuilder {
     }
 
     /**
@@ -1663,8 +1663,9 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.Empty}
      */
-    public static final class Empty extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Empty)
-    EmptyOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.Empty)
+    // @@protoc_insertion_point(message_implements:context.Empty)
+    Empty extends com.google.protobuf.GeneratedMessageV3 implements EmptyOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -1825,8 +1826,9 @@ public final class ContextOuterClass {
          *
          * Protobuf type {@code context.Empty}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Empty)
-        context.ContextOuterClass.EmptyOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.Empty)
+        // @@protoc_insertion_point(builder_implements:context.Empty)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.EmptyOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Empty_descriptor;
@@ -1990,8 +1992,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface UuidOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Uuid)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.Uuid)
+    UuidOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * string uuid = 1;
@@ -2009,8 +2011,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Uuid}
      */
-    public static final class Uuid extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Uuid)
-    UuidOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.Uuid)
+    // @@protoc_insertion_point(message_implements:context.Uuid)
+    Uuid extends com.google.protobuf.GeneratedMessageV3 implements UuidOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -2216,8 +2219,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Uuid}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Uuid)
-        context.ContextOuterClass.UuidOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.Uuid)
+        // @@protoc_insertion_point(builder_implements:context.Uuid)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.UuidOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Uuid_descriptor;
@@ -2482,8 +2486,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface TimestampOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Timestamp)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.Timestamp)
+    TimestampOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * double timestamp = 1;
@@ -2495,8 +2499,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Timestamp}
      */
-    public static final class Timestamp extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Timestamp)
-    TimestampOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.Timestamp)
+    // @@protoc_insertion_point(message_implements:context.Timestamp)
+    Timestamp extends com.google.protobuf.GeneratedMessageV3 implements TimestampOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -2676,8 +2681,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Timestamp}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Timestamp)
-        context.ContextOuterClass.TimestampOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.Timestamp)
+        // @@protoc_insertion_point(builder_implements:context.Timestamp)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.TimestampOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Timestamp_descriptor;
@@ -2899,8 +2905,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface EventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Event)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.Event)
+    EventOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Timestamp timestamp = 1;
@@ -2935,8 +2941,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Event}
      */
-    public static final class Event extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Event)
-    EventOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.Event)
+    // @@protoc_insertion_point(message_implements:context.Event)
+    Event extends com.google.protobuf.GeneratedMessageV3 implements EventOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -3173,8 +3180,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Event}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Event)
-        context.ContextOuterClass.EventOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.Event)
+        // @@protoc_insertion_point(builder_implements:context.Event)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.EventOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Event_descriptor;
@@ -3557,8 +3565,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface AnyEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.AnyEvent)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.AnyEvent)
+    AnyEventOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ContextEvent context = 1;
@@ -3685,8 +3693,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.AnyEvent}
      */
-    public static final class AnyEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.AnyEvent)
-    AnyEventOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.AnyEvent)
+    // @@protoc_insertion_point(message_implements:context.AnyEvent)
+    AnyEvent extends com.google.protobuf.GeneratedMessageV3 implements AnyEventOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -4253,8 +4262,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.AnyEvent}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.AnyEvent)
-        context.ContextOuterClass.AnyEventOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.AnyEvent)
+        // @@protoc_insertion_point(builder_implements:context.AnyEvent)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.AnyEventOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_AnyEvent_descriptor;
@@ -5570,8 +5580,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface ContextIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ContextId)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.ContextId)
+    ContextIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid context_uuid = 1;
@@ -5598,8 +5608,9 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.ContextId}
      */
-    public static final class ContextId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ContextId)
-    ContextIdOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.ContextId)
+    // @@protoc_insertion_point(message_implements:context.ContextId)
+    ContextId extends com.google.protobuf.GeneratedMessageV3 implements ContextIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -5806,8 +5817,9 @@ public final class ContextOuterClass {
          *
          * Protobuf type {@code context.ContextId}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ContextId)
-        context.ContextOuterClass.ContextIdOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.ContextId)
+        // @@protoc_insertion_point(builder_implements:context.ContextId)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ContextIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ContextId_descriptor;
@@ -6117,8 +6129,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface ContextOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Context)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.Context)
+    ContextOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ContextId context_id = 1;
@@ -6245,8 +6257,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Context}
      */
-    public static final class Context extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Context)
-    ContextOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.Context)
+    // @@protoc_insertion_point(message_implements:context.Context)
+    Context extends com.google.protobuf.GeneratedMessageV3 implements ContextOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -6718,8 +6731,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Context}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Context)
-        context.ContextOuterClass.ContextOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.Context)
+        // @@protoc_insertion_point(builder_implements:context.Context)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ContextOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Context_descriptor;
@@ -8127,8 +8141,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface ContextIdListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ContextIdList)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.ContextIdList)
+    ContextIdListOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.ContextId context_ids = 1;
@@ -8159,8 +8173,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ContextIdList}
      */
-    public static final class ContextIdList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ContextIdList)
-    ContextIdListOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.ContextIdList)
+    // @@protoc_insertion_point(message_implements:context.ContextIdList)
+    ContextIdList extends com.google.protobuf.GeneratedMessageV3 implements ContextIdListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -8375,8 +8390,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ContextIdList}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ContextIdList)
-        context.ContextOuterClass.ContextIdListOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.ContextIdList)
+        // @@protoc_insertion_point(builder_implements:context.ContextIdList)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ContextIdListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ContextIdList_descriptor;
@@ -8843,8 +8859,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface ContextListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ContextList)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.ContextList)
+    ContextListOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.Context contexts = 1;
@@ -8875,8 +8891,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ContextList}
      */
-    public static final class ContextList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ContextList)
-    ContextListOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.ContextList)
+    // @@protoc_insertion_point(message_implements:context.ContextList)
+    ContextList extends com.google.protobuf.GeneratedMessageV3 implements ContextListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -9091,8 +9108,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ContextList}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ContextList)
-        context.ContextOuterClass.ContextListOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.ContextList)
+        // @@protoc_insertion_point(builder_implements:context.ContextList)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ContextListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ContextList_descriptor;
@@ -9559,8 +9577,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface ContextEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ContextEvent)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.ContextEvent)
+    ContextEventOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Event event = 1;
@@ -9600,8 +9618,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ContextEvent}
      */
-    public static final class ContextEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ContextEvent)
-    ContextEventOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.ContextEvent)
+    // @@protoc_insertion_point(message_implements:context.ContextEvent)
+    ContextEvent extends com.google.protobuf.GeneratedMessageV3 implements ContextEventOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -9850,8 +9869,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ContextEvent}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ContextEvent)
-        context.ContextOuterClass.ContextEventOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.ContextEvent)
+        // @@protoc_insertion_point(builder_implements:context.ContextEvent)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ContextEventOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ContextEvent_descriptor;
@@ -10297,8 +10317,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface TopologyIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.TopologyId)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.TopologyId)
+    TopologyIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ContextId context_id = 1;
@@ -10342,8 +10362,9 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.TopologyId}
      */
-    public static final class TopologyId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.TopologyId)
-    TopologyIdOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.TopologyId)
+    // @@protoc_insertion_point(message_implements:context.TopologyId)
+    TopologyId extends com.google.protobuf.GeneratedMessageV3 implements TopologyIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -10596,8 +10617,9 @@ public final class ContextOuterClass {
          *
          * Protobuf type {@code context.TopologyId}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.TopologyId)
-        context.ContextOuterClass.TopologyIdOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.TopologyId)
+        // @@protoc_insertion_point(builder_implements:context.TopologyId)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.TopologyIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_TopologyId_descriptor;
@@ -11043,8 +11065,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface TopologyOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Topology)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.Topology)
+    TopologyOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.TopologyId topology_id = 1;
@@ -11154,8 +11176,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Topology}
      */
-    public static final class Topology extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Topology)
-    TopologyOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.Topology)
+    // @@protoc_insertion_point(message_implements:context.Topology)
+    Topology extends com.google.protobuf.GeneratedMessageV3 implements TopologyOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -11581,8 +11604,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Topology}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Topology)
-        context.ContextOuterClass.TopologyOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.Topology)
+        // @@protoc_insertion_point(builder_implements:context.Topology)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.TopologyOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Topology_descriptor;
@@ -12854,8 +12878,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface TopologyDetailsOrBuilder extends // @@protoc_insertion_point(interface_extends:context.TopologyDetails)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.TopologyDetails)
+    TopologyDetailsOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.TopologyId topology_id = 1;
@@ -12965,8 +12989,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.TopologyDetails}
      */
-    public static final class TopologyDetails extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.TopologyDetails)
-    TopologyDetailsOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.TopologyDetails)
+    // @@protoc_insertion_point(message_implements:context.TopologyDetails)
+    TopologyDetails extends com.google.protobuf.GeneratedMessageV3 implements TopologyDetailsOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -13392,8 +13417,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.TopologyDetails}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.TopologyDetails)
-        context.ContextOuterClass.TopologyDetailsOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.TopologyDetails)
+        // @@protoc_insertion_point(builder_implements:context.TopologyDetails)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.TopologyDetailsOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_TopologyDetails_descriptor;
@@ -14665,8 +14691,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface TopologyIdListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.TopologyIdList)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.TopologyIdList)
+    TopologyIdListOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.TopologyId topology_ids = 1;
@@ -14697,8 +14723,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.TopologyIdList}
      */
-    public static final class TopologyIdList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.TopologyIdList)
-    TopologyIdListOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.TopologyIdList)
+    // @@protoc_insertion_point(message_implements:context.TopologyIdList)
+    TopologyIdList extends com.google.protobuf.GeneratedMessageV3 implements TopologyIdListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -14913,8 +14940,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.TopologyIdList}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.TopologyIdList)
-        context.ContextOuterClass.TopologyIdListOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.TopologyIdList)
+        // @@protoc_insertion_point(builder_implements:context.TopologyIdList)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.TopologyIdListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_TopologyIdList_descriptor;
@@ -15381,8 +15409,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface TopologyListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.TopologyList)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.TopologyList)
+    TopologyListOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.Topology topologies = 1;
@@ -15413,8 +15441,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.TopologyList}
      */
-    public static final class TopologyList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.TopologyList)
-    TopologyListOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.TopologyList)
+    // @@protoc_insertion_point(message_implements:context.TopologyList)
+    TopologyList extends com.google.protobuf.GeneratedMessageV3 implements TopologyListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -15629,8 +15658,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.TopologyList}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.TopologyList)
-        context.ContextOuterClass.TopologyListOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.TopologyList)
+        // @@protoc_insertion_point(builder_implements:context.TopologyList)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.TopologyListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_TopologyList_descriptor;
@@ -16097,8 +16127,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface TopologyEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.TopologyEvent)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.TopologyEvent)
+    TopologyEventOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Event event = 1;
@@ -16138,8 +16168,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.TopologyEvent}
      */
-    public static final class TopologyEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.TopologyEvent)
-    TopologyEventOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.TopologyEvent)
+    // @@protoc_insertion_point(message_implements:context.TopologyEvent)
+    TopologyEvent extends com.google.protobuf.GeneratedMessageV3 implements TopologyEventOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -16388,8 +16419,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.TopologyEvent}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.TopologyEvent)
-        context.ContextOuterClass.TopologyEventOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.TopologyEvent)
+        // @@protoc_insertion_point(builder_implements:context.TopologyEvent)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.TopologyEventOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_TopologyEvent_descriptor;
@@ -16835,8 +16867,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface DeviceIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.DeviceId)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.DeviceId)
+    DeviceIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid device_uuid = 1;
@@ -16863,8 +16895,9 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.DeviceId}
      */
-    public static final class DeviceId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.DeviceId)
-    DeviceIdOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.DeviceId)
+    // @@protoc_insertion_point(message_implements:context.DeviceId)
+    DeviceId extends com.google.protobuf.GeneratedMessageV3 implements DeviceIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -17071,8 +17104,9 @@ public final class ContextOuterClass {
          *
          * Protobuf type {@code context.DeviceId}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.DeviceId)
-        context.ContextOuterClass.DeviceIdOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.DeviceId)
+        // @@protoc_insertion_point(builder_implements:context.DeviceId)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.DeviceIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_DeviceId_descriptor;
@@ -17382,8 +17416,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface DeviceOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Device)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.Device)
+    DeviceOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.DeviceId device_id = 1;
@@ -17590,8 +17624,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Device}
      */
-    public static final class Device extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Device)
-    DeviceOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.Device)
+    // @@protoc_insertion_point(message_implements:context.Device)
+    Device extends com.google.protobuf.GeneratedMessageV3 implements DeviceOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -18255,8 +18290,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Device}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Device)
-        context.ContextOuterClass.DeviceOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.Device)
+        // @@protoc_insertion_point(builder_implements:context.Device)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.DeviceOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Device_descriptor;
@@ -19967,8 +20003,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface ComponentOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Component)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.Component)
+    ComponentOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid component_uuid = 1;
@@ -20084,8 +20120,9 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.Component}
      */
-    public static final class Component extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Component)
-    ComponentOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.Component)
+    // @@protoc_insertion_point(message_implements:context.Component)
+    Component extends com.google.protobuf.GeneratedMessageV3 implements ComponentOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -20555,8 +20592,9 @@ public final class ContextOuterClass {
          *
          * Protobuf type {@code context.Component}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Component)
-        context.ContextOuterClass.ComponentOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.Component)
+        // @@protoc_insertion_point(builder_implements:context.Component)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ComponentOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Component_descriptor;
@@ -21334,8 +21372,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface DeviceConfigOrBuilder extends // @@protoc_insertion_point(interface_extends:context.DeviceConfig)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.DeviceConfig)
+    DeviceConfigOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.ConfigRule config_rules = 1;
@@ -21366,8 +21404,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.DeviceConfig}
      */
-    public static final class DeviceConfig extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.DeviceConfig)
-    DeviceConfigOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.DeviceConfig)
+    // @@protoc_insertion_point(message_implements:context.DeviceConfig)
+    DeviceConfig extends com.google.protobuf.GeneratedMessageV3 implements DeviceConfigOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -21582,8 +21621,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.DeviceConfig}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.DeviceConfig)
-        context.ContextOuterClass.DeviceConfigOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.DeviceConfig)
+        // @@protoc_insertion_point(builder_implements:context.DeviceConfig)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.DeviceConfigOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_DeviceConfig_descriptor;
@@ -22050,8 +22090,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface DeviceIdListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.DeviceIdList)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.DeviceIdList)
+    DeviceIdListOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.DeviceId device_ids = 1;
@@ -22082,8 +22122,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.DeviceIdList}
      */
-    public static final class DeviceIdList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.DeviceIdList)
-    DeviceIdListOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.DeviceIdList)
+    // @@protoc_insertion_point(message_implements:context.DeviceIdList)
+    DeviceIdList extends com.google.protobuf.GeneratedMessageV3 implements DeviceIdListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -22298,8 +22339,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.DeviceIdList}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.DeviceIdList)
-        context.ContextOuterClass.DeviceIdListOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.DeviceIdList)
+        // @@protoc_insertion_point(builder_implements:context.DeviceIdList)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.DeviceIdListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_DeviceIdList_descriptor;
@@ -22766,8 +22808,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface DeviceListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.DeviceList)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.DeviceList)
+    DeviceListOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.Device devices = 1;
@@ -22798,8 +22840,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.DeviceList}
      */
-    public static final class DeviceList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.DeviceList)
-    DeviceListOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.DeviceList)
+    // @@protoc_insertion_point(message_implements:context.DeviceList)
+    DeviceList extends com.google.protobuf.GeneratedMessageV3 implements DeviceListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -23014,8 +23057,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.DeviceList}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.DeviceList)
-        context.ContextOuterClass.DeviceListOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.DeviceList)
+        // @@protoc_insertion_point(builder_implements:context.DeviceList)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.DeviceListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_DeviceList_descriptor;
@@ -23482,8 +23526,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface DeviceFilterOrBuilder extends // @@protoc_insertion_point(interface_extends:context.DeviceFilter)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.DeviceFilter)
+    DeviceFilterOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.DeviceIdList device_ids = 1;
@@ -23524,8 +23568,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.DeviceFilter}
      */
-    public static final class DeviceFilter extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.DeviceFilter)
-    DeviceFilterOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.DeviceFilter)
+    // @@protoc_insertion_point(message_implements:context.DeviceFilter)
+    DeviceFilter extends com.google.protobuf.GeneratedMessageV3 implements DeviceFilterOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -23797,8 +23842,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.DeviceFilter}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.DeviceFilter)
-        context.ContextOuterClass.DeviceFilterOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.DeviceFilter)
+        // @@protoc_insertion_point(builder_implements:context.DeviceFilter)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.DeviceFilterOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_DeviceFilter_descriptor;
@@ -24252,8 +24298,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface DeviceEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.DeviceEvent)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.DeviceEvent)
+    DeviceEventOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Event event = 1;
@@ -24310,8 +24356,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.DeviceEvent}
      */
-    public static final class DeviceEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.DeviceEvent)
-    DeviceEventOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.DeviceEvent)
+    // @@protoc_insertion_point(message_implements:context.DeviceEvent)
+    DeviceEvent extends com.google.protobuf.GeneratedMessageV3 implements DeviceEventOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -24606,8 +24653,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.DeviceEvent}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.DeviceEvent)
-        context.ContextOuterClass.DeviceEventOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.DeviceEvent)
+        // @@protoc_insertion_point(builder_implements:context.DeviceEvent)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.DeviceEventOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_DeviceEvent_descriptor;
@@ -25189,8 +25237,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface LinkIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.LinkId)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.LinkId)
+    LinkIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid link_uuid = 1;
@@ -25217,8 +25265,9 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.LinkId}
      */
-    public static final class LinkId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.LinkId)
-    LinkIdOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.LinkId)
+    // @@protoc_insertion_point(message_implements:context.LinkId)
+    LinkId extends com.google.protobuf.GeneratedMessageV3 implements LinkIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -25425,8 +25474,9 @@ public final class ContextOuterClass {
          *
          * Protobuf type {@code context.LinkId}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.LinkId)
-        context.ContextOuterClass.LinkIdOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.LinkId)
+        // @@protoc_insertion_point(builder_implements:context.LinkId)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.LinkIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_LinkId_descriptor;
@@ -25736,8 +25786,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface LinkAttributesOrBuilder extends // @@protoc_insertion_point(interface_extends:context.LinkAttributes)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.LinkAttributes)
+    LinkAttributesOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * bool is_bidirectional = 1;
@@ -25761,8 +25811,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.LinkAttributes}
      */
-    public static final class LinkAttributes extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.LinkAttributes)
-    LinkAttributesOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.LinkAttributes)
+    // @@protoc_insertion_point(message_implements:context.LinkAttributes)
+    LinkAttributes extends com.google.protobuf.GeneratedMessageV3 implements LinkAttributesOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -25988,8 +26039,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.LinkAttributes}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.LinkAttributes)
-        context.ContextOuterClass.LinkAttributesOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.LinkAttributes)
+        // @@protoc_insertion_point(builder_implements:context.LinkAttributes)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.LinkAttributesOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_LinkAttributes_descriptor;
@@ -26307,8 +26359,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface LinkOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Link)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.Link)
+    LinkOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.LinkId link_id = 1;
@@ -26397,8 +26449,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Link}
      */
-    public static final class Link extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Link)
-    LinkOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.Link)
+    // @@protoc_insertion_point(message_implements:context.Link)
+    Link extends com.google.protobuf.GeneratedMessageV3 implements LinkOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -26788,8 +26841,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Link}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Link)
-        context.ContextOuterClass.LinkOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.Link)
+        // @@protoc_insertion_point(builder_implements:context.Link)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.LinkOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Link_descriptor;
@@ -27692,8 +27746,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface LinkIdListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.LinkIdList)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.LinkIdList)
+    LinkIdListOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.LinkId link_ids = 1;
@@ -27724,8 +27778,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.LinkIdList}
      */
-    public static final class LinkIdList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.LinkIdList)
-    LinkIdListOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.LinkIdList)
+    // @@protoc_insertion_point(message_implements:context.LinkIdList)
+    LinkIdList extends com.google.protobuf.GeneratedMessageV3 implements LinkIdListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -27940,8 +27995,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.LinkIdList}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.LinkIdList)
-        context.ContextOuterClass.LinkIdListOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.LinkIdList)
+        // @@protoc_insertion_point(builder_implements:context.LinkIdList)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.LinkIdListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_LinkIdList_descriptor;
@@ -28408,8 +28464,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface LinkListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.LinkList)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.LinkList)
+    LinkListOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.Link links = 1;
@@ -28440,8 +28496,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.LinkList}
      */
-    public static final class LinkList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.LinkList)
-    LinkListOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.LinkList)
+    // @@protoc_insertion_point(message_implements:context.LinkList)
+    LinkList extends com.google.protobuf.GeneratedMessageV3 implements LinkListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -28656,8 +28713,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.LinkList}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.LinkList)
-        context.ContextOuterClass.LinkListOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.LinkList)
+        // @@protoc_insertion_point(builder_implements:context.LinkList)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.LinkListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_LinkList_descriptor;
@@ -29124,8 +29182,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface LinkEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.LinkEvent)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.LinkEvent)
+    LinkEventOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Event event = 1;
@@ -29165,8 +29223,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.LinkEvent}
      */
-    public static final class LinkEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.LinkEvent)
-    LinkEventOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.LinkEvent)
+    // @@protoc_insertion_point(message_implements:context.LinkEvent)
+    LinkEvent extends com.google.protobuf.GeneratedMessageV3 implements LinkEventOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -29415,8 +29474,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.LinkEvent}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.LinkEvent)
-        context.ContextOuterClass.LinkEventOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.LinkEvent)
+        // @@protoc_insertion_point(builder_implements:context.LinkEvent)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.LinkEventOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_LinkEvent_descriptor;
@@ -29862,8 +29922,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface ServiceIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ServiceId)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.ServiceId)
+    ServiceIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ContextId context_id = 1;
@@ -29907,8 +29967,9 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.ServiceId}
      */
-    public static final class ServiceId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ServiceId)
-    ServiceIdOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.ServiceId)
+    // @@protoc_insertion_point(message_implements:context.ServiceId)
+    ServiceId extends com.google.protobuf.GeneratedMessageV3 implements ServiceIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -30161,8 +30222,9 @@ public final class ContextOuterClass {
          *
          * Protobuf type {@code context.ServiceId}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ServiceId)
-        context.ContextOuterClass.ServiceIdOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.ServiceId)
+        // @@protoc_insertion_point(builder_implements:context.ServiceId)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ServiceId_descriptor;
@@ -30608,8 +30670,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface ServiceOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Service)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.Service)
+    ServiceOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ServiceId service_id = 1;
@@ -30757,8 +30819,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Service}
      */
-    public static final class Service extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Service)
-    ServiceOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.Service)
+    // @@protoc_insertion_point(message_implements:context.Service)
+    Service extends com.google.protobuf.GeneratedMessageV3 implements ServiceOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -31298,8 +31361,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Service}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Service)
-        context.ContextOuterClass.ServiceOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.Service)
+        // @@protoc_insertion_point(builder_implements:context.Service)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Service_descriptor;
@@ -32763,8 +32827,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface ServiceStatusOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ServiceStatus)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.ServiceStatus)
+    ServiceStatusOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ServiceStatusEnum service_status = 1;
@@ -32782,8 +32846,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ServiceStatus}
      */
-    public static final class ServiceStatus extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ServiceStatus)
-    ServiceStatusOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.ServiceStatus)
+    // @@protoc_insertion_point(message_implements:context.ServiceStatus)
+    ServiceStatus extends com.google.protobuf.GeneratedMessageV3 implements ServiceStatusOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -32974,8 +33039,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ServiceStatus}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ServiceStatus)
-        context.ContextOuterClass.ServiceStatusOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.ServiceStatus)
+        // @@protoc_insertion_point(builder_implements:context.ServiceStatus)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceStatusOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ServiceStatus_descriptor;
@@ -33222,8 +33288,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface ServiceConfigOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ServiceConfig)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.ServiceConfig)
+    ServiceConfigOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.ConfigRule config_rules = 1;
@@ -33254,8 +33320,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ServiceConfig}
      */
-    public static final class ServiceConfig extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ServiceConfig)
-    ServiceConfigOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.ServiceConfig)
+    // @@protoc_insertion_point(message_implements:context.ServiceConfig)
+    ServiceConfig extends com.google.protobuf.GeneratedMessageV3 implements ServiceConfigOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -33470,8 +33537,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ServiceConfig}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ServiceConfig)
-        context.ContextOuterClass.ServiceConfigOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.ServiceConfig)
+        // @@protoc_insertion_point(builder_implements:context.ServiceConfig)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceConfigOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ServiceConfig_descriptor;
@@ -33938,8 +34006,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface ServiceIdListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ServiceIdList)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.ServiceIdList)
+    ServiceIdListOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.ServiceId service_ids = 1;
@@ -33970,8 +34038,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ServiceIdList}
      */
-    public static final class ServiceIdList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ServiceIdList)
-    ServiceIdListOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.ServiceIdList)
+    // @@protoc_insertion_point(message_implements:context.ServiceIdList)
+    ServiceIdList extends com.google.protobuf.GeneratedMessageV3 implements ServiceIdListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -34186,8 +34255,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ServiceIdList}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ServiceIdList)
-        context.ContextOuterClass.ServiceIdListOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.ServiceIdList)
+        // @@protoc_insertion_point(builder_implements:context.ServiceIdList)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceIdListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ServiceIdList_descriptor;
@@ -34654,8 +34724,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface ServiceListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ServiceList)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.ServiceList)
+    ServiceListOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.Service services = 1;
@@ -34686,8 +34756,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ServiceList}
      */
-    public static final class ServiceList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ServiceList)
-    ServiceListOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.ServiceList)
+    // @@protoc_insertion_point(message_implements:context.ServiceList)
+    ServiceList extends com.google.protobuf.GeneratedMessageV3 implements ServiceListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -34902,8 +34973,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ServiceList}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ServiceList)
-        context.ContextOuterClass.ServiceListOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.ServiceList)
+        // @@protoc_insertion_point(builder_implements:context.ServiceList)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ServiceList_descriptor;
@@ -35370,8 +35442,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface ServiceFilterOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ServiceFilter)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.ServiceFilter)
+    ServiceFilterOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ServiceIdList service_ids = 1;
@@ -35412,8 +35484,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ServiceFilter}
      */
-    public static final class ServiceFilter extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ServiceFilter)
-    ServiceFilterOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.ServiceFilter)
+    // @@protoc_insertion_point(message_implements:context.ServiceFilter)
+    ServiceFilter extends com.google.protobuf.GeneratedMessageV3 implements ServiceFilterOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -35685,8 +35758,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ServiceFilter}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ServiceFilter)
-        context.ContextOuterClass.ServiceFilterOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.ServiceFilter)
+        // @@protoc_insertion_point(builder_implements:context.ServiceFilter)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceFilterOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ServiceFilter_descriptor;
@@ -36140,8 +36214,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface ServiceEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ServiceEvent)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.ServiceEvent)
+    ServiceEventOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Event event = 1;
@@ -36181,8 +36255,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ServiceEvent}
      */
-    public static final class ServiceEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ServiceEvent)
-    ServiceEventOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.ServiceEvent)
+    // @@protoc_insertion_point(message_implements:context.ServiceEvent)
+    ServiceEvent extends com.google.protobuf.GeneratedMessageV3 implements ServiceEventOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -36431,8 +36506,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ServiceEvent}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ServiceEvent)
-        context.ContextOuterClass.ServiceEventOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.ServiceEvent)
+        // @@protoc_insertion_point(builder_implements:context.ServiceEvent)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceEventOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ServiceEvent_descriptor;
@@ -36878,8 +36954,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface SliceIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.SliceId)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.SliceId)
+    SliceIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ContextId context_id = 1;
@@ -36923,8 +36999,9 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.SliceId}
      */
-    public static final class SliceId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.SliceId)
-    SliceIdOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.SliceId)
+    // @@protoc_insertion_point(message_implements:context.SliceId)
+    SliceId extends com.google.protobuf.GeneratedMessageV3 implements SliceIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -37177,8 +37254,9 @@ public final class ContextOuterClass {
          *
          * Protobuf type {@code context.SliceId}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.SliceId)
-        context.ContextOuterClass.SliceIdOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.SliceId)
+        // @@protoc_insertion_point(builder_implements:context.SliceId)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_SliceId_descriptor;
@@ -37624,8 +37702,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface SliceOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Slice)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.Slice)
+    SliceOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.SliceId slice_id = 1;
@@ -37828,8 +37906,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Slice}
      */
-    public static final class Slice extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Slice)
-    SliceOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.Slice)
+    // @@protoc_insertion_point(message_implements:context.Slice)
+    Slice extends com.google.protobuf.GeneratedMessageV3 implements SliceOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -38497,8 +38576,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Slice}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Slice)
-        context.ContextOuterClass.SliceOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.Slice)
+        // @@protoc_insertion_point(builder_implements:context.Slice)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Slice_descriptor;
@@ -40603,8 +40683,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface SliceOwnerOrBuilder extends // @@protoc_insertion_point(interface_extends:context.SliceOwner)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.SliceOwner)
+    SliceOwnerOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid owner_uuid = 1;
@@ -40639,8 +40719,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.SliceOwner}
      */
-    public static final class SliceOwner extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.SliceOwner)
-    SliceOwnerOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.SliceOwner)
+    // @@protoc_insertion_point(message_implements:context.SliceOwner)
+    SliceOwner extends com.google.protobuf.GeneratedMessageV3 implements SliceOwnerOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -40892,8 +40973,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.SliceOwner}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.SliceOwner)
-        context.ContextOuterClass.SliceOwnerOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.SliceOwner)
+        // @@protoc_insertion_point(builder_implements:context.SliceOwner)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceOwnerOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_SliceOwner_descriptor;
@@ -41294,8 +41376,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface SliceStatusOrBuilder extends // @@protoc_insertion_point(interface_extends:context.SliceStatus)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.SliceStatus)
+    SliceStatusOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.SliceStatusEnum slice_status = 1;
@@ -41313,8 +41395,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.SliceStatus}
      */
-    public static final class SliceStatus extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.SliceStatus)
-    SliceStatusOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.SliceStatus)
+    // @@protoc_insertion_point(message_implements:context.SliceStatus)
+    SliceStatus extends com.google.protobuf.GeneratedMessageV3 implements SliceStatusOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -41505,8 +41588,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.SliceStatus}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.SliceStatus)
-        context.ContextOuterClass.SliceStatusOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.SliceStatus)
+        // @@protoc_insertion_point(builder_implements:context.SliceStatus)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceStatusOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_SliceStatus_descriptor;
@@ -41753,8 +41837,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface SliceConfigOrBuilder extends // @@protoc_insertion_point(interface_extends:context.SliceConfig)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.SliceConfig)
+    SliceConfigOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.ConfigRule config_rules = 1;
@@ -41785,8 +41869,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.SliceConfig}
      */
-    public static final class SliceConfig extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.SliceConfig)
-    SliceConfigOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.SliceConfig)
+    // @@protoc_insertion_point(message_implements:context.SliceConfig)
+    SliceConfig extends com.google.protobuf.GeneratedMessageV3 implements SliceConfigOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -42001,8 +42086,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.SliceConfig}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.SliceConfig)
-        context.ContextOuterClass.SliceConfigOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.SliceConfig)
+        // @@protoc_insertion_point(builder_implements:context.SliceConfig)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceConfigOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_SliceConfig_descriptor;
@@ -42469,8 +42555,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface SliceIdListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.SliceIdList)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.SliceIdList)
+    SliceIdListOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.SliceId slice_ids = 1;
@@ -42501,8 +42587,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.SliceIdList}
      */
-    public static final class SliceIdList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.SliceIdList)
-    SliceIdListOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.SliceIdList)
+    // @@protoc_insertion_point(message_implements:context.SliceIdList)
+    SliceIdList extends com.google.protobuf.GeneratedMessageV3 implements SliceIdListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -42717,8 +42804,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.SliceIdList}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.SliceIdList)
-        context.ContextOuterClass.SliceIdListOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.SliceIdList)
+        // @@protoc_insertion_point(builder_implements:context.SliceIdList)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceIdListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_SliceIdList_descriptor;
@@ -43185,8 +43273,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface SliceListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.SliceList)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.SliceList)
+    SliceListOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.Slice slices = 1;
@@ -43217,8 +43305,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.SliceList}
      */
-    public static final class SliceList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.SliceList)
-    SliceListOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.SliceList)
+    // @@protoc_insertion_point(message_implements:context.SliceList)
+    SliceList extends com.google.protobuf.GeneratedMessageV3 implements SliceListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -43433,8 +43522,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.SliceList}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.SliceList)
-        context.ContextOuterClass.SliceListOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.SliceList)
+        // @@protoc_insertion_point(builder_implements:context.SliceList)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_SliceList_descriptor;
@@ -43901,8 +43991,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface SliceFilterOrBuilder extends // @@protoc_insertion_point(interface_extends:context.SliceFilter)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.SliceFilter)
+    SliceFilterOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.SliceIdList slice_ids = 1;
@@ -43955,8 +44045,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.SliceFilter}
      */
-    public static final class SliceFilter extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.SliceFilter)
-    SliceFilterOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.SliceFilter)
+    // @@protoc_insertion_point(message_implements:context.SliceFilter)
+    SliceFilter extends com.google.protobuf.GeneratedMessageV3 implements SliceFilterOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -44274,8 +44365,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.SliceFilter}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.SliceFilter)
-        context.ContextOuterClass.SliceFilterOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.SliceFilter)
+        // @@protoc_insertion_point(builder_implements:context.SliceFilter)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceFilterOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_SliceFilter_descriptor;
@@ -44825,8 +44917,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface SliceEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.SliceEvent)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.SliceEvent)
+    SliceEventOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Event event = 1;
@@ -44866,8 +44958,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.SliceEvent}
      */
-    public static final class SliceEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.SliceEvent)
-    SliceEventOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.SliceEvent)
+    // @@protoc_insertion_point(message_implements:context.SliceEvent)
+    SliceEvent extends com.google.protobuf.GeneratedMessageV3 implements SliceEventOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -45116,8 +45209,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.SliceEvent}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.SliceEvent)
-        context.ContextOuterClass.SliceEventOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.SliceEvent)
+        // @@protoc_insertion_point(builder_implements:context.SliceEvent)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceEventOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_SliceEvent_descriptor;
@@ -45563,8 +45657,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface ConnectionIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionId)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.ConnectionId)
+    ConnectionIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid connection_uuid = 1;
@@ -45591,8 +45685,9 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.ConnectionId}
      */
-    public static final class ConnectionId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionId)
-    ConnectionIdOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.ConnectionId)
+    // @@protoc_insertion_point(message_implements:context.ConnectionId)
+    ConnectionId extends com.google.protobuf.GeneratedMessageV3 implements ConnectionIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -45799,8 +45894,9 @@ public final class ContextOuterClass {
          *
          * Protobuf type {@code context.ConnectionId}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionId)
-        context.ContextOuterClass.ConnectionIdOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionId)
+        // @@protoc_insertion_point(builder_implements:context.ConnectionId)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConnectionId_descriptor;
@@ -46110,8 +46206,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface ConnectionSettings_L0OrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L0)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L0)
+    ConnectionSettings_L0OrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * string lsp_symbolic_name = 1;
@@ -46129,8 +46225,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConnectionSettings_L0}
      */
-    public static final class ConnectionSettings_L0 extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L0)
-    ConnectionSettings_L0OrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L0)
+    // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L0)
+    ConnectionSettings_L0 extends com.google.protobuf.GeneratedMessageV3 implements ConnectionSettings_L0OrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -46336,8 +46433,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConnectionSettings_L0}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L0)
-        context.ContextOuterClass.ConnectionSettings_L0OrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L0)
+        // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L0)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionSettings_L0OrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConnectionSettings_L0_descriptor;
@@ -46602,8 +46700,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface ConnectionSettings_L2OrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L2)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L2)
+    ConnectionSettings_L2OrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * string src_mac_address = 1;
@@ -46657,8 +46755,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConnectionSettings_L2}
      */
-    public static final class ConnectionSettings_L2 extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L2)
-    ConnectionSettings_L2OrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L2)
+    // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L2)
+    ConnectionSettings_L2 extends com.google.protobuf.GeneratedMessageV3 implements ConnectionSettings_L2OrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -47005,8 +47104,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConnectionSettings_L2}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L2)
-        context.ContextOuterClass.ConnectionSettings_L2OrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L2)
+        // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L2)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionSettings_L2OrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConnectionSettings_L2_descriptor;
@@ -47554,8 +47654,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface ConnectionSettings_L3OrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L3)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L3)
+    ConnectionSettings_L3OrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * string src_ip_address = 1;
@@ -47603,8 +47703,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConnectionSettings_L3}
      */
-    public static final class ConnectionSettings_L3 extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L3)
-    ConnectionSettings_L3OrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L3)
+    // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L3)
+    ConnectionSettings_L3 extends com.google.protobuf.GeneratedMessageV3 implements ConnectionSettings_L3OrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -47928,8 +48029,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConnectionSettings_L3}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L3)
-        context.ContextOuterClass.ConnectionSettings_L3OrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L3)
+        // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L3)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionSettings_L3OrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConnectionSettings_L3_descriptor;
@@ -48429,8 +48531,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface ConnectionSettings_L4OrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L4)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L4)
+    ConnectionSettings_L4OrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * uint32 src_port = 1;
@@ -48460,8 +48562,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConnectionSettings_L4}
      */
-    public static final class ConnectionSettings_L4 extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L4)
-    ConnectionSettings_L4OrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L4)
+    // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L4)
+    ConnectionSettings_L4 extends com.google.protobuf.GeneratedMessageV3 implements ConnectionSettings_L4OrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -48710,8 +48813,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConnectionSettings_L4}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L4)
-        context.ContextOuterClass.ConnectionSettings_L4OrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L4)
+        // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L4)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionSettings_L4OrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConnectionSettings_L4_descriptor;
@@ -49077,8 +49181,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface ConnectionSettingsOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionSettings)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.ConnectionSettings)
+    ConnectionSettingsOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ConnectionSettings_L0 l0 = 1;
@@ -49152,8 +49256,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConnectionSettings}
      */
-    public static final class ConnectionSettings extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionSettings)
-    ConnectionSettingsOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.ConnectionSettings)
+    // @@protoc_insertion_point(message_implements:context.ConnectionSettings)
+    ConnectionSettings extends com.google.protobuf.GeneratedMessageV3 implements ConnectionSettingsOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -49494,8 +49599,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConnectionSettings}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionSettings)
-        context.ContextOuterClass.ConnectionSettingsOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionSettings)
+        // @@protoc_insertion_point(builder_implements:context.ConnectionSettings)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionSettingsOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConnectionSettings_descriptor;
@@ -50213,8 +50319,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface ConnectionOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Connection)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.Connection)
+    ConnectionOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ConnectionId connection_id = 1;
@@ -50321,8 +50427,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Connection}
      */
-    public static final class Connection extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Connection)
-    ConnectionOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.Connection)
+    // @@protoc_insertion_point(message_implements:context.Connection)
+    Connection extends com.google.protobuf.GeneratedMessageV3 implements ConnectionOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -50733,8 +50840,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Connection}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Connection)
-        context.ContextOuterClass.ConnectionOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.Connection)
+        // @@protoc_insertion_point(builder_implements:context.Connection)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Connection_descriptor;
@@ -51898,8 +52006,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface ConnectionIdListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionIdList)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.ConnectionIdList)
+    ConnectionIdListOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.ConnectionId connection_ids = 1;
@@ -51930,8 +52038,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConnectionIdList}
      */
-    public static final class ConnectionIdList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionIdList)
-    ConnectionIdListOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.ConnectionIdList)
+    // @@protoc_insertion_point(message_implements:context.ConnectionIdList)
+    ConnectionIdList extends com.google.protobuf.GeneratedMessageV3 implements ConnectionIdListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -52146,8 +52255,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConnectionIdList}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionIdList)
-        context.ContextOuterClass.ConnectionIdListOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionIdList)
+        // @@protoc_insertion_point(builder_implements:context.ConnectionIdList)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionIdListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConnectionIdList_descriptor;
@@ -52614,8 +52724,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface ConnectionListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionList)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.ConnectionList)
+    ConnectionListOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.Connection connections = 1;
@@ -52646,8 +52756,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConnectionList}
      */
-    public static final class ConnectionList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionList)
-    ConnectionListOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.ConnectionList)
+    // @@protoc_insertion_point(message_implements:context.ConnectionList)
+    ConnectionList extends com.google.protobuf.GeneratedMessageV3 implements ConnectionListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -52862,8 +52973,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConnectionList}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionList)
-        context.ContextOuterClass.ConnectionListOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionList)
+        // @@protoc_insertion_point(builder_implements:context.ConnectionList)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConnectionList_descriptor;
@@ -53330,8 +53442,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface ConnectionEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionEvent)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.ConnectionEvent)
+    ConnectionEventOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Event event = 1;
@@ -53371,8 +53483,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConnectionEvent}
      */
-    public static final class ConnectionEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionEvent)
-    ConnectionEventOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.ConnectionEvent)
+    // @@protoc_insertion_point(message_implements:context.ConnectionEvent)
+    ConnectionEvent extends com.google.protobuf.GeneratedMessageV3 implements ConnectionEventOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -53621,8 +53734,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConnectionEvent}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionEvent)
-        context.ContextOuterClass.ConnectionEventOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionEvent)
+        // @@protoc_insertion_point(builder_implements:context.ConnectionEvent)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionEventOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConnectionEvent_descriptor;
@@ -54068,8 +54182,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface EndPointIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.EndPointId)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.EndPointId)
+    EndPointIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.TopologyId topology_id = 1;
@@ -54130,8 +54244,9 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.EndPointId}
      */
-    public static final class EndPointId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.EndPointId)
-    EndPointIdOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.EndPointId)
+    // @@protoc_insertion_point(message_implements:context.EndPointId)
+    EndPointId extends com.google.protobuf.GeneratedMessageV3 implements EndPointIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -54430,8 +54545,9 @@ public final class ContextOuterClass {
          *
          * Protobuf type {@code context.EndPointId}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.EndPointId)
-        context.ContextOuterClass.EndPointIdOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.EndPointId)
+        // @@protoc_insertion_point(builder_implements:context.EndPointId)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.EndPointIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_EndPointId_descriptor;
@@ -55013,8 +55129,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface EndPointOrBuilder extends // @@protoc_insertion_point(interface_extends:context.EndPoint)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.EndPoint)
+    EndPointOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.EndPointId endpoint_id = 1;
@@ -55143,8 +55259,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.EndPoint}
      */
-    public static final class EndPoint extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.EndPoint)
-    EndPointOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.EndPoint)
+    // @@protoc_insertion_point(message_implements:context.EndPoint)
+    EndPoint extends com.google.protobuf.GeneratedMessageV3 implements EndPointOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -55680,8 +55797,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.EndPoint}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.EndPoint)
-        context.ContextOuterClass.EndPointOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.EndPoint)
+        // @@protoc_insertion_point(builder_implements:context.EndPoint)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.EndPointOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_EndPoint_descriptor;
@@ -56664,8 +56782,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface EndPointNameOrBuilder extends // @@protoc_insertion_point(interface_extends:context.EndPointName)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.EndPointName)
+    EndPointNameOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.EndPointId endpoint_id = 1;
@@ -56724,8 +56842,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.EndPointName}
      */
-    public static final class EndPointName extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.EndPointName)
-    EndPointNameOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.EndPointName)
+    // @@protoc_insertion_point(message_implements:context.EndPointName)
+    EndPointName extends com.google.protobuf.GeneratedMessageV3 implements EndPointNameOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -57075,8 +57194,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.EndPointName}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.EndPointName)
-        context.ContextOuterClass.EndPointNameOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.EndPointName)
+        // @@protoc_insertion_point(builder_implements:context.EndPointName)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.EndPointNameOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_EndPointName_descriptor;
@@ -57659,8 +57779,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface EndPointIdListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.EndPointIdList)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.EndPointIdList)
+    EndPointIdListOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.EndPointId endpoint_ids = 1;
@@ -57691,8 +57811,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.EndPointIdList}
      */
-    public static final class EndPointIdList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.EndPointIdList)
-    EndPointIdListOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.EndPointIdList)
+    // @@protoc_insertion_point(message_implements:context.EndPointIdList)
+    EndPointIdList extends com.google.protobuf.GeneratedMessageV3 implements EndPointIdListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -57907,8 +58028,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.EndPointIdList}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.EndPointIdList)
-        context.ContextOuterClass.EndPointIdListOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.EndPointIdList)
+        // @@protoc_insertion_point(builder_implements:context.EndPointIdList)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.EndPointIdListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_EndPointIdList_descriptor;
@@ -58375,8 +58497,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface EndPointNameListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.EndPointNameList)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.EndPointNameList)
+    EndPointNameListOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.EndPointName endpoint_names = 1;
@@ -58407,8 +58529,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.EndPointNameList}
      */
-    public static final class EndPointNameList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.EndPointNameList)
-    EndPointNameListOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.EndPointNameList)
+    // @@protoc_insertion_point(message_implements:context.EndPointNameList)
+    EndPointNameList extends com.google.protobuf.GeneratedMessageV3 implements EndPointNameListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -58623,8 +58746,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.EndPointNameList}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.EndPointNameList)
-        context.ContextOuterClass.EndPointNameListOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.EndPointNameList)
+        // @@protoc_insertion_point(builder_implements:context.EndPointNameList)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.EndPointNameListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_EndPointNameList_descriptor;
@@ -59091,8 +59215,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface ConfigRule_CustomOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConfigRule_Custom)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.ConfigRule_Custom)
+    ConfigRule_CustomOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * string resource_key = 1;
@@ -59122,8 +59246,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConfigRule_Custom}
      */
-    public static final class ConfigRule_Custom extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConfigRule_Custom)
-    ConfigRule_CustomOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.ConfigRule_Custom)
+    // @@protoc_insertion_point(message_implements:context.ConfigRule_Custom)
+    ConfigRule_Custom extends com.google.protobuf.GeneratedMessageV3 implements ConfigRule_CustomOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -59378,8 +59503,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConfigRule_Custom}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConfigRule_Custom)
-        context.ContextOuterClass.ConfigRule_CustomOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.ConfigRule_Custom)
+        // @@protoc_insertion_point(builder_implements:context.ConfigRule_Custom)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConfigRule_CustomOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConfigRule_Custom_descriptor;
@@ -59735,8 +59861,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface ConfigRule_ACLOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConfigRule_ACL)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.ConfigRule_ACL)
+    ConfigRule_ACLOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.EndPointId endpoint_id = 1;
@@ -59776,8 +59902,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConfigRule_ACL}
      */
-    public static final class ConfigRule_ACL extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConfigRule_ACL)
-    ConfigRule_ACLOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.ConfigRule_ACL)
+    // @@protoc_insertion_point(message_implements:context.ConfigRule_ACL)
+    ConfigRule_ACL extends com.google.protobuf.GeneratedMessageV3 implements ConfigRule_ACLOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -60026,8 +60153,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConfigRule_ACL}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConfigRule_ACL)
-        context.ContextOuterClass.ConfigRule_ACLOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.ConfigRule_ACL)
+        // @@protoc_insertion_point(builder_implements:context.ConfigRule_ACL)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConfigRule_ACLOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConfigRule_ACL_descriptor;
@@ -60473,8 +60601,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface ConfigRule_IP_LINKOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConfigRule_IP_LINK)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.ConfigRule_IP_LINK)
+    ConfigRule_IP_LINKOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.EndPointId endpoint_id = 1;
@@ -60514,8 +60642,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConfigRule_IP_LINK}
      */
-    public static final class ConfigRule_IP_LINK extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConfigRule_IP_LINK)
-    ConfigRule_IP_LINKOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.ConfigRule_IP_LINK)
+    // @@protoc_insertion_point(message_implements:context.ConfigRule_IP_LINK)
+    ConfigRule_IP_LINK extends com.google.protobuf.GeneratedMessageV3 implements ConfigRule_IP_LINKOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -60764,8 +60893,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConfigRule_IP_LINK}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConfigRule_IP_LINK)
-        context.ContextOuterClass.ConfigRule_IP_LINKOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.ConfigRule_IP_LINK)
+        // @@protoc_insertion_point(builder_implements:context.ConfigRule_IP_LINK)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConfigRule_IP_LINKOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConfigRule_IP_LINK_descriptor;
@@ -61211,8 +61341,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface ConfigRuleOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConfigRule)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.ConfigRule)
+    ConfigRuleOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ConfigActionEnum action = 1;
@@ -61283,8 +61413,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConfigRule}
      */
-    public static final class ConfigRule extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConfigRule)
-    ConfigRuleOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.ConfigRule)
+    // @@protoc_insertion_point(message_implements:context.ConfigRule)
+    ConfigRule extends com.google.protobuf.GeneratedMessageV3 implements ConfigRuleOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -61678,8 +61809,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConfigRule}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConfigRule)
-        context.ContextOuterClass.ConfigRuleOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.ConfigRule)
+        // @@protoc_insertion_point(builder_implements:context.ConfigRule)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConfigRuleOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConfigRule_descriptor;
@@ -62432,8 +62564,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface Constraint_CustomOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_Custom)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.Constraint_Custom)
+    Constraint_CustomOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * string constraint_type = 1;
@@ -62463,8 +62595,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Constraint_Custom}
      */
-    public static final class Constraint_Custom extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_Custom)
-    Constraint_CustomOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.Constraint_Custom)
+    // @@protoc_insertion_point(message_implements:context.Constraint_Custom)
+    Constraint_Custom extends com.google.protobuf.GeneratedMessageV3 implements Constraint_CustomOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -62719,8 +62852,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Constraint_Custom}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_Custom)
-        context.ContextOuterClass.Constraint_CustomOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_Custom)
+        // @@protoc_insertion_point(builder_implements:context.Constraint_Custom)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_CustomOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Constraint_Custom_descriptor;
@@ -63076,8 +63210,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface Constraint_ScheduleOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_Schedule)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.Constraint_Schedule)
+    Constraint_ScheduleOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * double start_timestamp = 1;
@@ -63095,8 +63229,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Constraint_Schedule}
      */
-    public static final class Constraint_Schedule extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_Schedule)
-    Constraint_ScheduleOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.Constraint_Schedule)
+    // @@protoc_insertion_point(message_implements:context.Constraint_Schedule)
+    Constraint_Schedule extends com.google.protobuf.GeneratedMessageV3 implements Constraint_ScheduleOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -63299,8 +63434,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Constraint_Schedule}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_Schedule)
-        context.ContextOuterClass.Constraint_ScheduleOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_Schedule)
+        // @@protoc_insertion_point(builder_implements:context.Constraint_Schedule)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_ScheduleOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Constraint_Schedule_descriptor;
@@ -63570,8 +63706,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface GPS_PositionOrBuilder extends // @@protoc_insertion_point(interface_extends:context.GPS_Position)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.GPS_Position)
+    GPS_PositionOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * float latitude = 1;
@@ -63589,8 +63725,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.GPS_Position}
      */
-    public static final class GPS_Position extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.GPS_Position)
-    GPS_PositionOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.GPS_Position)
+    // @@protoc_insertion_point(message_implements:context.GPS_Position)
+    GPS_Position extends com.google.protobuf.GeneratedMessageV3 implements GPS_PositionOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -63793,8 +63930,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.GPS_Position}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.GPS_Position)
-        context.ContextOuterClass.GPS_PositionOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.GPS_Position)
+        // @@protoc_insertion_point(builder_implements:context.GPS_Position)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.GPS_PositionOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_GPS_Position_descriptor;
@@ -64064,8 +64202,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface LocationOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Location)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.Location)
+    LocationOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * string region = 1;
@@ -64144,8 +64282,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Location}
      */
-    public static final class Location extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Location)
-    LocationOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.Location)
+    // @@protoc_insertion_point(message_implements:context.Location)
+    Location extends com.google.protobuf.GeneratedMessageV3 implements LocationOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -64606,8 +64745,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Location}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Location)
-        context.ContextOuterClass.LocationOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.Location)
+        // @@protoc_insertion_point(builder_implements:context.Location)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.LocationOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Location_descriptor;
@@ -65302,8 +65442,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface Constraint_EndPointLocationOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_EndPointLocation)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.Constraint_EndPointLocation)
+    Constraint_EndPointLocationOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.EndPointId endpoint_id = 1;
@@ -65343,8 +65483,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Constraint_EndPointLocation}
      */
-    public static final class Constraint_EndPointLocation extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_EndPointLocation)
-    Constraint_EndPointLocationOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.Constraint_EndPointLocation)
+    // @@protoc_insertion_point(message_implements:context.Constraint_EndPointLocation)
+    Constraint_EndPointLocation extends com.google.protobuf.GeneratedMessageV3 implements Constraint_EndPointLocationOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -65593,8 +65734,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Constraint_EndPointLocation}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_EndPointLocation)
-        context.ContextOuterClass.Constraint_EndPointLocationOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_EndPointLocation)
+        // @@protoc_insertion_point(builder_implements:context.Constraint_EndPointLocation)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_EndPointLocationOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Constraint_EndPointLocation_descriptor;
@@ -66040,8 +66182,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface Constraint_EndPointPriorityOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_EndPointPriority)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.Constraint_EndPointPriority)
+    Constraint_EndPointPriorityOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.EndPointId endpoint_id = 1;
@@ -66070,8 +66212,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Constraint_EndPointPriority}
      */
-    public static final class Constraint_EndPointPriority extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_EndPointPriority)
-    Constraint_EndPointPriorityOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.Constraint_EndPointPriority)
+    // @@protoc_insertion_point(message_implements:context.Constraint_EndPointPriority)
+    Constraint_EndPointPriority extends com.google.protobuf.GeneratedMessageV3 implements Constraint_EndPointPriorityOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -66297,8 +66440,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Constraint_EndPointPriority}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_EndPointPriority)
-        context.ContextOuterClass.Constraint_EndPointPriorityOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_EndPointPriority)
+        // @@protoc_insertion_point(builder_implements:context.Constraint_EndPointPriority)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_EndPointPriorityOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Constraint_EndPointPriority_descriptor;
@@ -66656,8 +66800,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface Constraint_SLA_LatencyOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Latency)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Latency)
+    Constraint_SLA_LatencyOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * float e2e_latency_ms = 1;
@@ -66669,8 +66813,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Constraint_SLA_Latency}
      */
-    public static final class Constraint_SLA_Latency extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Latency)
-    Constraint_SLA_LatencyOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Latency)
+    // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Latency)
+    Constraint_SLA_Latency extends com.google.protobuf.GeneratedMessageV3 implements Constraint_SLA_LatencyOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -66850,8 +66995,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Constraint_SLA_Latency}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Latency)
-        context.ContextOuterClass.Constraint_SLA_LatencyOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Latency)
+        // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Latency)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_SLA_LatencyOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Constraint_SLA_Latency_descriptor;
@@ -67073,8 +67219,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface Constraint_SLA_CapacityOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Capacity)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Capacity)
+    Constraint_SLA_CapacityOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * float capacity_gbps = 1;
@@ -67086,8 +67232,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Constraint_SLA_Capacity}
      */
-    public static final class Constraint_SLA_Capacity extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Capacity)
-    Constraint_SLA_CapacityOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Capacity)
+    // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Capacity)
+    Constraint_SLA_Capacity extends com.google.protobuf.GeneratedMessageV3 implements Constraint_SLA_CapacityOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -67267,8 +67414,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Constraint_SLA_Capacity}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Capacity)
-        context.ContextOuterClass.Constraint_SLA_CapacityOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Capacity)
+        // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Capacity)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_SLA_CapacityOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Constraint_SLA_Capacity_descriptor;
@@ -67490,8 +67638,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface Constraint_SLA_AvailabilityOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Availability)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Availability)
+    Constraint_SLA_AvailabilityOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * uint32 num_disjoint_paths = 1;
@@ -67519,8 +67667,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Constraint_SLA_Availability}
      */
-    public static final class Constraint_SLA_Availability extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Availability)
-    Constraint_SLA_AvailabilityOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Availability)
+    // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Availability)
+    Constraint_SLA_Availability extends com.google.protobuf.GeneratedMessageV3 implements Constraint_SLA_AvailabilityOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -67750,8 +67899,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Constraint_SLA_Availability}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Availability)
-        context.ContextOuterClass.Constraint_SLA_AvailabilityOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Availability)
+        // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Availability)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_SLA_AvailabilityOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Constraint_SLA_Availability_descriptor;
@@ -68081,8 +68231,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface Constraint_SLA_Isolation_levelOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Isolation_level)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Isolation_level)
+    Constraint_SLA_Isolation_levelOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.IsolationLevelEnum isolation_level = 1;
@@ -68120,8 +68270,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Constraint_SLA_Isolation_level}
      */
-    public static final class Constraint_SLA_Isolation_level extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Isolation_level)
-    Constraint_SLA_Isolation_levelOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Isolation_level)
+    // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Isolation_level)
+    Constraint_SLA_Isolation_level extends com.google.protobuf.GeneratedMessageV3 implements Constraint_SLA_Isolation_levelOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -68367,8 +68518,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Constraint_SLA_Isolation_level}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Isolation_level)
-        context.ContextOuterClass.Constraint_SLA_Isolation_levelOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Isolation_level)
+        // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Isolation_level)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_SLA_Isolation_levelOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Constraint_SLA_Isolation_level_descriptor;
@@ -68730,8 +68882,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface Constraint_ExclusionsOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_Exclusions)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.Constraint_Exclusions)
+    Constraint_ExclusionsOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * bool is_permanent = 1;
@@ -68818,8 +68970,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Constraint_Exclusions}
      */
-    public static final class Constraint_Exclusions extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_Exclusions)
-    Constraint_ExclusionsOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.Constraint_Exclusions)
+    // @@protoc_insertion_point(message_implements:context.Constraint_Exclusions)
+    Constraint_Exclusions extends com.google.protobuf.GeneratedMessageV3 implements Constraint_ExclusionsOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -69173,8 +69326,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Constraint_Exclusions}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_Exclusions)
-        context.ContextOuterClass.Constraint_ExclusionsOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_Exclusions)
+        // @@protoc_insertion_point(builder_implements:context.Constraint_Exclusions)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_ExclusionsOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Constraint_Exclusions_descriptor;
@@ -70267,8 +70421,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface QoSProfileIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.QoSProfileId)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.QoSProfileId)
+    QoSProfileIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid qos_profile_id = 1;
@@ -70291,8 +70445,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.QoSProfileId}
      */
-    public static final class QoSProfileId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.QoSProfileId)
-    QoSProfileIdOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.QoSProfileId)
+    // @@protoc_insertion_point(message_implements:context.QoSProfileId)
+    QoSProfileId extends com.google.protobuf.GeneratedMessageV3 implements QoSProfileIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -70495,8 +70650,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.QoSProfileId}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.QoSProfileId)
-        context.ContextOuterClass.QoSProfileIdOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.QoSProfileId)
+        // @@protoc_insertion_point(builder_implements:context.QoSProfileId)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.QoSProfileIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_QoSProfileId_descriptor;
@@ -70806,8 +70962,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface Constraint_QoSProfileOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_QoSProfile)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.Constraint_QoSProfile)
+    Constraint_QoSProfileOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.QoSProfileId qos_profile_id = 1;
@@ -70842,8 +70998,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Constraint_QoSProfile}
      */
-    public static final class Constraint_QoSProfile extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_QoSProfile)
-    Constraint_QoSProfileOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.Constraint_QoSProfile)
+    // @@protoc_insertion_point(message_implements:context.Constraint_QoSProfile)
+    Constraint_QoSProfile extends com.google.protobuf.GeneratedMessageV3 implements Constraint_QoSProfileOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -71095,8 +71252,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Constraint_QoSProfile}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_QoSProfile)
-        context.ContextOuterClass.Constraint_QoSProfileOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_QoSProfile)
+        // @@protoc_insertion_point(builder_implements:context.Constraint_QoSProfile)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_QoSProfileOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Constraint_QoSProfile_descriptor;
@@ -71497,8 +71655,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface ConstraintOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.Constraint)
+    ConstraintOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ConstraintActionEnum action = 1;
@@ -71688,8 +71846,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Constraint}
      */
-    public static final class Constraint extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint)
-    ConstraintOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.Constraint)
+    // @@protoc_insertion_point(message_implements:context.Constraint)
+    Constraint extends com.google.protobuf.GeneratedMessageV3 implements ConstraintOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -72443,8 +72602,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Constraint}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint)
-        context.ContextOuterClass.ConstraintOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.Constraint)
+        // @@protoc_insertion_point(builder_implements:context.Constraint)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConstraintOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Constraint_descriptor;
@@ -74310,8 +74470,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface TeraFlowControllerOrBuilder extends // @@protoc_insertion_point(interface_extends:context.TeraFlowController)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.TeraFlowController)
+    TeraFlowControllerOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ContextId context_id = 1;
@@ -74356,8 +74516,9 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.TeraFlowController}
      */
-    public static final class TeraFlowController extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.TeraFlowController)
-    TeraFlowControllerOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.TeraFlowController)
+    // @@protoc_insertion_point(message_implements:context.TeraFlowController)
+    TeraFlowController extends com.google.protobuf.GeneratedMessageV3 implements TeraFlowControllerOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -74636,8 +74797,9 @@ public final class ContextOuterClass {
          *
          * Protobuf type {@code context.TeraFlowController}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.TeraFlowController)
-        context.ContextOuterClass.TeraFlowControllerOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.TeraFlowController)
+        // @@protoc_insertion_point(builder_implements:context.TeraFlowController)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.TeraFlowControllerOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_TeraFlowController_descriptor;
@@ -75086,8 +75248,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface AuthenticationResultOrBuilder extends // @@protoc_insertion_point(interface_extends:context.AuthenticationResult)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.AuthenticationResult)
+    AuthenticationResultOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ContextId context_id = 1;
@@ -75116,8 +75278,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.AuthenticationResult}
      */
-    public static final class AuthenticationResult extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.AuthenticationResult)
-    AuthenticationResultOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.AuthenticationResult)
+    // @@protoc_insertion_point(message_implements:context.AuthenticationResult)
+    AuthenticationResult extends com.google.protobuf.GeneratedMessageV3 implements AuthenticationResultOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -75343,8 +75506,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.AuthenticationResult}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.AuthenticationResult)
-        context.ContextOuterClass.AuthenticationResultOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.AuthenticationResult)
+        // @@protoc_insertion_point(builder_implements:context.AuthenticationResult)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.AuthenticationResultOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_AuthenticationResult_descriptor;
@@ -75702,8 +75866,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface OpticalConfigIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalConfigId)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.OpticalConfigId)
+    OpticalConfigIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * string opticalconfig_uuid = 1;
@@ -75725,8 +75889,9 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.OpticalConfigId}
      */
-    public static final class OpticalConfigId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalConfigId)
-    OpticalConfigIdOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.OpticalConfigId)
+    // @@protoc_insertion_point(message_implements:context.OpticalConfigId)
+    OpticalConfigId extends com.google.protobuf.GeneratedMessageV3 implements OpticalConfigIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -75936,8 +76101,9 @@ public final class ContextOuterClass {
          *
          * 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 {
+        public static final class // @@protoc_insertion_point(builder_implements:context.OpticalConfigId)
+        // @@protoc_insertion_point(builder_implements:context.OpticalConfigId)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalConfigIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_OpticalConfigId_descriptor;
@@ -76202,8 +76368,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface OpticalConfigOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalConfig)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.OpticalConfig)
+    OpticalConfigOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.OpticalConfigId opticalconfig_id = 1;
@@ -76255,8 +76421,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.OpticalConfig}
      */
-    public static final class OpticalConfig extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalConfig)
-    OpticalConfigOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.OpticalConfig)
+    // @@protoc_insertion_point(message_implements:context.OpticalConfig)
+    OpticalConfig extends com.google.protobuf.GeneratedMessageV3 implements OpticalConfigOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -76554,8 +76721,9 @@ public final class ContextOuterClass {
         /**
          * 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 class // @@protoc_insertion_point(builder_implements:context.OpticalConfig)
+        // @@protoc_insertion_point(builder_implements:context.OpticalConfig)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalConfigOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_OpticalConfig_descriptor;
@@ -77092,8 +77260,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface OpticalConfigListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalConfigList)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.OpticalConfigList)
+    OpticalConfigListOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.OpticalConfig opticalconfigs = 1;
@@ -77124,8 +77292,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.OpticalConfigList}
      */
-    public static final class OpticalConfigList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalConfigList)
-    OpticalConfigListOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.OpticalConfigList)
+    // @@protoc_insertion_point(message_implements:context.OpticalConfigList)
+    OpticalConfigList extends com.google.protobuf.GeneratedMessageV3 implements OpticalConfigListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -77340,8 +77509,9 @@ public final class ContextOuterClass {
         /**
          * 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 class // @@protoc_insertion_point(builder_implements:context.OpticalConfigList)
+        // @@protoc_insertion_point(builder_implements:context.OpticalConfigList)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalConfigListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_OpticalConfigList_descriptor;
@@ -77808,8 +77978,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface OpticalConfigEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalConfigEvent)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.OpticalConfigEvent)
+    OpticalConfigEventOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Event event = 1;
@@ -77849,8 +78019,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.OpticalConfigEvent}
      */
-    public static final class OpticalConfigEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalConfigEvent)
-    OpticalConfigEventOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.OpticalConfigEvent)
+    // @@protoc_insertion_point(message_implements:context.OpticalConfigEvent)
+    OpticalConfigEvent extends com.google.protobuf.GeneratedMessageV3 implements OpticalConfigEventOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -78099,8 +78270,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.OpticalConfigEvent}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalConfigEvent)
-        context.ContextOuterClass.OpticalConfigEventOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.OpticalConfigEvent)
+        // @@protoc_insertion_point(builder_implements:context.OpticalConfigEvent)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalConfigEventOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_OpticalConfigEvent_descriptor;
@@ -78546,8 +78718,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface OpticalEndPointIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalEndPointId)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.OpticalEndPointId)
+    OpticalEndPointIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.DeviceId device_id = 2;
@@ -78587,8 +78759,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.OpticalEndPointId}
      */
-    public static final class OpticalEndPointId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalEndPointId)
-    OpticalEndPointIdOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.OpticalEndPointId)
+    // @@protoc_insertion_point(message_implements:context.OpticalEndPointId)
+    OpticalEndPointId extends com.google.protobuf.GeneratedMessageV3 implements OpticalEndPointIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -78837,8 +79010,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.OpticalEndPointId}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalEndPointId)
-        context.ContextOuterClass.OpticalEndPointIdOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.OpticalEndPointId)
+        // @@protoc_insertion_point(builder_implements:context.OpticalEndPointId)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalEndPointIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_OpticalEndPointId_descriptor;
@@ -79284,8 +79458,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface OpticalLinkListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalLinkList)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.OpticalLinkList)
+    OpticalLinkListOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.OpticalLink optical_links = 1;
@@ -79316,8 +79490,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.OpticalLinkList}
      */
-    public static final class OpticalLinkList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalLinkList)
-    OpticalLinkListOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.OpticalLinkList)
+    // @@protoc_insertion_point(message_implements:context.OpticalLinkList)
+    OpticalLinkList extends com.google.protobuf.GeneratedMessageV3 implements OpticalLinkListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -79532,8 +79707,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.OpticalLinkList}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalLinkList)
-        context.ContextOuterClass.OpticalLinkListOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.OpticalLinkList)
+        // @@protoc_insertion_point(builder_implements:context.OpticalLinkList)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalLinkListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_OpticalLinkList_descriptor;
@@ -80000,8 +80176,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface OpticalLinkDetailsOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalLinkDetails)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.OpticalLinkDetails)
+    OpticalLinkDetailsOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * float length = 1;
@@ -80160,8 +80336,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.OpticalLinkDetails}
      */
-    public static final class OpticalLinkDetails extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalLinkDetails)
-    OpticalLinkDetailsOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.OpticalLinkDetails)
+    // @@protoc_insertion_point(message_implements:context.OpticalLinkDetails)
+    OpticalLinkDetails extends com.google.protobuf.GeneratedMessageV3 implements OpticalLinkDetailsOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -80836,8 +81013,9 @@ public final class ContextOuterClass {
         /**
          * 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 class // @@protoc_insertion_point(builder_implements:context.OpticalLinkDetails)
+        // @@protoc_insertion_point(builder_implements:context.OpticalLinkDetails)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalLinkDetailsOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_OpticalLinkDetails_descriptor;
@@ -81925,8 +82103,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface OpticalLinkOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalLink)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.OpticalLink)
+    OpticalLinkOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * string name = 1;
@@ -82003,8 +82181,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.OpticalLink}
      */
-    public static final class OpticalLink extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalLink)
-    OpticalLinkOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.OpticalLink)
+    // @@protoc_insertion_point(message_implements:context.OpticalLink)
+    OpticalLink extends com.google.protobuf.GeneratedMessageV3 implements OpticalLinkOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -82360,8 +82539,9 @@ public final class ContextOuterClass {
         /**
          * 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 class // @@protoc_insertion_point(builder_implements:context.OpticalLink)
+        // @@protoc_insertion_point(builder_implements:context.OpticalLink)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalLinkOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_OpticalLink_descriptor;
@@ -83191,8 +83371,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface ChannelIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ChannelId)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.ChannelId)
+    ChannelIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid channel_uuid = 1;
@@ -83215,8 +83395,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ChannelId}
      */
-    public static final class ChannelId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ChannelId)
-    ChannelIdOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.ChannelId)
+    // @@protoc_insertion_point(message_implements:context.ChannelId)
+    ChannelId extends com.google.protobuf.GeneratedMessageV3 implements ChannelIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -83419,8 +83600,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ChannelId}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ChannelId)
-        context.ContextOuterClass.ChannelIdOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.ChannelId)
+        // @@protoc_insertion_point(builder_implements:context.ChannelId)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ChannelIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ChannelId_descriptor;
@@ -83730,8 +83912,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface OpticalBandIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalBandId)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.OpticalBandId)
+    OpticalBandIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid opticalband_uuid = 1;
@@ -83754,8 +83936,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.OpticalBandId}
      */
-    public static final class OpticalBandId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalBandId)
-    OpticalBandIdOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.OpticalBandId)
+    // @@protoc_insertion_point(message_implements:context.OpticalBandId)
+    OpticalBandId extends com.google.protobuf.GeneratedMessageV3 implements OpticalBandIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -83958,8 +84141,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.OpticalBandId}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalBandId)
-        context.ContextOuterClass.OpticalBandIdOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.OpticalBandId)
+        // @@protoc_insertion_point(builder_implements:context.OpticalBandId)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalBandIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_OpticalBandId_descriptor;
@@ -84269,8 +84453,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface OpticalBandOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalBand)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.OpticalBand)
+    OpticalBandOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.OpticalBandId opticalband_id = 1;
@@ -84398,8 +84582,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.OpticalBand}
      */
-    public static final class OpticalBand extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalBand)
-    OpticalBandOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.OpticalBand)
+    // @@protoc_insertion_point(message_implements:context.OpticalBand)
+    OpticalBand extends com.google.protobuf.GeneratedMessageV3 implements OpticalBandOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -84960,8 +85145,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.OpticalBand}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalBand)
-        context.ContextOuterClass.OpticalBandOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.OpticalBand)
+        // @@protoc_insertion_point(builder_implements:context.OpticalBand)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalBandOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_OpticalBand_descriptor;
@@ -86137,8 +86323,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface OpticalBandListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalBandList)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.OpticalBandList)
+    OpticalBandListOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.OpticalBand opticalbands = 1;
@@ -86169,8 +86355,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.OpticalBandList}
      */
-    public static final class OpticalBandList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalBandList)
-    OpticalBandListOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.OpticalBandList)
+    // @@protoc_insertion_point(message_implements:context.OpticalBandList)
+    OpticalBandList extends com.google.protobuf.GeneratedMessageV3 implements OpticalBandListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -86385,8 +86572,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.OpticalBandList}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalBandList)
-        context.ContextOuterClass.OpticalBandListOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.OpticalBandList)
+        // @@protoc_insertion_point(builder_implements:context.OpticalBandList)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalBandListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_OpticalBandList_descriptor;
@@ -86853,8 +87041,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface ServiceConfigRuleOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ServiceConfigRule)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:context.ServiceConfigRule)
+    ServiceConfigRuleOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ServiceId service_id = 1;
@@ -86894,8 +87082,9 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ServiceConfigRule}
      */
-    public static final class ServiceConfigRule extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ServiceConfigRule)
-    ServiceConfigRuleOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:context.ServiceConfigRule)
+    // @@protoc_insertion_point(message_implements:context.ServiceConfigRule)
+    ServiceConfigRule extends com.google.protobuf.GeneratedMessageV3 implements ServiceConfigRuleOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -87144,8 +87333,9 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ServiceConfigRule}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ServiceConfigRule)
-        context.ContextOuterClass.ServiceConfigRuleOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:context.ServiceConfigRule)
+        // @@protoc_insertion_point(builder_implements:context.ServiceConfigRule)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceConfigRuleOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ServiceConfigRule_descriptor;
diff --git a/src/ztp/target/generated-sources/grpc/device/Device.java b/src/ztp/target/generated-sources/grpc/device/Device.java
index 87c434732..2390aa92d 100644
--- a/src/ztp/target/generated-sources/grpc/device/Device.java
+++ b/src/ztp/target/generated-sources/grpc/device/Device.java
@@ -14,8 +14,8 @@ public final class Device {
         registerAllExtensions((com.google.protobuf.ExtensionRegistryLite) registry);
     }
 
-    public interface MonitoringSettingsOrBuilder extends // @@protoc_insertion_point(interface_extends:device.MonitoringSettings)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:device.MonitoringSettings)
+    MonitoringSettingsOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * 
@@ -91,8 +91,9 @@ public final class Device {
     /**
      * Protobuf type {@code device.MonitoringSettings}
      */
-    public static final class MonitoringSettings extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:device.MonitoringSettings)
-    MonitoringSettingsOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:device.MonitoringSettings)
+    // @@protoc_insertion_point(message_implements:device.MonitoringSettings)
+    MonitoringSettings extends com.google.protobuf.GeneratedMessageV3 implements MonitoringSettingsOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -411,8 +412,9 @@ public final class Device {
         /**
          * Protobuf type {@code device.MonitoringSettings}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:device.MonitoringSettings)
-        device.Device.MonitoringSettingsOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:device.MonitoringSettings)
+        // @@protoc_insertion_point(builder_implements:device.MonitoringSettings)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements device.Device.MonitoringSettingsOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return device.Device.internal_static_device_MonitoringSettings_descriptor;
diff --git a/src/ztp/target/generated-sources/grpc/ip_link/IpLink.java b/src/ztp/target/generated-sources/grpc/ip_link/IpLink.java
index 865a27401..6b89ffcef 100644
--- a/src/ztp/target/generated-sources/grpc/ip_link/IpLink.java
+++ b/src/ztp/target/generated-sources/grpc/ip_link/IpLink.java
@@ -14,8 +14,8 @@ public final class IpLink {
         registerAllExtensions((com.google.protobuf.ExtensionRegistryLite) registry);
     }
 
-    public interface IpLinkRuleSetOrBuilder extends // @@protoc_insertion_point(interface_extends:ip_link.IpLinkRuleSet)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:ip_link.IpLinkRuleSet)
+    IpLinkRuleSetOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * string ip = 1;
@@ -57,8 +57,9 @@ public final class IpLink {
     /**
      * Protobuf type {@code ip_link.IpLinkRuleSet}
      */
-    public static final class IpLinkRuleSet extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:ip_link.IpLinkRuleSet)
-    IpLinkRuleSetOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:ip_link.IpLinkRuleSet)
+    // @@protoc_insertion_point(message_implements:ip_link.IpLinkRuleSet)
+    IpLinkRuleSet extends com.google.protobuf.GeneratedMessageV3 implements IpLinkRuleSetOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -362,8 +363,9 @@ public final class IpLink {
         /**
          * Protobuf type {@code ip_link.IpLinkRuleSet}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:ip_link.IpLinkRuleSet)
-        ip_link.IpLink.IpLinkRuleSetOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:ip_link.IpLinkRuleSet)
+        // @@protoc_insertion_point(builder_implements:ip_link.IpLinkRuleSet)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements ip_link.IpLink.IpLinkRuleSetOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return ip_link.IpLink.internal_static_ip_link_IpLinkRuleSet_descriptor;
diff --git a/src/ztp/target/generated-sources/grpc/monitoring/Monitoring.java b/src/ztp/target/generated-sources/grpc/monitoring/Monitoring.java
index 8394fe275..ddd75a0db 100644
--- a/src/ztp/target/generated-sources/grpc/monitoring/Monitoring.java
+++ b/src/ztp/target/generated-sources/grpc/monitoring/Monitoring.java
@@ -14,8 +14,8 @@ public final class Monitoring {
         registerAllExtensions((com.google.protobuf.ExtensionRegistryLite) registry);
     }
 
-    public interface KpiDescriptorOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.KpiDescriptor)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.KpiDescriptor)
+    KpiDescriptorOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.KpiId kpi_id = 1;
@@ -189,8 +189,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.KpiDescriptor}
      */
-    public static final class KpiDescriptor extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.KpiDescriptor)
-    KpiDescriptorOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.KpiDescriptor)
+    // @@protoc_insertion_point(message_implements:monitoring.KpiDescriptor)
+    KpiDescriptor extends com.google.protobuf.GeneratedMessageV3 implements KpiDescriptorOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -810,8 +811,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.KpiDescriptor}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.KpiDescriptor)
-        monitoring.Monitoring.KpiDescriptorOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.KpiDescriptor)
+        // @@protoc_insertion_point(builder_implements:monitoring.KpiDescriptor)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.KpiDescriptorOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_KpiDescriptor_descriptor;
@@ -2394,8 +2396,8 @@ public final class Monitoring {
         }
     }
 
-    public interface MonitorKpiRequestOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.MonitorKpiRequest)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.MonitorKpiRequest)
+    MonitorKpiRequestOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.KpiId kpi_id = 1;
@@ -2434,8 +2436,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.MonitorKpiRequest}
      */
-    public static final class MonitorKpiRequest extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.MonitorKpiRequest)
-    MonitorKpiRequestOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.MonitorKpiRequest)
+    // @@protoc_insertion_point(message_implements:monitoring.MonitorKpiRequest)
+    MonitorKpiRequest extends com.google.protobuf.GeneratedMessageV3 implements MonitorKpiRequestOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -2688,8 +2691,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.MonitorKpiRequest}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.MonitorKpiRequest)
-        monitoring.Monitoring.MonitorKpiRequestOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.MonitorKpiRequest)
+        // @@protoc_insertion_point(builder_implements:monitoring.MonitorKpiRequest)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.MonitorKpiRequestOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_MonitorKpiRequest_descriptor;
@@ -3107,8 +3111,8 @@ public final class Monitoring {
         }
     }
 
-    public interface KpiQueryOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.KpiQuery)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.KpiQuery)
+    KpiQueryOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .monitoring.KpiId kpi_ids = 1;
@@ -3213,8 +3217,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.KpiQuery}
      */
-    public static final class KpiQuery extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.KpiQuery)
-    KpiQueryOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.KpiQuery)
+    // @@protoc_insertion_point(message_implements:monitoring.KpiQuery)
+    KpiQuery extends com.google.protobuf.GeneratedMessageV3 implements KpiQueryOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -3595,8 +3600,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.KpiQuery}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.KpiQuery)
-        monitoring.Monitoring.KpiQueryOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.KpiQuery)
+        // @@protoc_insertion_point(builder_implements:monitoring.KpiQuery)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.KpiQueryOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_KpiQuery_descriptor;
@@ -4515,8 +4521,8 @@ public final class Monitoring {
         }
     }
 
-    public interface RawKpiOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.RawKpi)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.RawKpi)
+    RawKpiOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Timestamp timestamp = 1;
@@ -4560,8 +4566,9 @@ public final class Monitoring {
      *
      * Protobuf type {@code monitoring.RawKpi}
      */
-    public static final class RawKpi extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.RawKpi)
-    RawKpiOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.RawKpi)
+    // @@protoc_insertion_point(message_implements:monitoring.RawKpi)
+    RawKpi extends com.google.protobuf.GeneratedMessageV3 implements RawKpiOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -4814,8 +4821,9 @@ public final class Monitoring {
          *
          * Protobuf type {@code monitoring.RawKpi}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.RawKpi)
-        monitoring.Monitoring.RawKpiOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.RawKpi)
+        // @@protoc_insertion_point(builder_implements:monitoring.RawKpi)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.RawKpiOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_RawKpi_descriptor;
@@ -5261,8 +5269,8 @@ public final class Monitoring {
         }
     }
 
-    public interface RawKpiListOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.RawKpiList)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.RawKpiList)
+    RawKpiListOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.KpiId kpi_id = 1;
@@ -5314,8 +5322,9 @@ public final class Monitoring {
      *
      * Protobuf type {@code monitoring.RawKpiList}
      */
-    public static final class RawKpiList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.RawKpiList)
-    RawKpiListOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.RawKpiList)
+    // @@protoc_insertion_point(message_implements:monitoring.RawKpiList)
+    RawKpiList extends com.google.protobuf.GeneratedMessageV3 implements RawKpiListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -5580,8 +5589,9 @@ public final class Monitoring {
          *
          * Protobuf type {@code monitoring.RawKpiList}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.RawKpiList)
-        monitoring.Monitoring.RawKpiListOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.RawKpiList)
+        // @@protoc_insertion_point(builder_implements:monitoring.RawKpiList)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.RawKpiListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_RawKpiList_descriptor;
@@ -6184,8 +6194,8 @@ public final class Monitoring {
         }
     }
 
-    public interface RawKpiTableOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.RawKpiTable)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.RawKpiTable)
+    RawKpiTableOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .monitoring.RawKpiList raw_kpi_lists = 1;
@@ -6220,8 +6230,9 @@ public final class Monitoring {
      *
      * Protobuf type {@code monitoring.RawKpiTable}
      */
-    public static final class RawKpiTable extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.RawKpiTable)
-    RawKpiTableOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.RawKpiTable)
+    // @@protoc_insertion_point(message_implements:monitoring.RawKpiTable)
+    RawKpiTable extends com.google.protobuf.GeneratedMessageV3 implements RawKpiTableOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -6440,8 +6451,9 @@ public final class Monitoring {
          *
          * Protobuf type {@code monitoring.RawKpiTable}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.RawKpiTable)
-        monitoring.Monitoring.RawKpiTableOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.RawKpiTable)
+        // @@protoc_insertion_point(builder_implements:monitoring.RawKpiTable)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.RawKpiTableOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_RawKpiTable_descriptor;
@@ -6908,8 +6920,8 @@ public final class Monitoring {
         }
     }
 
-    public interface KpiIdOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.KpiId)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.KpiId)
+    KpiIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid kpi_id = 1;
@@ -6932,8 +6944,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.KpiId}
      */
-    public static final class KpiId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.KpiId)
-    KpiIdOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.KpiId)
+    // @@protoc_insertion_point(message_implements:monitoring.KpiId)
+    KpiId extends com.google.protobuf.GeneratedMessageV3 implements KpiIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -7136,8 +7149,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.KpiId}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.KpiId)
-        monitoring.Monitoring.KpiIdOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.KpiId)
+        // @@protoc_insertion_point(builder_implements:monitoring.KpiId)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.KpiIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_KpiId_descriptor;
@@ -7447,8 +7461,8 @@ public final class Monitoring {
         }
     }
 
-    public interface KpiOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.Kpi)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.Kpi)
+    KpiOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.KpiId kpi_id = 1;
@@ -7505,8 +7519,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.Kpi}
      */
-    public static final class Kpi extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.Kpi)
-    KpiOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.Kpi)
+    // @@protoc_insertion_point(message_implements:monitoring.Kpi)
+    Kpi extends com.google.protobuf.GeneratedMessageV3 implements KpiOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -7801,8 +7816,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.Kpi}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.Kpi)
-        monitoring.Monitoring.KpiOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.Kpi)
+        // @@protoc_insertion_point(builder_implements:monitoring.Kpi)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.KpiOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_Kpi_descriptor;
@@ -8384,8 +8400,8 @@ public final class Monitoring {
         }
     }
 
-    public interface KpiValueRangeOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.KpiValueRange)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.KpiValueRange)
+    KpiValueRangeOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.KpiValue kpiMinValue = 1;
@@ -8455,8 +8471,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.KpiValueRange}
      */
-    public static final class KpiValueRange extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.KpiValueRange)
-    KpiValueRangeOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.KpiValueRange)
+    // @@protoc_insertion_point(message_implements:monitoring.KpiValueRange)
+    KpiValueRange extends com.google.protobuf.GeneratedMessageV3 implements KpiValueRangeOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -8786,8 +8803,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.KpiValueRange}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.KpiValueRange)
-        monitoring.Monitoring.KpiValueRangeOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.KpiValueRange)
+        // @@protoc_insertion_point(builder_implements:monitoring.KpiValueRange)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.KpiValueRangeOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_KpiValueRange_descriptor;
@@ -9413,8 +9431,8 @@ public final class Monitoring {
         }
     }
 
-    public interface KpiValueOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.KpiValue)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.KpiValue)
+    KpiValueOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * int32 int32Val = 1;
@@ -9512,8 +9530,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.KpiValue}
      */
-    public static final class KpiValue extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.KpiValue)
-    KpiValueOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.KpiValue)
+    // @@protoc_insertion_point(message_implements:monitoring.KpiValue)
+    KpiValue extends com.google.protobuf.GeneratedMessageV3 implements KpiValueOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -10031,8 +10050,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.KpiValue}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.KpiValue)
-        monitoring.Monitoring.KpiValueOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.KpiValue)
+        // @@protoc_insertion_point(builder_implements:monitoring.KpiValue)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.KpiValueOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_KpiValue_descriptor;
@@ -10682,8 +10702,8 @@ public final class Monitoring {
         }
     }
 
-    public interface KpiListOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.KpiList)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.KpiList)
+    KpiListOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .monitoring.Kpi kpi = 1;
@@ -10714,8 +10734,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.KpiList}
      */
-    public static final class KpiList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.KpiList)
-    KpiListOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.KpiList)
+    // @@protoc_insertion_point(message_implements:monitoring.KpiList)
+    KpiList extends com.google.protobuf.GeneratedMessageV3 implements KpiListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -10930,8 +10951,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.KpiList}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.KpiList)
-        monitoring.Monitoring.KpiListOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.KpiList)
+        // @@protoc_insertion_point(builder_implements:monitoring.KpiList)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.KpiListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_KpiList_descriptor;
@@ -11398,8 +11420,8 @@ public final class Monitoring {
         }
     }
 
-    public interface KpiDescriptorListOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.KpiDescriptorList)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.KpiDescriptorList)
+    KpiDescriptorListOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .monitoring.KpiDescriptor kpi_descriptor_list = 1;
@@ -11430,8 +11452,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.KpiDescriptorList}
      */
-    public static final class KpiDescriptorList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.KpiDescriptorList)
-    KpiDescriptorListOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.KpiDescriptorList)
+    // @@protoc_insertion_point(message_implements:monitoring.KpiDescriptorList)
+    KpiDescriptorList extends com.google.protobuf.GeneratedMessageV3 implements KpiDescriptorListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -11646,8 +11669,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.KpiDescriptorList}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.KpiDescriptorList)
-        monitoring.Monitoring.KpiDescriptorListOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.KpiDescriptorList)
+        // @@protoc_insertion_point(builder_implements:monitoring.KpiDescriptorList)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.KpiDescriptorListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_KpiDescriptorList_descriptor;
@@ -12114,8 +12138,8 @@ public final class Monitoring {
         }
     }
 
-    public interface SubsDescriptorOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.SubsDescriptor)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.SubsDescriptor)
+    SubsDescriptorOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.SubscriptionID subs_id = 1;
@@ -12225,8 +12249,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.SubsDescriptor}
      */
-    public static final class SubsDescriptor extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.SubsDescriptor)
-    SubsDescriptorOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.SubsDescriptor)
+    // @@protoc_insertion_point(message_implements:monitoring.SubsDescriptor)
+    SubsDescriptor extends com.google.protobuf.GeneratedMessageV3 implements SubsDescriptorOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -12637,8 +12662,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.SubsDescriptor}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.SubsDescriptor)
-        monitoring.Monitoring.SubsDescriptorOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.SubsDescriptor)
+        // @@protoc_insertion_point(builder_implements:monitoring.SubsDescriptor)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.SubsDescriptorOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_SubsDescriptor_descriptor;
@@ -13524,8 +13550,8 @@ public final class Monitoring {
         }
     }
 
-    public interface SubscriptionIDOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.SubscriptionID)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.SubscriptionID)
+    SubscriptionIDOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid subs_id = 1;
@@ -13548,8 +13574,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.SubscriptionID}
      */
-    public static final class SubscriptionID extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.SubscriptionID)
-    SubscriptionIDOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.SubscriptionID)
+    // @@protoc_insertion_point(message_implements:monitoring.SubscriptionID)
+    SubscriptionID extends com.google.protobuf.GeneratedMessageV3 implements SubscriptionIDOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -13752,8 +13779,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.SubscriptionID}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.SubscriptionID)
-        monitoring.Monitoring.SubscriptionIDOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.SubscriptionID)
+        // @@protoc_insertion_point(builder_implements:monitoring.SubscriptionID)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.SubscriptionIDOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_SubscriptionID_descriptor;
@@ -14063,8 +14091,8 @@ public final class Monitoring {
         }
     }
 
-    public interface SubsResponseOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.SubsResponse)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.SubsResponse)
+    SubsResponseOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.SubscriptionID subs_id = 1;
@@ -14104,8 +14132,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.SubsResponse}
      */
-    public static final class SubsResponse extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.SubsResponse)
-    SubsResponseOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.SubsResponse)
+    // @@protoc_insertion_point(message_implements:monitoring.SubsResponse)
+    SubsResponse extends com.google.protobuf.GeneratedMessageV3 implements SubsResponseOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -14354,8 +14383,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.SubsResponse}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.SubsResponse)
-        monitoring.Monitoring.SubsResponseOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.SubsResponse)
+        // @@protoc_insertion_point(builder_implements:monitoring.SubsResponse)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.SubsResponseOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_SubsResponse_descriptor;
@@ -14801,8 +14831,8 @@ public final class Monitoring {
         }
     }
 
-    public interface SubsListOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.SubsList)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.SubsList)
+    SubsListOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .monitoring.SubsDescriptor subs_descriptor = 1;
@@ -14833,8 +14863,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.SubsList}
      */
-    public static final class SubsList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.SubsList)
-    SubsListOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.SubsList)
+    // @@protoc_insertion_point(message_implements:monitoring.SubsList)
+    SubsList extends com.google.protobuf.GeneratedMessageV3 implements SubsListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -15049,8 +15080,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.SubsList}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.SubsList)
-        monitoring.Monitoring.SubsListOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.SubsList)
+        // @@protoc_insertion_point(builder_implements:monitoring.SubsList)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.SubsListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_SubsList_descriptor;
@@ -15517,8 +15549,8 @@ public final class Monitoring {
         }
     }
 
-    public interface AlarmDescriptorOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.AlarmDescriptor)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.AlarmDescriptor)
+    AlarmDescriptorOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.AlarmID alarm_id = 1;
@@ -15616,8 +15648,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.AlarmDescriptor}
      */
-    public static final class AlarmDescriptor extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.AlarmDescriptor)
-    AlarmDescriptorOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.AlarmDescriptor)
+    // @@protoc_insertion_point(message_implements:monitoring.AlarmDescriptor)
+    AlarmDescriptor extends com.google.protobuf.GeneratedMessageV3 implements AlarmDescriptorOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -16056,8 +16089,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.AlarmDescriptor}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.AlarmDescriptor)
-        monitoring.Monitoring.AlarmDescriptorOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.AlarmDescriptor)
+        // @@protoc_insertion_point(builder_implements:monitoring.AlarmDescriptor)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.AlarmDescriptorOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_AlarmDescriptor_descriptor;
@@ -16957,8 +16991,8 @@ public final class Monitoring {
         }
     }
 
-    public interface AlarmIDOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.AlarmID)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.AlarmID)
+    AlarmIDOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid alarm_id = 1;
@@ -16981,8 +17015,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.AlarmID}
      */
-    public static final class AlarmID extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.AlarmID)
-    AlarmIDOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.AlarmID)
+    // @@protoc_insertion_point(message_implements:monitoring.AlarmID)
+    AlarmID extends com.google.protobuf.GeneratedMessageV3 implements AlarmIDOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -17185,8 +17220,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.AlarmID}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.AlarmID)
-        monitoring.Monitoring.AlarmIDOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.AlarmID)
+        // @@protoc_insertion_point(builder_implements:monitoring.AlarmID)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.AlarmIDOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_AlarmID_descriptor;
@@ -17496,8 +17532,8 @@ public final class Monitoring {
         }
     }
 
-    public interface AlarmSubscriptionOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.AlarmSubscription)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.AlarmSubscription)
+    AlarmSubscriptionOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.AlarmID alarm_id = 1;
@@ -17532,8 +17568,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.AlarmSubscription}
      */
-    public static final class AlarmSubscription extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.AlarmSubscription)
-    AlarmSubscriptionOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.AlarmSubscription)
+    // @@protoc_insertion_point(message_implements:monitoring.AlarmSubscription)
+    AlarmSubscription extends com.google.protobuf.GeneratedMessageV3 implements AlarmSubscriptionOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -17782,8 +17819,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.AlarmSubscription}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.AlarmSubscription)
-        monitoring.Monitoring.AlarmSubscriptionOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.AlarmSubscription)
+        // @@protoc_insertion_point(builder_implements:monitoring.AlarmSubscription)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.AlarmSubscriptionOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_AlarmSubscription_descriptor;
@@ -18189,8 +18227,8 @@ public final class Monitoring {
         }
     }
 
-    public interface AlarmResponseOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.AlarmResponse)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.AlarmResponse)
+    AlarmResponseOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.AlarmID alarm_id = 1;
@@ -18242,8 +18280,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.AlarmResponse}
      */
-    public static final class AlarmResponse extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.AlarmResponse)
-    AlarmResponseOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.AlarmResponse)
+    // @@protoc_insertion_point(message_implements:monitoring.AlarmResponse)
+    AlarmResponse extends com.google.protobuf.GeneratedMessageV3 implements AlarmResponseOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -18541,8 +18580,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.AlarmResponse}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.AlarmResponse)
-        monitoring.Monitoring.AlarmResponseOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.AlarmResponse)
+        // @@protoc_insertion_point(builder_implements:monitoring.AlarmResponse)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.AlarmResponseOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_AlarmResponse_descriptor;
@@ -19079,8 +19119,8 @@ public final class Monitoring {
         }
     }
 
-    public interface AlarmListOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.AlarmList)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.AlarmList)
+    AlarmListOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .monitoring.AlarmDescriptor alarm_descriptor = 1;
@@ -19111,8 +19151,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.AlarmList}
      */
-    public static final class AlarmList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.AlarmList)
-    AlarmListOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.AlarmList)
+    // @@protoc_insertion_point(message_implements:monitoring.AlarmList)
+    AlarmList extends com.google.protobuf.GeneratedMessageV3 implements AlarmListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -19327,8 +19368,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.AlarmList}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.AlarmList)
-        monitoring.Monitoring.AlarmListOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.AlarmList)
+        // @@protoc_insertion_point(builder_implements:monitoring.AlarmList)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.AlarmListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_AlarmList_descriptor;
@@ -19795,8 +19837,8 @@ public final class Monitoring {
         }
     }
 
-    public interface SSEMonitoringSubscriptionConfigOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.SSEMonitoringSubscriptionConfig)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.SSEMonitoringSubscriptionConfig)
+    SSEMonitoringSubscriptionConfigOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.DeviceId device_id = 1;
@@ -19875,8 +19917,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.SSEMonitoringSubscriptionConfig}
      */
-    public static final class SSEMonitoringSubscriptionConfig extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.SSEMonitoringSubscriptionConfig)
-    SSEMonitoringSubscriptionConfigOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.SSEMonitoringSubscriptionConfig)
+    // @@protoc_insertion_point(message_implements:monitoring.SSEMonitoringSubscriptionConfig)
+    SSEMonitoringSubscriptionConfig extends com.google.protobuf.GeneratedMessageV3 implements SSEMonitoringSubscriptionConfigOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -20381,8 +20424,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.SSEMonitoringSubscriptionConfig}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.SSEMonitoringSubscriptionConfig)
-        monitoring.Monitoring.SSEMonitoringSubscriptionConfigOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.SSEMonitoringSubscriptionConfig)
+        // @@protoc_insertion_point(builder_implements:monitoring.SSEMonitoringSubscriptionConfig)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.SSEMonitoringSubscriptionConfigOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_SSEMonitoringSubscriptionConfig_descriptor;
@@ -21058,8 +21102,8 @@ public final class Monitoring {
         }
     }
 
-    public interface SSEMonitoringSubscriptionResponseOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.SSEMonitoringSubscriptionResponse)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:monitoring.SSEMonitoringSubscriptionResponse)
+    SSEMonitoringSubscriptionResponseOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * string identifier = 1;
@@ -21089,8 +21133,9 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.SSEMonitoringSubscriptionResponse}
      */
-    public static final class SSEMonitoringSubscriptionResponse extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.SSEMonitoringSubscriptionResponse)
-    SSEMonitoringSubscriptionResponseOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:monitoring.SSEMonitoringSubscriptionResponse)
+    // @@protoc_insertion_point(message_implements:monitoring.SSEMonitoringSubscriptionResponse)
+    SSEMonitoringSubscriptionResponse extends com.google.protobuf.GeneratedMessageV3 implements SSEMonitoringSubscriptionResponseOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -21345,8 +21390,9 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.SSEMonitoringSubscriptionResponse}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.SSEMonitoringSubscriptionResponse)
-        monitoring.Monitoring.SSEMonitoringSubscriptionResponseOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:monitoring.SSEMonitoringSubscriptionResponse)
+        // @@protoc_insertion_point(builder_implements:monitoring.SSEMonitoringSubscriptionResponse)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.SSEMonitoringSubscriptionResponseOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_SSEMonitoringSubscriptionResponse_descriptor;
diff --git a/src/ztp/target/generated-sources/grpc/ztp/Ztp.java b/src/ztp/target/generated-sources/grpc/ztp/Ztp.java
index 0812fc8eb..4e1c6ae37 100644
--- a/src/ztp/target/generated-sources/grpc/ztp/Ztp.java
+++ b/src/ztp/target/generated-sources/grpc/ztp/Ztp.java
@@ -262,8 +262,8 @@ public final class Ztp {
         }
     }
 
-    public interface DeviceRoleIdOrBuilder extends // @@protoc_insertion_point(interface_extends:ztp.DeviceRoleId)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:ztp.DeviceRoleId)
+    DeviceRoleIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid devRoleId = 1;
@@ -303,8 +303,9 @@ public final class Ztp {
     /**
      * Protobuf type {@code ztp.DeviceRoleId}
      */
-    public static final class DeviceRoleId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:ztp.DeviceRoleId)
-    DeviceRoleIdOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:ztp.DeviceRoleId)
+    // @@protoc_insertion_point(message_implements:ztp.DeviceRoleId)
+    DeviceRoleId extends com.google.protobuf.GeneratedMessageV3 implements DeviceRoleIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -553,8 +554,9 @@ public final class Ztp {
         /**
          * Protobuf type {@code ztp.DeviceRoleId}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:ztp.DeviceRoleId)
-        ztp.Ztp.DeviceRoleIdOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:ztp.DeviceRoleId)
+        // @@protoc_insertion_point(builder_implements:ztp.DeviceRoleId)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements ztp.Ztp.DeviceRoleIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return ztp.Ztp.internal_static_ztp_DeviceRoleId_descriptor;
@@ -1000,8 +1002,8 @@ public final class Ztp {
         }
     }
 
-    public interface DeviceRoleOrBuilder extends // @@protoc_insertion_point(interface_extends:ztp.DeviceRole)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:ztp.DeviceRole)
+    DeviceRoleOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .ztp.DeviceRoleId devRoleId = 1;
@@ -1036,8 +1038,9 @@ public final class Ztp {
     /**
      * Protobuf type {@code ztp.DeviceRole}
      */
-    public static final class DeviceRole extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:ztp.DeviceRole)
-    DeviceRoleOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:ztp.DeviceRole)
+    // @@protoc_insertion_point(message_implements:ztp.DeviceRole)
+    DeviceRole extends com.google.protobuf.GeneratedMessageV3 implements DeviceRoleOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -1274,8 +1277,9 @@ public final class Ztp {
         /**
          * Protobuf type {@code ztp.DeviceRole}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:ztp.DeviceRole)
-        ztp.Ztp.DeviceRoleOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:ztp.DeviceRole)
+        // @@protoc_insertion_point(builder_implements:ztp.DeviceRole)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements ztp.Ztp.DeviceRoleOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return ztp.Ztp.internal_static_ztp_DeviceRole_descriptor;
@@ -1658,8 +1662,8 @@ public final class Ztp {
         }
     }
 
-    public interface DeviceRoleConfigOrBuilder extends // @@protoc_insertion_point(interface_extends:ztp.DeviceRoleConfig)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:ztp.DeviceRoleConfig)
+    DeviceRoleConfigOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .ztp.DeviceRole devRole = 1;
@@ -1699,8 +1703,9 @@ public final class Ztp {
     /**
      * Protobuf type {@code ztp.DeviceRoleConfig}
      */
-    public static final class DeviceRoleConfig extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:ztp.DeviceRoleConfig)
-    DeviceRoleConfigOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:ztp.DeviceRoleConfig)
+    // @@protoc_insertion_point(message_implements:ztp.DeviceRoleConfig)
+    DeviceRoleConfig extends com.google.protobuf.GeneratedMessageV3 implements DeviceRoleConfigOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -1949,8 +1954,9 @@ public final class Ztp {
         /**
          * Protobuf type {@code ztp.DeviceRoleConfig}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:ztp.DeviceRoleConfig)
-        ztp.Ztp.DeviceRoleConfigOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:ztp.DeviceRoleConfig)
+        // @@protoc_insertion_point(builder_implements:ztp.DeviceRoleConfig)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements ztp.Ztp.DeviceRoleConfigOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return ztp.Ztp.internal_static_ztp_DeviceRoleConfig_descriptor;
@@ -2396,8 +2402,8 @@ public final class Ztp {
         }
     }
 
-    public interface DeviceRoleListOrBuilder extends // @@protoc_insertion_point(interface_extends:ztp.DeviceRoleList)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:ztp.DeviceRoleList)
+    DeviceRoleListOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .ztp.DeviceRole devRole = 1;
@@ -2428,8 +2434,9 @@ public final class Ztp {
     /**
      * Protobuf type {@code ztp.DeviceRoleList}
      */
-    public static final class DeviceRoleList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:ztp.DeviceRoleList)
-    DeviceRoleListOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:ztp.DeviceRoleList)
+    // @@protoc_insertion_point(message_implements:ztp.DeviceRoleList)
+    DeviceRoleList extends com.google.protobuf.GeneratedMessageV3 implements DeviceRoleListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -2644,8 +2651,9 @@ public final class Ztp {
         /**
          * Protobuf type {@code ztp.DeviceRoleList}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:ztp.DeviceRoleList)
-        ztp.Ztp.DeviceRoleListOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:ztp.DeviceRoleList)
+        // @@protoc_insertion_point(builder_implements:ztp.DeviceRoleList)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements ztp.Ztp.DeviceRoleListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return ztp.Ztp.internal_static_ztp_DeviceRoleList_descriptor;
@@ -3112,8 +3120,8 @@ public final class Ztp {
         }
     }
 
-    public interface DeviceRoleStateOrBuilder extends // @@protoc_insertion_point(interface_extends:ztp.DeviceRoleState)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:ztp.DeviceRoleState)
+    DeviceRoleStateOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * .ztp.DeviceRoleId devRoleId = 1;
@@ -3148,8 +3156,9 @@ public final class Ztp {
     /**
      * Protobuf type {@code ztp.DeviceRoleState}
      */
-    public static final class DeviceRoleState extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:ztp.DeviceRoleState)
-    DeviceRoleStateOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:ztp.DeviceRoleState)
+    // @@protoc_insertion_point(message_implements:ztp.DeviceRoleState)
+    DeviceRoleState extends com.google.protobuf.GeneratedMessageV3 implements DeviceRoleStateOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -3386,8 +3395,9 @@ public final class Ztp {
         /**
          * Protobuf type {@code ztp.DeviceRoleState}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:ztp.DeviceRoleState)
-        ztp.Ztp.DeviceRoleStateOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:ztp.DeviceRoleState)
+        // @@protoc_insertion_point(builder_implements:ztp.DeviceRoleState)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements ztp.Ztp.DeviceRoleStateOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return ztp.Ztp.internal_static_ztp_DeviceRoleState_descriptor;
@@ -3770,8 +3780,8 @@ public final class Ztp {
         }
     }
 
-    public interface DeviceDeletionResultOrBuilder extends // @@protoc_insertion_point(interface_extends:ztp.DeviceDeletionResult)
-    com.google.protobuf.MessageOrBuilder {
+    public interface // @@protoc_insertion_point(interface_extends:ztp.DeviceDeletionResult)
+    DeviceDeletionResultOrBuilder extends com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated string deleted = 1;
@@ -3803,8 +3813,9 @@ public final class Ztp {
     /**
      * Protobuf type {@code ztp.DeviceDeletionResult}
      */
-    public static final class DeviceDeletionResult extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:ztp.DeviceDeletionResult)
-    DeviceDeletionResultOrBuilder {
+    public static final class // @@protoc_insertion_point(message_implements:ztp.DeviceDeletionResult)
+    // @@protoc_insertion_point(message_implements:ztp.DeviceDeletionResult)
+    DeviceDeletionResult extends com.google.protobuf.GeneratedMessageV3 implements DeviceDeletionResultOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -4018,8 +4029,9 @@ public final class Ztp {
         /**
          * Protobuf type {@code ztp.DeviceDeletionResult}
          */
-        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:ztp.DeviceDeletionResult)
-        ztp.Ztp.DeviceDeletionResultOrBuilder {
+        public static final class // @@protoc_insertion_point(builder_implements:ztp.DeviceDeletionResult)
+        // @@protoc_insertion_point(builder_implements:ztp.DeviceDeletionResult)
+        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements ztp.Ztp.DeviceDeletionResultOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return ztp.Ztp.internal_static_ztp_DeviceDeletionResult_descriptor;
-- 
GitLab


From 14783e4ce8d72c2995a8ea5394c385c2317beb1d Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Mon, 27 Oct 2025 15:50:48 +0000
Subject: [PATCH 022/111] Pre-merge code cleanup

---
 .../service_handler_api/ServiceHandlerFactory.py    | 13 +++++++------
 .../service_handlers/tapi_lsp/ConfigRules.py        |  2 +-
 .../service/service_handlers/tapi_lsp/__init__.py   |  2 +-
 3 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/src/service/service/service_handler_api/ServiceHandlerFactory.py b/src/service/service/service_handler_api/ServiceHandlerFactory.py
index cb11949f5..f998fe072 100644
--- a/src/service/service/service_handler_api/ServiceHandlerFactory.py
+++ b/src/service/service/service_handler_api/ServiceHandlerFactory.py
@@ -15,7 +15,7 @@
 import logging, operator
 from enum import Enum
 from typing import TYPE_CHECKING, Any, Dict, Iterable, List, Optional, Set, Tuple
-from common.proto.context_pb2 import Device, Service
+from common.proto.context_pb2 import Device, DeviceDriverEnum, Service
 from common.tools.grpc.Tools import grpc_message_to_json_string
 from .Exceptions import (
     UnsatisfiedFilterException, UnsupportedServiceHandlerClassException, UnsupportedFilterFieldException,
@@ -114,16 +114,17 @@ def get_service_handler_class(
     service_handler_factory : ServiceHandlerFactory, service : Service,
     device_and_drivers: Dict[str, Tuple[Device, Set[int]]]
 ) -> Optional['_ServiceHandler']:
-    LOGGER.debug(f'SERVICE_HANDLER_FACTORY: Getting service handler for service: {service.service_config.config_rules}')
     str_service_key = grpc_message_to_json_string(service.service_id)
     # Checks if the service is of type ipowdm
-    if 'ipowdm' in str(service.service_config.config_rules): common_device_drivers = [13]
+    if 'ipowdm' in str(service.service_config.config_rules):
+        common_device_drivers = [DeviceDriverEnum.DEVICEDRIVER_IETF_L3VPN]
     # Checks if the service is of type tapi_lsp
-    elif 'tapi_lsp' in str(service.service_config.config_rules): common_device_drivers = [2]
+    elif 'tapi_lsp' in str(service.service_config.config_rules):
+        common_device_drivers = [DeviceDriverEnum.DEVICEDRIVER_TRANSPORT_API]
     else:
         common_device_drivers = get_common_device_drivers([
-        device_drivers
-        for _,device_drivers in device_and_drivers.values()
+            device_drivers
+            for _,device_drivers in device_and_drivers.values()
         ])
     LOGGER.debug('common_device_drivers={:s}'.format(str(common_device_drivers)))
 
diff --git a/src/service/service/service_handlers/tapi_lsp/ConfigRules.py b/src/service/service/service_handlers/tapi_lsp/ConfigRules.py
index 0deb1625e..e78379834 100644
--- a/src/service/service/service_handlers/tapi_lsp/ConfigRules.py
+++ b/src/service/service/service_handlers/tapi_lsp/ConfigRules.py
@@ -55,4 +55,4 @@ def teardown_config_rules(
     settings = (json_settings, json_endpoint_settings, json_device_settings)
 
     json_config_rules = []
-    return json_config_rules
\ No newline at end of file
+    return json_config_rules
diff --git a/src/service/service/service_handlers/tapi_lsp/__init__.py b/src/service/service/service_handlers/tapi_lsp/__init__.py
index ec5fa1145..6242c89c7 100644
--- a/src/service/service/service_handlers/tapi_lsp/__init__.py
+++ b/src/service/service/service_handlers/tapi_lsp/__init__.py
@@ -10,4 +10,4 @@
 # 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.
-- 
GitLab


From f6ca78538c88e1affff6dd8908e6f14379f5d9ac Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Mon, 27 Oct 2025 15:59:53 +0000
Subject: [PATCH 023/111] Pre-merge code cleanup

---
 proto/tapi_lsp.proto                                     | 2 +-
 .../service/drivers/ietf_l3vpn/templates/ipowdm.json     | 2 +-
 src/device/service/drivers/ietf_l3vpn/templates/tools.py | 1 +
 src/device/service/drivers/transport_api/Tools.py        | 6 ++++--
 src/nbi/service/e2e_services/Resources.py                | 9 +++++----
 src/nbi/service/e2e_services/__init__.py                 | 1 +
 6 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/proto/tapi_lsp.proto b/proto/tapi_lsp.proto
index 9874302c0..8db84cf7c 100644
--- a/proto/tapi_lsp.proto
+++ b/proto/tapi_lsp.proto
@@ -33,4 +33,4 @@ message TapiLspRuleSet {
   string capacity_value  = 15;
   string route_objective_function = 16;
   string url = 17;
-}
\ No newline at end of file
+}
diff --git a/src/device/service/drivers/ietf_l3vpn/templates/ipowdm.json b/src/device/service/drivers/ietf_l3vpn/templates/ipowdm.json
index f8054951e..db700293f 100644
--- a/src/device/service/drivers/ietf_l3vpn/templates/ipowdm.json
+++ b/src/device/service/drivers/ietf_l3vpn/templates/ipowdm.json
@@ -26,4 +26,4 @@
             ]}
         }
     ]
-}
\ No newline at end of file
+}
diff --git a/src/device/service/drivers/ietf_l3vpn/templates/tools.py b/src/device/service/drivers/ietf_l3vpn/templates/tools.py
index a9e6684ec..a9a4adbb2 100644
--- a/src/device/service/drivers/ietf_l3vpn/templates/tools.py
+++ b/src/device/service/drivers/ietf_l3vpn/templates/tools.py
@@ -11,6 +11,7 @@
 # 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
 import logging
 import os
diff --git a/src/device/service/drivers/transport_api/Tools.py b/src/device/service/drivers/transport_api/Tools.py
index a75aab443..63b54b4dd 100644
--- a/src/device/service/drivers/transport_api/Tools.py
+++ b/src/device/service/drivers/transport_api/Tools.py
@@ -17,10 +17,12 @@ from requests.auth import HTTPBasicAuth
 from typing import Optional
 from device.service.driver_api._Driver import RESOURCE_ENDPOINTS, RESOURCE_SERVICES
 from concurrent.futures import ThreadPoolExecutor
-executor = ThreadPoolExecutor()
+
 
 LOGGER = logging.getLogger(__name__)
 
+EXECUTOR = ThreadPoolExecutor()
+
 HTTP_OK_CODES = {
     200,    # OK
     201,    # Created
@@ -206,7 +208,7 @@ def tapi_tequest(resource_value):
         LOGGER.info(f"Services to be processed: {json.dumps(service, indent=2)}")
         LOGGER.info(f"URL to be used: {url}")
 
-        executor.submit(process_uuid, service, url)
+        EXECUTOR.submit(process_uuid, service, url)
 
 def process_uuid(service, url):
     headers = {
diff --git a/src/nbi/service/e2e_services/Resources.py b/src/nbi/service/e2e_services/Resources.py
index cb734df5b..6d496b373 100644
--- a/src/nbi/service/e2e_services/Resources.py
+++ b/src/nbi/service/e2e_services/Resources.py
@@ -11,10 +11,10 @@
 # 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 ast
 import json
 import logging
-
 import requests
 from flask_restful import Resource
 from common.Constants import DEFAULT_CONTEXT_NAME
@@ -33,9 +33,10 @@ HEADERS = {
 }
 
 headers = {
-            "Content-Type": "application/json",
-            "Expect": ""
-        }
+    "Content-Type": "application/json",
+    "Expect": ""
+}
+
 class E2EInfoDelete(Resource):
     def __init__(self):
         super().__init__()
diff --git a/src/nbi/service/e2e_services/__init__.py b/src/nbi/service/e2e_services/__init__.py
index d90f352f3..5adbcd9c9 100644
--- a/src/nbi/service/e2e_services/__init__.py
+++ b/src/nbi/service/e2e_services/__init__.py
@@ -11,6 +11,7 @@
 # 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 nbi.service.NbiApplication import NbiApplication
 from .Resources import E2EInfoDelete
 
-- 
GitLab


From 84e6b17eb1ef134fa86e475f1bad059813fa6ca2 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Mon, 27 Oct 2025 16:26:20 +0000
Subject: [PATCH 024/111] Policy and ZTP components:

- Rebuild gRPC/Proto files
- Synchronize Serializers
---
 .../context/model/DeviceDriverEnum.java       |   11 +-
 .../policy/context/model/ServiceTypeEnum.java |    4 +-
 src/policy/src/main/proto/ipowdm.proto        |    1 +
 src/policy/src/main/proto/tapi_lsp.proto      |    1 +
 .../grpc/context/ContextOuterClass.java       | 2216 ++++++-
 .../generated-sources/grpc/ipowdm/Ipowdm.java | 5782 +++++++++++++++++
 .../grpc/tapi_lsp/TapiLsp.java                | 3031 +++++++++
 src/policy/target/kubernetes/kubernetes.yml   |   40 +-
 .../ztp/context/model/DeviceDriverEnum.java   |   12 +-
 src/ztp/src/main/proto/ipowdm.proto           |    1 +
 src/ztp/src/main/proto/tapi_lsp.proto         |    1 +
 .../grpc/context/ContextOuterClass.java       | 2216 ++++++-
 .../generated-sources/grpc/ipowdm/Ipowdm.java | 5782 +++++++++++++++++
 .../grpc/tapi_lsp/TapiLsp.java                | 3031 +++++++++
 src/ztp/target/kubernetes/kubernetes.yml      |   30 +-
 15 files changed, 22051 insertions(+), 108 deletions(-)
 create mode 120000 src/policy/src/main/proto/ipowdm.proto
 create mode 120000 src/policy/src/main/proto/tapi_lsp.proto
 create mode 100644 src/policy/target/generated-sources/grpc/ipowdm/Ipowdm.java
 create mode 100644 src/policy/target/generated-sources/grpc/tapi_lsp/TapiLsp.java
 create mode 120000 src/ztp/src/main/proto/ipowdm.proto
 create mode 120000 src/ztp/src/main/proto/tapi_lsp.proto
 create mode 100644 src/ztp/target/generated-sources/grpc/ipowdm/Ipowdm.java
 create mode 100644 src/ztp/target/generated-sources/grpc/tapi_lsp/TapiLsp.java

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 1349229e8..1f7a4368c 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
@@ -28,5 +28,14 @@ public enum DeviceDriverEnum {
     GNMI_OPENCONFIG,
     OPTICAL_TFS,
     IETF_ACTN,
-    SMARTNIC
+    OC,
+    QKD,
+    IETF_L3VPN,
+    IETF_SLICE,
+    NCE,
+    SMARTNIC,
+    MORPHEUS,
+    RYU,
+    GNMI_NOKIA_SRLINUX,
+    OPENROADM
 }
diff --git a/src/policy/src/main/java/org/etsi/tfs/policy/context/model/ServiceTypeEnum.java b/src/policy/src/main/java/org/etsi/tfs/policy/context/model/ServiceTypeEnum.java
index bed0c47af..476dedee1 100644
--- a/src/policy/src/main/java/org/etsi/tfs/policy/context/model/ServiceTypeEnum.java
+++ b/src/policy/src/main/java/org/etsi/tfs/policy/context/model/ServiceTypeEnum.java
@@ -28,5 +28,7 @@ public enum ServiceTypeEnum {
     L1NM,
     INT,
     ACL,
-    IP_LINK
+    IP_LINK,
+    TAPI_LSP,
+    IPOWDM
 }
diff --git a/src/policy/src/main/proto/ipowdm.proto b/src/policy/src/main/proto/ipowdm.proto
new file mode 120000
index 000000000..80f42cbd0
--- /dev/null
+++ b/src/policy/src/main/proto/ipowdm.proto
@@ -0,0 +1 @@
+../../../../../proto/ipowdm.proto
\ No newline at end of file
diff --git a/src/policy/src/main/proto/tapi_lsp.proto b/src/policy/src/main/proto/tapi_lsp.proto
new file mode 120000
index 000000000..ff9990db2
--- /dev/null
+++ b/src/policy/src/main/proto/tapi_lsp.proto
@@ -0,0 +1 @@
+../../../../../proto/tapi_lsp.proto
\ No newline at end of file
diff --git a/src/policy/target/generated-sources/grpc/context/ContextOuterClass.java b/src/policy/target/generated-sources/grpc/context/ContextOuterClass.java
index ceec864c6..20a9d9e7a 100644
--- a/src/policy/target/generated-sources/grpc/context/ContextOuterClass.java
+++ b/src/policy/target/generated-sources/grpc/context/ContextOuterClass.java
@@ -788,6 +788,14 @@ public final class ContextOuterClass {
          * SERVICETYPE_IP_LINK = 11;
          */
         SERVICETYPE_IP_LINK(11),
+        /**
+         * SERVICETYPE_TAPI_LSP = 12;
+         */
+        SERVICETYPE_TAPI_LSP(12),
+        /**
+         * SERVICETYPE_IPOWDM = 13;
+         */
+        SERVICETYPE_IPOWDM(13),
         UNRECOGNIZED(-1);
 
         /**
@@ -850,6 +858,16 @@ public final class ContextOuterClass {
          */
         public static final int SERVICETYPE_IP_LINK_VALUE = 11;
 
+        /**
+         * SERVICETYPE_TAPI_LSP = 12;
+         */
+        public static final int SERVICETYPE_TAPI_LSP_VALUE = 12;
+
+        /**
+         * SERVICETYPE_IPOWDM = 13;
+         */
+        public static final int SERVICETYPE_IPOWDM_VALUE = 13;
+
         public final int getNumber() {
             if (this == UNRECOGNIZED) {
                 throw new java.lang.IllegalArgumentException("Can't get the number of an unknown enum value.");
@@ -897,6 +915,10 @@ public final class ContextOuterClass {
                     return SERVICETYPE_ACL;
                 case 11:
                     return SERVICETYPE_IP_LINK;
+                case 12:
+                    return SERVICETYPE_TAPI_LSP;
+                case 13:
+                    return SERVICETYPE_IPOWDM;
                 default:
                     return null;
             }
@@ -60473,6 +60495,1659 @@ public final class ContextOuterClass {
         }
     }
 
+    public interface ConfigRule_IPOWDMOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConfigRule_IPOWDM)
+    com.google.protobuf.MessageOrBuilder {
+
+        /**
+         * .context.EndPointId endpoint_id = 1;
+         * @return Whether the endpointId field is set.
+         */
+        boolean hasEndpointId();
+
+        /**
+         * .context.EndPointId endpoint_id = 1;
+         * @return The endpointId.
+         */
+        context.ContextOuterClass.EndPointId getEndpointId();
+
+        /**
+         * .context.EndPointId endpoint_id = 1;
+         */
+        context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder();
+
+        /**
+         * .ipowdm.IpowdmRuleSet rule_set = 2;
+         * @return Whether the ruleSet field is set.
+         */
+        boolean hasRuleSet();
+
+        /**
+         * .ipowdm.IpowdmRuleSet rule_set = 2;
+         * @return The ruleSet.
+         */
+        ipowdm.Ipowdm.IpowdmRuleSet getRuleSet();
+
+        /**
+         * .ipowdm.IpowdmRuleSet rule_set = 2;
+         */
+        ipowdm.Ipowdm.IpowdmRuleSetOrBuilder getRuleSetOrBuilder();
+    }
+
+    /**
+     * Protobuf type {@code context.ConfigRule_IPOWDM}
+     */
+    public static final class ConfigRule_IPOWDM extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConfigRule_IPOWDM)
+    ConfigRule_IPOWDMOrBuilder {
+
+        private static final long serialVersionUID = 0L;
+
+        // Use ConfigRule_IPOWDM.newBuilder() to construct.
+        private ConfigRule_IPOWDM(com.google.protobuf.GeneratedMessageV3.Builder builder) {
+            super(builder);
+        }
+
+        private ConfigRule_IPOWDM() {
+        }
+
+        @java.lang.Override
+        @SuppressWarnings({ "unused" })
+        protected java.lang.Object newInstance(UnusedPrivateParameter unused) {
+            return new ConfigRule_IPOWDM();
+        }
+
+        public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+            return context.ContextOuterClass.internal_static_context_ConfigRule_IPOWDM_descriptor;
+        }
+
+        @java.lang.Override
+        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+            return context.ContextOuterClass.internal_static_context_ConfigRule_IPOWDM_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.ConfigRule_IPOWDM.class, context.ContextOuterClass.ConfigRule_IPOWDM.Builder.class);
+        }
+
+        public static final int ENDPOINT_ID_FIELD_NUMBER = 1;
+
+        private context.ContextOuterClass.EndPointId endpointId_;
+
+        /**
+         * .context.EndPointId endpoint_id = 1;
+         * @return Whether the endpointId field is set.
+         */
+        @java.lang.Override
+        public boolean hasEndpointId() {
+            return endpointId_ != null;
+        }
+
+        /**
+         * .context.EndPointId endpoint_id = 1;
+         * @return The endpointId.
+         */
+        @java.lang.Override
+        public context.ContextOuterClass.EndPointId getEndpointId() {
+            return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
+        }
+
+        /**
+         * .context.EndPointId endpoint_id = 1;
+         */
+        @java.lang.Override
+        public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
+            return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
+        }
+
+        public static final int RULE_SET_FIELD_NUMBER = 2;
+
+        private ipowdm.Ipowdm.IpowdmRuleSet ruleSet_;
+
+        /**
+         * .ipowdm.IpowdmRuleSet rule_set = 2;
+         * @return Whether the ruleSet field is set.
+         */
+        @java.lang.Override
+        public boolean hasRuleSet() {
+            return ruleSet_ != null;
+        }
+
+        /**
+         * .ipowdm.IpowdmRuleSet rule_set = 2;
+         * @return The ruleSet.
+         */
+        @java.lang.Override
+        public ipowdm.Ipowdm.IpowdmRuleSet getRuleSet() {
+            return ruleSet_ == null ? ipowdm.Ipowdm.IpowdmRuleSet.getDefaultInstance() : ruleSet_;
+        }
+
+        /**
+         * .ipowdm.IpowdmRuleSet rule_set = 2;
+         */
+        @java.lang.Override
+        public ipowdm.Ipowdm.IpowdmRuleSetOrBuilder getRuleSetOrBuilder() {
+            return ruleSet_ == null ? ipowdm.Ipowdm.IpowdmRuleSet.getDefaultInstance() : ruleSet_;
+        }
+
+        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 (endpointId_ != null) {
+                output.writeMessage(1, getEndpointId());
+            }
+            if (ruleSet_ != null) {
+                output.writeMessage(2, getRuleSet());
+            }
+            getUnknownFields().writeTo(output);
+        }
+
+        @java.lang.Override
+        public int getSerializedSize() {
+            int size = memoizedSize;
+            if (size != -1)
+                return size;
+            size = 0;
+            if (endpointId_ != null) {
+                size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getEndpointId());
+            }
+            if (ruleSet_ != null) {
+                size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getRuleSet());
+            }
+            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.ConfigRule_IPOWDM)) {
+                return super.equals(obj);
+            }
+            context.ContextOuterClass.ConfigRule_IPOWDM other = (context.ContextOuterClass.ConfigRule_IPOWDM) obj;
+            if (hasEndpointId() != other.hasEndpointId())
+                return false;
+            if (hasEndpointId()) {
+                if (!getEndpointId().equals(other.getEndpointId()))
+                    return false;
+            }
+            if (hasRuleSet() != other.hasRuleSet())
+                return false;
+            if (hasRuleSet()) {
+                if (!getRuleSet().equals(other.getRuleSet()))
+                    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 (hasEndpointId()) {
+                hash = (37 * hash) + ENDPOINT_ID_FIELD_NUMBER;
+                hash = (53 * hash) + getEndpointId().hashCode();
+            }
+            if (hasRuleSet()) {
+                hash = (37 * hash) + RULE_SET_FIELD_NUMBER;
+                hash = (53 * hash) + getRuleSet().hashCode();
+            }
+            hash = (29 * hash) + getUnknownFields().hashCode();
+            memoizedHashCode = hash;
+            return hash;
+        }
+
+        public static context.ContextOuterClass.ConfigRule_IPOWDM parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static context.ContextOuterClass.ConfigRule_IPOWDM parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static context.ContextOuterClass.ConfigRule_IPOWDM parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static context.ContextOuterClass.ConfigRule_IPOWDM 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.ConfigRule_IPOWDM parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static context.ContextOuterClass.ConfigRule_IPOWDM parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static context.ContextOuterClass.ConfigRule_IPOWDM parseFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static context.ContextOuterClass.ConfigRule_IPOWDM 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.ConfigRule_IPOWDM parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input);
+        }
+
+        public static context.ContextOuterClass.ConfigRule_IPOWDM 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.ConfigRule_IPOWDM parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static context.ContextOuterClass.ConfigRule_IPOWDM 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.ConfigRule_IPOWDM 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.ConfigRule_IPOWDM}
+         */
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConfigRule_IPOWDM)
+        context.ContextOuterClass.ConfigRule_IPOWDMOrBuilder {
+
+            public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+                return context.ContextOuterClass.internal_static_context_ConfigRule_IPOWDM_descriptor;
+            }
+
+            @java.lang.Override
+            protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+                return context.ContextOuterClass.internal_static_context_ConfigRule_IPOWDM_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.ConfigRule_IPOWDM.class, context.ContextOuterClass.ConfigRule_IPOWDM.Builder.class);
+            }
+
+            // Construct using context.ContextOuterClass.ConfigRule_IPOWDM.newBuilder()
+            private Builder() {
+            }
+
+            private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+                super(parent);
+            }
+
+            @java.lang.Override
+            public Builder clear() {
+                super.clear();
+                bitField0_ = 0;
+                endpointId_ = null;
+                if (endpointIdBuilder_ != null) {
+                    endpointIdBuilder_.dispose();
+                    endpointIdBuilder_ = null;
+                }
+                ruleSet_ = null;
+                if (ruleSetBuilder_ != null) {
+                    ruleSetBuilder_.dispose();
+                    ruleSetBuilder_ = null;
+                }
+                return this;
+            }
+
+            @java.lang.Override
+            public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+                return context.ContextOuterClass.internal_static_context_ConfigRule_IPOWDM_descriptor;
+            }
+
+            @java.lang.Override
+            public context.ContextOuterClass.ConfigRule_IPOWDM getDefaultInstanceForType() {
+                return context.ContextOuterClass.ConfigRule_IPOWDM.getDefaultInstance();
+            }
+
+            @java.lang.Override
+            public context.ContextOuterClass.ConfigRule_IPOWDM build() {
+                context.ContextOuterClass.ConfigRule_IPOWDM result = buildPartial();
+                if (!result.isInitialized()) {
+                    throw newUninitializedMessageException(result);
+                }
+                return result;
+            }
+
+            @java.lang.Override
+            public context.ContextOuterClass.ConfigRule_IPOWDM buildPartial() {
+                context.ContextOuterClass.ConfigRule_IPOWDM result = new context.ContextOuterClass.ConfigRule_IPOWDM(this);
+                if (bitField0_ != 0) {
+                    buildPartial0(result);
+                }
+                onBuilt();
+                return result;
+            }
+
+            private void buildPartial0(context.ContextOuterClass.ConfigRule_IPOWDM 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 mergeFrom(com.google.protobuf.Message other) {
+                if (other instanceof context.ContextOuterClass.ConfigRule_IPOWDM) {
+                    return mergeFrom((context.ContextOuterClass.ConfigRule_IPOWDM) other);
+                } else {
+                    super.mergeFrom(other);
+                    return this;
+                }
+            }
+
+            public Builder mergeFrom(context.ContextOuterClass.ConfigRule_IPOWDM other) {
+                if (other == context.ContextOuterClass.ConfigRule_IPOWDM.getDefaultInstance())
+                    return this;
+                if (other.hasEndpointId()) {
+                    mergeEndpointId(other.getEndpointId());
+                }
+                if (other.hasRuleSet()) {
+                    mergeRuleSet(other.getRuleSet());
+                }
+                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(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)
+                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    throw e.unwrapIOException();
+                } finally {
+                    onChanged();
+                }
+                // finally
+                return this;
+            }
+
+            private int bitField0_;
+
+            private context.ContextOuterClass.EndPointId endpointId_;
+
+            private com.google.protobuf.SingleFieldBuilderV3 endpointIdBuilder_;
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             * @return Whether the endpointId field is set.
+             */
+            public boolean hasEndpointId() {
+                return ((bitField0_ & 0x00000001) != 0);
+            }
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             * @return The endpointId.
+             */
+            public context.ContextOuterClass.EndPointId getEndpointId() {
+                if (endpointIdBuilder_ == null) {
+                    return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
+                } else {
+                    return endpointIdBuilder_.getMessage();
+                }
+            }
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             */
+            public Builder setEndpointId(context.ContextOuterClass.EndPointId value) {
+                if (endpointIdBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    endpointId_ = value;
+                } else {
+                    endpointIdBuilder_.setMessage(value);
+                }
+                bitField0_ |= 0x00000001;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             */
+            public Builder setEndpointId(context.ContextOuterClass.EndPointId.Builder builderForValue) {
+                if (endpointIdBuilder_ == null) {
+                    endpointId_ = builderForValue.build();
+                } else {
+                    endpointIdBuilder_.setMessage(builderForValue.build());
+                }
+                bitField0_ |= 0x00000001;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             */
+            public Builder mergeEndpointId(context.ContextOuterClass.EndPointId value) {
+                if (endpointIdBuilder_ == null) {
+                    if (((bitField0_ & 0x00000001) != 0) && endpointId_ != null && endpointId_ != context.ContextOuterClass.EndPointId.getDefaultInstance()) {
+                        getEndpointIdBuilder().mergeFrom(value);
+                    } else {
+                        endpointId_ = value;
+                    }
+                } else {
+                    endpointIdBuilder_.mergeFrom(value);
+                }
+                bitField0_ |= 0x00000001;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             */
+            public Builder clearEndpointId() {
+                bitField0_ = (bitField0_ & ~0x00000001);
+                endpointId_ = null;
+                if (endpointIdBuilder_ != null) {
+                    endpointIdBuilder_.dispose();
+                    endpointIdBuilder_ = null;
+                }
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             */
+            public context.ContextOuterClass.EndPointId.Builder getEndpointIdBuilder() {
+                bitField0_ |= 0x00000001;
+                onChanged();
+                return getEndpointIdFieldBuilder().getBuilder();
+            }
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             */
+            public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
+                if (endpointIdBuilder_ != null) {
+                    return endpointIdBuilder_.getMessageOrBuilder();
+                } else {
+                    return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
+                }
+            }
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             */
+            private com.google.protobuf.SingleFieldBuilderV3 getEndpointIdFieldBuilder() {
+                if (endpointIdBuilder_ == null) {
+                    endpointIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(getEndpointId(), getParentForChildren(), isClean());
+                    endpointId_ = null;
+                }
+                return endpointIdBuilder_;
+            }
+
+            private ipowdm.Ipowdm.IpowdmRuleSet ruleSet_;
+
+            private com.google.protobuf.SingleFieldBuilderV3 ruleSetBuilder_;
+
+            /**
+             * .ipowdm.IpowdmRuleSet rule_set = 2;
+             * @return Whether the ruleSet field is set.
+             */
+            public boolean hasRuleSet() {
+                return ((bitField0_ & 0x00000002) != 0);
+            }
+
+            /**
+             * .ipowdm.IpowdmRuleSet rule_set = 2;
+             * @return The ruleSet.
+             */
+            public ipowdm.Ipowdm.IpowdmRuleSet getRuleSet() {
+                if (ruleSetBuilder_ == null) {
+                    return ruleSet_ == null ? ipowdm.Ipowdm.IpowdmRuleSet.getDefaultInstance() : ruleSet_;
+                } else {
+                    return ruleSetBuilder_.getMessage();
+                }
+            }
+
+            /**
+             * .ipowdm.IpowdmRuleSet rule_set = 2;
+             */
+            public Builder setRuleSet(ipowdm.Ipowdm.IpowdmRuleSet value) {
+                if (ruleSetBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ruleSet_ = value;
+                } else {
+                    ruleSetBuilder_.setMessage(value);
+                }
+                bitField0_ |= 0x00000002;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .ipowdm.IpowdmRuleSet rule_set = 2;
+             */
+            public Builder setRuleSet(ipowdm.Ipowdm.IpowdmRuleSet.Builder builderForValue) {
+                if (ruleSetBuilder_ == null) {
+                    ruleSet_ = builderForValue.build();
+                } else {
+                    ruleSetBuilder_.setMessage(builderForValue.build());
+                }
+                bitField0_ |= 0x00000002;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .ipowdm.IpowdmRuleSet rule_set = 2;
+             */
+            public Builder mergeRuleSet(ipowdm.Ipowdm.IpowdmRuleSet value) {
+                if (ruleSetBuilder_ == null) {
+                    if (((bitField0_ & 0x00000002) != 0) && ruleSet_ != null && ruleSet_ != ipowdm.Ipowdm.IpowdmRuleSet.getDefaultInstance()) {
+                        getRuleSetBuilder().mergeFrom(value);
+                    } else {
+                        ruleSet_ = value;
+                    }
+                } else {
+                    ruleSetBuilder_.mergeFrom(value);
+                }
+                bitField0_ |= 0x00000002;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .ipowdm.IpowdmRuleSet rule_set = 2;
+             */
+            public Builder clearRuleSet() {
+                bitField0_ = (bitField0_ & ~0x00000002);
+                ruleSet_ = null;
+                if (ruleSetBuilder_ != null) {
+                    ruleSetBuilder_.dispose();
+                    ruleSetBuilder_ = null;
+                }
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .ipowdm.IpowdmRuleSet rule_set = 2;
+             */
+            public ipowdm.Ipowdm.IpowdmRuleSet.Builder getRuleSetBuilder() {
+                bitField0_ |= 0x00000002;
+                onChanged();
+                return getRuleSetFieldBuilder().getBuilder();
+            }
+
+            /**
+             * .ipowdm.IpowdmRuleSet rule_set = 2;
+             */
+            public ipowdm.Ipowdm.IpowdmRuleSetOrBuilder getRuleSetOrBuilder() {
+                if (ruleSetBuilder_ != null) {
+                    return ruleSetBuilder_.getMessageOrBuilder();
+                } else {
+                    return ruleSet_ == null ? ipowdm.Ipowdm.IpowdmRuleSet.getDefaultInstance() : ruleSet_;
+                }
+            }
+
+            /**
+             * .ipowdm.IpowdmRuleSet rule_set = 2;
+             */
+            private com.google.protobuf.SingleFieldBuilderV3 getRuleSetFieldBuilder() {
+                if (ruleSetBuilder_ == null) {
+                    ruleSetBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(getRuleSet(), getParentForChildren(), isClean());
+                    ruleSet_ = null;
+                }
+                return ruleSetBuilder_;
+            }
+
+            @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.ConfigRule_IPOWDM)
+        }
+
+        // @@protoc_insertion_point(class_scope:context.ConfigRule_IPOWDM)
+        private static final context.ContextOuterClass.ConfigRule_IPOWDM DEFAULT_INSTANCE;
+
+        static {
+            DEFAULT_INSTANCE = new context.ContextOuterClass.ConfigRule_IPOWDM();
+        }
+
+        public static context.ContextOuterClass.ConfigRule_IPOWDM getDefaultInstance() {
+            return DEFAULT_INSTANCE;
+        }
+
+        private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+
+            @java.lang.Override
+            public ConfigRule_IPOWDM parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+                Builder builder = newBuilder();
+                try {
+                    builder.mergeFrom(input, extensionRegistry);
+                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    throw e.setUnfinishedMessage(builder.buildPartial());
+                } catch (com.google.protobuf.UninitializedMessageException e) {
+                    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.ConfigRule_IPOWDM getDefaultInstanceForType() {
+            return DEFAULT_INSTANCE;
+        }
+    }
+
+    public interface ConfigRule_TAPI_LSPOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConfigRule_TAPI_LSP)
+    com.google.protobuf.MessageOrBuilder {
+
+        /**
+         * .context.EndPointId endpoint_id = 1;
+         * @return Whether the endpointId field is set.
+         */
+        boolean hasEndpointId();
+
+        /**
+         * .context.EndPointId endpoint_id = 1;
+         * @return The endpointId.
+         */
+        context.ContextOuterClass.EndPointId getEndpointId();
+
+        /**
+         * .context.EndPointId endpoint_id = 1;
+         */
+        context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder();
+
+        /**
+         * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+         */
+        java.util.List getRuleSetList();
+
+        /**
+         * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+         */
+        tapi_lsp.TapiLsp.TapiLspRuleSet getRuleSet(int index);
+
+        /**
+         * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+         */
+        int getRuleSetCount();
+
+        /**
+         * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+         */
+        java.util.List getRuleSetOrBuilderList();
+
+        /**
+         * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+         */
+        tapi_lsp.TapiLsp.TapiLspRuleSetOrBuilder getRuleSetOrBuilder(int index);
+    }
+
+    /**
+     * Protobuf type {@code context.ConfigRule_TAPI_LSP}
+     */
+    public static final class ConfigRule_TAPI_LSP extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConfigRule_TAPI_LSP)
+    ConfigRule_TAPI_LSPOrBuilder {
+
+        private static final long serialVersionUID = 0L;
+
+        // Use ConfigRule_TAPI_LSP.newBuilder() to construct.
+        private ConfigRule_TAPI_LSP(com.google.protobuf.GeneratedMessageV3.Builder builder) {
+            super(builder);
+        }
+
+        private ConfigRule_TAPI_LSP() {
+            ruleSet_ = java.util.Collections.emptyList();
+        }
+
+        @java.lang.Override
+        @SuppressWarnings({ "unused" })
+        protected java.lang.Object newInstance(UnusedPrivateParameter unused) {
+            return new ConfigRule_TAPI_LSP();
+        }
+
+        public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+            return context.ContextOuterClass.internal_static_context_ConfigRule_TAPI_LSP_descriptor;
+        }
+
+        @java.lang.Override
+        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+            return context.ContextOuterClass.internal_static_context_ConfigRule_TAPI_LSP_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.ConfigRule_TAPI_LSP.class, context.ContextOuterClass.ConfigRule_TAPI_LSP.Builder.class);
+        }
+
+        public static final int ENDPOINT_ID_FIELD_NUMBER = 1;
+
+        private context.ContextOuterClass.EndPointId endpointId_;
+
+        /**
+         * .context.EndPointId endpoint_id = 1;
+         * @return Whether the endpointId field is set.
+         */
+        @java.lang.Override
+        public boolean hasEndpointId() {
+            return endpointId_ != null;
+        }
+
+        /**
+         * .context.EndPointId endpoint_id = 1;
+         * @return The endpointId.
+         */
+        @java.lang.Override
+        public context.ContextOuterClass.EndPointId getEndpointId() {
+            return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
+        }
+
+        /**
+         * .context.EndPointId endpoint_id = 1;
+         */
+        @java.lang.Override
+        public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
+            return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
+        }
+
+        public static final int RULE_SET_FIELD_NUMBER = 2;
+
+        @SuppressWarnings("serial")
+        private java.util.List ruleSet_;
+
+        /**
+         * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+         */
+        @java.lang.Override
+        public java.util.List getRuleSetList() {
+            return ruleSet_;
+        }
+
+        /**
+         * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+         */
+        @java.lang.Override
+        public java.util.List getRuleSetOrBuilderList() {
+            return ruleSet_;
+        }
+
+        /**
+         * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+         */
+        @java.lang.Override
+        public int getRuleSetCount() {
+            return ruleSet_.size();
+        }
+
+        /**
+         * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+         */
+        @java.lang.Override
+        public tapi_lsp.TapiLsp.TapiLspRuleSet getRuleSet(int index) {
+            return ruleSet_.get(index);
+        }
+
+        /**
+         * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+         */
+        @java.lang.Override
+        public tapi_lsp.TapiLsp.TapiLspRuleSetOrBuilder getRuleSetOrBuilder(int index) {
+            return ruleSet_.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 (endpointId_ != null) {
+                output.writeMessage(1, getEndpointId());
+            }
+            for (int i = 0; i < ruleSet_.size(); i++) {
+                output.writeMessage(2, ruleSet_.get(i));
+            }
+            getUnknownFields().writeTo(output);
+        }
+
+        @java.lang.Override
+        public int getSerializedSize() {
+            int size = memoizedSize;
+            if (size != -1)
+                return size;
+            size = 0;
+            if (endpointId_ != null) {
+                size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getEndpointId());
+            }
+            for (int i = 0; i < ruleSet_.size(); i++) {
+                size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, ruleSet_.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.ConfigRule_TAPI_LSP)) {
+                return super.equals(obj);
+            }
+            context.ContextOuterClass.ConfigRule_TAPI_LSP other = (context.ContextOuterClass.ConfigRule_TAPI_LSP) obj;
+            if (hasEndpointId() != other.hasEndpointId())
+                return false;
+            if (hasEndpointId()) {
+                if (!getEndpointId().equals(other.getEndpointId()))
+                    return false;
+            }
+            if (!getRuleSetList().equals(other.getRuleSetList()))
+                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 (hasEndpointId()) {
+                hash = (37 * hash) + ENDPOINT_ID_FIELD_NUMBER;
+                hash = (53 * hash) + getEndpointId().hashCode();
+            }
+            if (getRuleSetCount() > 0) {
+                hash = (37 * hash) + RULE_SET_FIELD_NUMBER;
+                hash = (53 * hash) + getRuleSetList().hashCode();
+            }
+            hash = (29 * hash) + getUnknownFields().hashCode();
+            memoizedHashCode = hash;
+            return hash;
+        }
+
+        public static context.ContextOuterClass.ConfigRule_TAPI_LSP parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static context.ContextOuterClass.ConfigRule_TAPI_LSP parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static context.ContextOuterClass.ConfigRule_TAPI_LSP parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static context.ContextOuterClass.ConfigRule_TAPI_LSP 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.ConfigRule_TAPI_LSP parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static context.ContextOuterClass.ConfigRule_TAPI_LSP parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static context.ContextOuterClass.ConfigRule_TAPI_LSP parseFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static context.ContextOuterClass.ConfigRule_TAPI_LSP 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.ConfigRule_TAPI_LSP parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input);
+        }
+
+        public static context.ContextOuterClass.ConfigRule_TAPI_LSP 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.ConfigRule_TAPI_LSP parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static context.ContextOuterClass.ConfigRule_TAPI_LSP 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.ConfigRule_TAPI_LSP 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.ConfigRule_TAPI_LSP}
+         */
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConfigRule_TAPI_LSP)
+        context.ContextOuterClass.ConfigRule_TAPI_LSPOrBuilder {
+
+            public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+                return context.ContextOuterClass.internal_static_context_ConfigRule_TAPI_LSP_descriptor;
+            }
+
+            @java.lang.Override
+            protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+                return context.ContextOuterClass.internal_static_context_ConfigRule_TAPI_LSP_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.ConfigRule_TAPI_LSP.class, context.ContextOuterClass.ConfigRule_TAPI_LSP.Builder.class);
+            }
+
+            // Construct using context.ContextOuterClass.ConfigRule_TAPI_LSP.newBuilder()
+            private Builder() {
+            }
+
+            private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+                super(parent);
+            }
+
+            @java.lang.Override
+            public Builder clear() {
+                super.clear();
+                bitField0_ = 0;
+                endpointId_ = null;
+                if (endpointIdBuilder_ != null) {
+                    endpointIdBuilder_.dispose();
+                    endpointIdBuilder_ = null;
+                }
+                if (ruleSetBuilder_ == null) {
+                    ruleSet_ = java.util.Collections.emptyList();
+                } else {
+                    ruleSet_ = null;
+                    ruleSetBuilder_.clear();
+                }
+                bitField0_ = (bitField0_ & ~0x00000002);
+                return this;
+            }
+
+            @java.lang.Override
+            public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+                return context.ContextOuterClass.internal_static_context_ConfigRule_TAPI_LSP_descriptor;
+            }
+
+            @java.lang.Override
+            public context.ContextOuterClass.ConfigRule_TAPI_LSP getDefaultInstanceForType() {
+                return context.ContextOuterClass.ConfigRule_TAPI_LSP.getDefaultInstance();
+            }
+
+            @java.lang.Override
+            public context.ContextOuterClass.ConfigRule_TAPI_LSP build() {
+                context.ContextOuterClass.ConfigRule_TAPI_LSP result = buildPartial();
+                if (!result.isInitialized()) {
+                    throw newUninitializedMessageException(result);
+                }
+                return result;
+            }
+
+            @java.lang.Override
+            public context.ContextOuterClass.ConfigRule_TAPI_LSP buildPartial() {
+                context.ContextOuterClass.ConfigRule_TAPI_LSP result = new context.ContextOuterClass.ConfigRule_TAPI_LSP(this);
+                buildPartialRepeatedFields(result);
+                if (bitField0_ != 0) {
+                    buildPartial0(result);
+                }
+                onBuilt();
+                return result;
+            }
+
+            private void buildPartialRepeatedFields(context.ContextOuterClass.ConfigRule_TAPI_LSP result) {
+                if (ruleSetBuilder_ == null) {
+                    if (((bitField0_ & 0x00000002) != 0)) {
+                        ruleSet_ = java.util.Collections.unmodifiableList(ruleSet_);
+                        bitField0_ = (bitField0_ & ~0x00000002);
+                    }
+                    result.ruleSet_ = ruleSet_;
+                } else {
+                    result.ruleSet_ = ruleSetBuilder_.build();
+                }
+            }
+
+            private void buildPartial0(context.ContextOuterClass.ConfigRule_TAPI_LSP result) {
+                int from_bitField0_ = bitField0_;
+                if (((from_bitField0_ & 0x00000001) != 0)) {
+                    result.endpointId_ = endpointIdBuilder_ == null ? endpointId_ : endpointIdBuilder_.build();
+                }
+            }
+
+            @java.lang.Override
+            public Builder mergeFrom(com.google.protobuf.Message other) {
+                if (other instanceof context.ContextOuterClass.ConfigRule_TAPI_LSP) {
+                    return mergeFrom((context.ContextOuterClass.ConfigRule_TAPI_LSP) other);
+                } else {
+                    super.mergeFrom(other);
+                    return this;
+                }
+            }
+
+            public Builder mergeFrom(context.ContextOuterClass.ConfigRule_TAPI_LSP other) {
+                if (other == context.ContextOuterClass.ConfigRule_TAPI_LSP.getDefaultInstance())
+                    return this;
+                if (other.hasEndpointId()) {
+                    mergeEndpointId(other.getEndpointId());
+                }
+                if (ruleSetBuilder_ == null) {
+                    if (!other.ruleSet_.isEmpty()) {
+                        if (ruleSet_.isEmpty()) {
+                            ruleSet_ = other.ruleSet_;
+                            bitField0_ = (bitField0_ & ~0x00000002);
+                        } else {
+                            ensureRuleSetIsMutable();
+                            ruleSet_.addAll(other.ruleSet_);
+                        }
+                        onChanged();
+                    }
+                } else {
+                    if (!other.ruleSet_.isEmpty()) {
+                        if (ruleSetBuilder_.isEmpty()) {
+                            ruleSetBuilder_.dispose();
+                            ruleSetBuilder_ = null;
+                            ruleSet_ = other.ruleSet_;
+                            bitField0_ = (bitField0_ & ~0x00000002);
+                            ruleSetBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getRuleSetFieldBuilder() : null;
+                        } else {
+                            ruleSetBuilder_.addAllMessages(other.ruleSet_);
+                        }
+                    }
+                }
+                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(getEndpointIdFieldBuilder().getBuilder(), extensionRegistry);
+                                    bitField0_ |= 0x00000001;
+                                    break;
+                                }
+                            // case 10
+                            case 18:
+                                {
+                                    tapi_lsp.TapiLsp.TapiLspRuleSet m = input.readMessage(tapi_lsp.TapiLsp.TapiLspRuleSet.parser(), extensionRegistry);
+                                    if (ruleSetBuilder_ == null) {
+                                        ensureRuleSetIsMutable();
+                                        ruleSet_.add(m);
+                                    } else {
+                                        ruleSetBuilder_.addMessage(m);
+                                    }
+                                    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.EndPointId endpointId_;
+
+            private com.google.protobuf.SingleFieldBuilderV3 endpointIdBuilder_;
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             * @return Whether the endpointId field is set.
+             */
+            public boolean hasEndpointId() {
+                return ((bitField0_ & 0x00000001) != 0);
+            }
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             * @return The endpointId.
+             */
+            public context.ContextOuterClass.EndPointId getEndpointId() {
+                if (endpointIdBuilder_ == null) {
+                    return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
+                } else {
+                    return endpointIdBuilder_.getMessage();
+                }
+            }
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             */
+            public Builder setEndpointId(context.ContextOuterClass.EndPointId value) {
+                if (endpointIdBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    endpointId_ = value;
+                } else {
+                    endpointIdBuilder_.setMessage(value);
+                }
+                bitField0_ |= 0x00000001;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             */
+            public Builder setEndpointId(context.ContextOuterClass.EndPointId.Builder builderForValue) {
+                if (endpointIdBuilder_ == null) {
+                    endpointId_ = builderForValue.build();
+                } else {
+                    endpointIdBuilder_.setMessage(builderForValue.build());
+                }
+                bitField0_ |= 0x00000001;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             */
+            public Builder mergeEndpointId(context.ContextOuterClass.EndPointId value) {
+                if (endpointIdBuilder_ == null) {
+                    if (((bitField0_ & 0x00000001) != 0) && endpointId_ != null && endpointId_ != context.ContextOuterClass.EndPointId.getDefaultInstance()) {
+                        getEndpointIdBuilder().mergeFrom(value);
+                    } else {
+                        endpointId_ = value;
+                    }
+                } else {
+                    endpointIdBuilder_.mergeFrom(value);
+                }
+                bitField0_ |= 0x00000001;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             */
+            public Builder clearEndpointId() {
+                bitField0_ = (bitField0_ & ~0x00000001);
+                endpointId_ = null;
+                if (endpointIdBuilder_ != null) {
+                    endpointIdBuilder_.dispose();
+                    endpointIdBuilder_ = null;
+                }
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             */
+            public context.ContextOuterClass.EndPointId.Builder getEndpointIdBuilder() {
+                bitField0_ |= 0x00000001;
+                onChanged();
+                return getEndpointIdFieldBuilder().getBuilder();
+            }
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             */
+            public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
+                if (endpointIdBuilder_ != null) {
+                    return endpointIdBuilder_.getMessageOrBuilder();
+                } else {
+                    return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
+                }
+            }
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             */
+            private com.google.protobuf.SingleFieldBuilderV3 getEndpointIdFieldBuilder() {
+                if (endpointIdBuilder_ == null) {
+                    endpointIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(getEndpointId(), getParentForChildren(), isClean());
+                    endpointId_ = null;
+                }
+                return endpointIdBuilder_;
+            }
+
+            private java.util.List ruleSet_ = java.util.Collections.emptyList();
+
+            private void ensureRuleSetIsMutable() {
+                if (!((bitField0_ & 0x00000002) != 0)) {
+                    ruleSet_ = new java.util.ArrayList(ruleSet_);
+                    bitField0_ |= 0x00000002;
+                }
+            }
+
+            private com.google.protobuf.RepeatedFieldBuilderV3 ruleSetBuilder_;
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public java.util.List getRuleSetList() {
+                if (ruleSetBuilder_ == null) {
+                    return java.util.Collections.unmodifiableList(ruleSet_);
+                } else {
+                    return ruleSetBuilder_.getMessageList();
+                }
+            }
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public int getRuleSetCount() {
+                if (ruleSetBuilder_ == null) {
+                    return ruleSet_.size();
+                } else {
+                    return ruleSetBuilder_.getCount();
+                }
+            }
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public tapi_lsp.TapiLsp.TapiLspRuleSet getRuleSet(int index) {
+                if (ruleSetBuilder_ == null) {
+                    return ruleSet_.get(index);
+                } else {
+                    return ruleSetBuilder_.getMessage(index);
+                }
+            }
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public Builder setRuleSet(int index, tapi_lsp.TapiLsp.TapiLspRuleSet value) {
+                if (ruleSetBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureRuleSetIsMutable();
+                    ruleSet_.set(index, value);
+                    onChanged();
+                } else {
+                    ruleSetBuilder_.setMessage(index, value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public Builder setRuleSet(int index, tapi_lsp.TapiLsp.TapiLspRuleSet.Builder builderForValue) {
+                if (ruleSetBuilder_ == null) {
+                    ensureRuleSetIsMutable();
+                    ruleSet_.set(index, builderForValue.build());
+                    onChanged();
+                } else {
+                    ruleSetBuilder_.setMessage(index, builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public Builder addRuleSet(tapi_lsp.TapiLsp.TapiLspRuleSet value) {
+                if (ruleSetBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureRuleSetIsMutable();
+                    ruleSet_.add(value);
+                    onChanged();
+                } else {
+                    ruleSetBuilder_.addMessage(value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public Builder addRuleSet(int index, tapi_lsp.TapiLsp.TapiLspRuleSet value) {
+                if (ruleSetBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureRuleSetIsMutable();
+                    ruleSet_.add(index, value);
+                    onChanged();
+                } else {
+                    ruleSetBuilder_.addMessage(index, value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public Builder addRuleSet(tapi_lsp.TapiLsp.TapiLspRuleSet.Builder builderForValue) {
+                if (ruleSetBuilder_ == null) {
+                    ensureRuleSetIsMutable();
+                    ruleSet_.add(builderForValue.build());
+                    onChanged();
+                } else {
+                    ruleSetBuilder_.addMessage(builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public Builder addRuleSet(int index, tapi_lsp.TapiLsp.TapiLspRuleSet.Builder builderForValue) {
+                if (ruleSetBuilder_ == null) {
+                    ensureRuleSetIsMutable();
+                    ruleSet_.add(index, builderForValue.build());
+                    onChanged();
+                } else {
+                    ruleSetBuilder_.addMessage(index, builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public Builder addAllRuleSet(java.lang.Iterable values) {
+                if (ruleSetBuilder_ == null) {
+                    ensureRuleSetIsMutable();
+                    com.google.protobuf.AbstractMessageLite.Builder.addAll(values, ruleSet_);
+                    onChanged();
+                } else {
+                    ruleSetBuilder_.addAllMessages(values);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public Builder clearRuleSet() {
+                if (ruleSetBuilder_ == null) {
+                    ruleSet_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000002);
+                    onChanged();
+                } else {
+                    ruleSetBuilder_.clear();
+                }
+                return this;
+            }
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public Builder removeRuleSet(int index) {
+                if (ruleSetBuilder_ == null) {
+                    ensureRuleSetIsMutable();
+                    ruleSet_.remove(index);
+                    onChanged();
+                } else {
+                    ruleSetBuilder_.remove(index);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public tapi_lsp.TapiLsp.TapiLspRuleSet.Builder getRuleSetBuilder(int index) {
+                return getRuleSetFieldBuilder().getBuilder(index);
+            }
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public tapi_lsp.TapiLsp.TapiLspRuleSetOrBuilder getRuleSetOrBuilder(int index) {
+                if (ruleSetBuilder_ == null) {
+                    return ruleSet_.get(index);
+                } else {
+                    return ruleSetBuilder_.getMessageOrBuilder(index);
+                }
+            }
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public java.util.List getRuleSetOrBuilderList() {
+                if (ruleSetBuilder_ != null) {
+                    return ruleSetBuilder_.getMessageOrBuilderList();
+                } else {
+                    return java.util.Collections.unmodifiableList(ruleSet_);
+                }
+            }
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public tapi_lsp.TapiLsp.TapiLspRuleSet.Builder addRuleSetBuilder() {
+                return getRuleSetFieldBuilder().addBuilder(tapi_lsp.TapiLsp.TapiLspRuleSet.getDefaultInstance());
+            }
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public tapi_lsp.TapiLsp.TapiLspRuleSet.Builder addRuleSetBuilder(int index) {
+                return getRuleSetFieldBuilder().addBuilder(index, tapi_lsp.TapiLsp.TapiLspRuleSet.getDefaultInstance());
+            }
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public java.util.List getRuleSetBuilderList() {
+                return getRuleSetFieldBuilder().getBuilderList();
+            }
+
+            private com.google.protobuf.RepeatedFieldBuilderV3 getRuleSetFieldBuilder() {
+                if (ruleSetBuilder_ == null) {
+                    ruleSetBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(ruleSet_, ((bitField0_ & 0x00000002) != 0), getParentForChildren(), isClean());
+                    ruleSet_ = null;
+                }
+                return ruleSetBuilder_;
+            }
+
+            @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.ConfigRule_TAPI_LSP)
+        }
+
+        // @@protoc_insertion_point(class_scope:context.ConfigRule_TAPI_LSP)
+        private static final context.ContextOuterClass.ConfigRule_TAPI_LSP DEFAULT_INSTANCE;
+
+        static {
+            DEFAULT_INSTANCE = new context.ContextOuterClass.ConfigRule_TAPI_LSP();
+        }
+
+        public static context.ContextOuterClass.ConfigRule_TAPI_LSP getDefaultInstance() {
+            return DEFAULT_INSTANCE;
+        }
+
+        private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+
+            @java.lang.Override
+            public ConfigRule_TAPI_LSP parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+                Builder builder = newBuilder();
+                try {
+                    builder.mergeFrom(input, extensionRegistry);
+                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    throw e.setUnfinishedMessage(builder.buildPartial());
+                } catch (com.google.protobuf.UninitializedMessageException e) {
+                    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.ConfigRule_TAPI_LSP getDefaultInstanceForType() {
+            return DEFAULT_INSTANCE;
+        }
+    }
+
     public interface ConfigRule_IP_LINKOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConfigRule_IP_LINK)
     com.google.protobuf.MessageOrBuilder {
 
@@ -61277,6 +62952,40 @@ public final class ContextOuterClass {
          */
         context.ContextOuterClass.ConfigRule_IP_LINKOrBuilder getIpLinkOrBuilder();
 
+        /**
+         * .context.ConfigRule_TAPI_LSP tapi_lsp = 5;
+         * @return Whether the tapiLsp field is set.
+         */
+        boolean hasTapiLsp();
+
+        /**
+         * .context.ConfigRule_TAPI_LSP tapi_lsp = 5;
+         * @return The tapiLsp.
+         */
+        context.ContextOuterClass.ConfigRule_TAPI_LSP getTapiLsp();
+
+        /**
+         * .context.ConfigRule_TAPI_LSP tapi_lsp = 5;
+         */
+        context.ContextOuterClass.ConfigRule_TAPI_LSPOrBuilder getTapiLspOrBuilder();
+
+        /**
+         * .context.ConfigRule_IPOWDM ipowdm = 6;
+         * @return Whether the ipowdm field is set.
+         */
+        boolean hasIpowdm();
+
+        /**
+         * .context.ConfigRule_IPOWDM ipowdm = 6;
+         * @return The ipowdm.
+         */
+        context.ContextOuterClass.ConfigRule_IPOWDM getIpowdm();
+
+        /**
+         * .context.ConfigRule_IPOWDM ipowdm = 6;
+         */
+        context.ContextOuterClass.ConfigRule_IPOWDMOrBuilder getIpowdmOrBuilder();
+
         context.ContextOuterClass.ConfigRule.ConfigRuleCase getConfigRuleCase();
     }
 
@@ -61319,7 +63028,12 @@ public final class ContextOuterClass {
 
         public enum ConfigRuleCase implements com.google.protobuf.Internal.EnumLite, com.google.protobuf.AbstractMessage.InternalOneOfEnum {
 
-            CUSTOM(2), ACL(3), IP_LINK(4), CONFIGRULE_NOT_SET(0);
+            CUSTOM(2),
+            ACL(3),
+            IP_LINK(4),
+            TAPI_LSP(5),
+            IPOWDM(6),
+            CONFIGRULE_NOT_SET(0);
 
             private final int value;
 
@@ -61345,6 +63059,10 @@ public final class ContextOuterClass {
                         return ACL;
                     case 4:
                         return IP_LINK;
+                    case 5:
+                        return TAPI_LSP;
+                    case 6:
+                        return IPOWDM;
                     case 0:
                         return CONFIGRULE_NOT_SET;
                     default:
@@ -61486,6 +63204,74 @@ public final class ContextOuterClass {
             return context.ContextOuterClass.ConfigRule_IP_LINK.getDefaultInstance();
         }
 
+        public static final int TAPI_LSP_FIELD_NUMBER = 5;
+
+        /**
+         * .context.ConfigRule_TAPI_LSP tapi_lsp = 5;
+         * @return Whether the tapiLsp field is set.
+         */
+        @java.lang.Override
+        public boolean hasTapiLsp() {
+            return configRuleCase_ == 5;
+        }
+
+        /**
+         * .context.ConfigRule_TAPI_LSP tapi_lsp = 5;
+         * @return The tapiLsp.
+         */
+        @java.lang.Override
+        public context.ContextOuterClass.ConfigRule_TAPI_LSP getTapiLsp() {
+            if (configRuleCase_ == 5) {
+                return (context.ContextOuterClass.ConfigRule_TAPI_LSP) configRule_;
+            }
+            return context.ContextOuterClass.ConfigRule_TAPI_LSP.getDefaultInstance();
+        }
+
+        /**
+         * .context.ConfigRule_TAPI_LSP tapi_lsp = 5;
+         */
+        @java.lang.Override
+        public context.ContextOuterClass.ConfigRule_TAPI_LSPOrBuilder getTapiLspOrBuilder() {
+            if (configRuleCase_ == 5) {
+                return (context.ContextOuterClass.ConfigRule_TAPI_LSP) configRule_;
+            }
+            return context.ContextOuterClass.ConfigRule_TAPI_LSP.getDefaultInstance();
+        }
+
+        public static final int IPOWDM_FIELD_NUMBER = 6;
+
+        /**
+         * .context.ConfigRule_IPOWDM ipowdm = 6;
+         * @return Whether the ipowdm field is set.
+         */
+        @java.lang.Override
+        public boolean hasIpowdm() {
+            return configRuleCase_ == 6;
+        }
+
+        /**
+         * .context.ConfigRule_IPOWDM ipowdm = 6;
+         * @return The ipowdm.
+         */
+        @java.lang.Override
+        public context.ContextOuterClass.ConfigRule_IPOWDM getIpowdm() {
+            if (configRuleCase_ == 6) {
+                return (context.ContextOuterClass.ConfigRule_IPOWDM) configRule_;
+            }
+            return context.ContextOuterClass.ConfigRule_IPOWDM.getDefaultInstance();
+        }
+
+        /**
+         * .context.ConfigRule_IPOWDM ipowdm = 6;
+         */
+        @java.lang.Override
+        public context.ContextOuterClass.ConfigRule_IPOWDMOrBuilder getIpowdmOrBuilder() {
+            if (configRuleCase_ == 6) {
+                return (context.ContextOuterClass.ConfigRule_IPOWDM) configRule_;
+            }
+            return context.ContextOuterClass.ConfigRule_IPOWDM.getDefaultInstance();
+        }
+
         private byte memoizedIsInitialized = -1;
 
         @java.lang.Override
@@ -61513,6 +63299,12 @@ public final class ContextOuterClass {
             if (configRuleCase_ == 4) {
                 output.writeMessage(4, (context.ContextOuterClass.ConfigRule_IP_LINK) configRule_);
             }
+            if (configRuleCase_ == 5) {
+                output.writeMessage(5, (context.ContextOuterClass.ConfigRule_TAPI_LSP) configRule_);
+            }
+            if (configRuleCase_ == 6) {
+                output.writeMessage(6, (context.ContextOuterClass.ConfigRule_IPOWDM) configRule_);
+            }
             getUnknownFields().writeTo(output);
         }
 
@@ -61534,6 +63326,12 @@ public final class ContextOuterClass {
             if (configRuleCase_ == 4) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(4, (context.ContextOuterClass.ConfigRule_IP_LINK) configRule_);
             }
+            if (configRuleCase_ == 5) {
+                size += com.google.protobuf.CodedOutputStream.computeMessageSize(5, (context.ContextOuterClass.ConfigRule_TAPI_LSP) configRule_);
+            }
+            if (configRuleCase_ == 6) {
+                size += com.google.protobuf.CodedOutputStream.computeMessageSize(6, (context.ContextOuterClass.ConfigRule_IPOWDM) configRule_);
+            }
             size += getUnknownFields().getSerializedSize();
             memoizedSize = size;
             return size;
@@ -61565,6 +63363,14 @@ public final class ContextOuterClass {
                     if (!getIpLink().equals(other.getIpLink()))
                         return false;
                     break;
+                case 5:
+                    if (!getTapiLsp().equals(other.getTapiLsp()))
+                        return false;
+                    break;
+                case 6:
+                    if (!getIpowdm().equals(other.getIpowdm()))
+                        return false;
+                    break;
                 case 0:
                 default:
             }
@@ -61595,6 +63401,14 @@ public final class ContextOuterClass {
                     hash = (37 * hash) + IP_LINK_FIELD_NUMBER;
                     hash = (53 * hash) + getIpLink().hashCode();
                     break;
+                case 5:
+                    hash = (37 * hash) + TAPI_LSP_FIELD_NUMBER;
+                    hash = (53 * hash) + getTapiLsp().hashCode();
+                    break;
+                case 6:
+                    hash = (37 * hash) + IPOWDM_FIELD_NUMBER;
+                    hash = (53 * hash) + getIpowdm().hashCode();
+                    break;
                 case 0:
                 default:
             }
@@ -61712,6 +63526,12 @@ public final class ContextOuterClass {
                 if (ipLinkBuilder_ != null) {
                     ipLinkBuilder_.clear();
                 }
+                if (tapiLspBuilder_ != null) {
+                    tapiLspBuilder_.clear();
+                }
+                if (ipowdmBuilder_ != null) {
+                    ipowdmBuilder_.clear();
+                }
                 configRuleCase_ = 0;
                 configRule_ = null;
                 return this;
@@ -61766,6 +63586,12 @@ public final class ContextOuterClass {
                 if (configRuleCase_ == 4 && ipLinkBuilder_ != null) {
                     result.configRule_ = ipLinkBuilder_.build();
                 }
+                if (configRuleCase_ == 5 && tapiLspBuilder_ != null) {
+                    result.configRule_ = tapiLspBuilder_.build();
+                }
+                if (configRuleCase_ == 6 && ipowdmBuilder_ != null) {
+                    result.configRule_ = ipowdmBuilder_.build();
+                }
             }
 
             @java.lang.Override
@@ -61800,6 +63626,16 @@ public final class ContextOuterClass {
                             mergeIpLink(other.getIpLink());
                             break;
                         }
+                    case TAPI_LSP:
+                        {
+                            mergeTapiLsp(other.getTapiLsp());
+                            break;
+                        }
+                    case IPOWDM:
+                        {
+                            mergeIpowdm(other.getIpowdm());
+                            break;
+                        }
                     case CONFIGRULE_NOT_SET:
                         {
                             break;
@@ -61856,6 +63692,20 @@ public final class ContextOuterClass {
                                     break;
                                 }
                             // case 34
+                            case 42:
+                                {
+                                    input.readMessage(getTapiLspFieldBuilder().getBuilder(), extensionRegistry);
+                                    configRuleCase_ = 5;
+                                    break;
+                                }
+                            // case 42
+                            case 50:
+                                {
+                                    input.readMessage(getIpowdmFieldBuilder().getBuilder(), extensionRegistry);
+                                    configRuleCase_ = 6;
+                                    break;
+                                }
+                            // case 50
                             default:
                                 {
                                     if (!super.parseUnknownField(input, extensionRegistry, tag)) {
@@ -62376,6 +64226,288 @@ public final class ContextOuterClass {
                 return ipLinkBuilder_;
             }
 
+            private com.google.protobuf.SingleFieldBuilderV3 tapiLspBuilder_;
+
+            /**
+             * .context.ConfigRule_TAPI_LSP tapi_lsp = 5;
+             * @return Whether the tapiLsp field is set.
+             */
+            @java.lang.Override
+            public boolean hasTapiLsp() {
+                return configRuleCase_ == 5;
+            }
+
+            /**
+             * .context.ConfigRule_TAPI_LSP tapi_lsp = 5;
+             * @return The tapiLsp.
+             */
+            @java.lang.Override
+            public context.ContextOuterClass.ConfigRule_TAPI_LSP getTapiLsp() {
+                if (tapiLspBuilder_ == null) {
+                    if (configRuleCase_ == 5) {
+                        return (context.ContextOuterClass.ConfigRule_TAPI_LSP) configRule_;
+                    }
+                    return context.ContextOuterClass.ConfigRule_TAPI_LSP.getDefaultInstance();
+                } else {
+                    if (configRuleCase_ == 5) {
+                        return tapiLspBuilder_.getMessage();
+                    }
+                    return context.ContextOuterClass.ConfigRule_TAPI_LSP.getDefaultInstance();
+                }
+            }
+
+            /**
+             * .context.ConfigRule_TAPI_LSP tapi_lsp = 5;
+             */
+            public Builder setTapiLsp(context.ContextOuterClass.ConfigRule_TAPI_LSP value) {
+                if (tapiLspBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    configRule_ = value;
+                    onChanged();
+                } else {
+                    tapiLspBuilder_.setMessage(value);
+                }
+                configRuleCase_ = 5;
+                return this;
+            }
+
+            /**
+             * .context.ConfigRule_TAPI_LSP tapi_lsp = 5;
+             */
+            public Builder setTapiLsp(context.ContextOuterClass.ConfigRule_TAPI_LSP.Builder builderForValue) {
+                if (tapiLspBuilder_ == null) {
+                    configRule_ = builderForValue.build();
+                    onChanged();
+                } else {
+                    tapiLspBuilder_.setMessage(builderForValue.build());
+                }
+                configRuleCase_ = 5;
+                return this;
+            }
+
+            /**
+             * .context.ConfigRule_TAPI_LSP tapi_lsp = 5;
+             */
+            public Builder mergeTapiLsp(context.ContextOuterClass.ConfigRule_TAPI_LSP value) {
+                if (tapiLspBuilder_ == null) {
+                    if (configRuleCase_ == 5 && configRule_ != context.ContextOuterClass.ConfigRule_TAPI_LSP.getDefaultInstance()) {
+                        configRule_ = context.ContextOuterClass.ConfigRule_TAPI_LSP.newBuilder((context.ContextOuterClass.ConfigRule_TAPI_LSP) configRule_).mergeFrom(value).buildPartial();
+                    } else {
+                        configRule_ = value;
+                    }
+                    onChanged();
+                } else {
+                    if (configRuleCase_ == 5) {
+                        tapiLspBuilder_.mergeFrom(value);
+                    } else {
+                        tapiLspBuilder_.setMessage(value);
+                    }
+                }
+                configRuleCase_ = 5;
+                return this;
+            }
+
+            /**
+             * .context.ConfigRule_TAPI_LSP tapi_lsp = 5;
+             */
+            public Builder clearTapiLsp() {
+                if (tapiLspBuilder_ == null) {
+                    if (configRuleCase_ == 5) {
+                        configRuleCase_ = 0;
+                        configRule_ = null;
+                        onChanged();
+                    }
+                } else {
+                    if (configRuleCase_ == 5) {
+                        configRuleCase_ = 0;
+                        configRule_ = null;
+                    }
+                    tapiLspBuilder_.clear();
+                }
+                return this;
+            }
+
+            /**
+             * .context.ConfigRule_TAPI_LSP tapi_lsp = 5;
+             */
+            public context.ContextOuterClass.ConfigRule_TAPI_LSP.Builder getTapiLspBuilder() {
+                return getTapiLspFieldBuilder().getBuilder();
+            }
+
+            /**
+             * .context.ConfigRule_TAPI_LSP tapi_lsp = 5;
+             */
+            @java.lang.Override
+            public context.ContextOuterClass.ConfigRule_TAPI_LSPOrBuilder getTapiLspOrBuilder() {
+                if ((configRuleCase_ == 5) && (tapiLspBuilder_ != null)) {
+                    return tapiLspBuilder_.getMessageOrBuilder();
+                } else {
+                    if (configRuleCase_ == 5) {
+                        return (context.ContextOuterClass.ConfigRule_TAPI_LSP) configRule_;
+                    }
+                    return context.ContextOuterClass.ConfigRule_TAPI_LSP.getDefaultInstance();
+                }
+            }
+
+            /**
+             * .context.ConfigRule_TAPI_LSP tapi_lsp = 5;
+             */
+            private com.google.protobuf.SingleFieldBuilderV3 getTapiLspFieldBuilder() {
+                if (tapiLspBuilder_ == null) {
+                    if (!(configRuleCase_ == 5)) {
+                        configRule_ = context.ContextOuterClass.ConfigRule_TAPI_LSP.getDefaultInstance();
+                    }
+                    tapiLspBuilder_ = new com.google.protobuf.SingleFieldBuilderV3((context.ContextOuterClass.ConfigRule_TAPI_LSP) configRule_, getParentForChildren(), isClean());
+                    configRule_ = null;
+                }
+                configRuleCase_ = 5;
+                onChanged();
+                return tapiLspBuilder_;
+            }
+
+            private com.google.protobuf.SingleFieldBuilderV3 ipowdmBuilder_;
+
+            /**
+             * .context.ConfigRule_IPOWDM ipowdm = 6;
+             * @return Whether the ipowdm field is set.
+             */
+            @java.lang.Override
+            public boolean hasIpowdm() {
+                return configRuleCase_ == 6;
+            }
+
+            /**
+             * .context.ConfigRule_IPOWDM ipowdm = 6;
+             * @return The ipowdm.
+             */
+            @java.lang.Override
+            public context.ContextOuterClass.ConfigRule_IPOWDM getIpowdm() {
+                if (ipowdmBuilder_ == null) {
+                    if (configRuleCase_ == 6) {
+                        return (context.ContextOuterClass.ConfigRule_IPOWDM) configRule_;
+                    }
+                    return context.ContextOuterClass.ConfigRule_IPOWDM.getDefaultInstance();
+                } else {
+                    if (configRuleCase_ == 6) {
+                        return ipowdmBuilder_.getMessage();
+                    }
+                    return context.ContextOuterClass.ConfigRule_IPOWDM.getDefaultInstance();
+                }
+            }
+
+            /**
+             * .context.ConfigRule_IPOWDM ipowdm = 6;
+             */
+            public Builder setIpowdm(context.ContextOuterClass.ConfigRule_IPOWDM value) {
+                if (ipowdmBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    configRule_ = value;
+                    onChanged();
+                } else {
+                    ipowdmBuilder_.setMessage(value);
+                }
+                configRuleCase_ = 6;
+                return this;
+            }
+
+            /**
+             * .context.ConfigRule_IPOWDM ipowdm = 6;
+             */
+            public Builder setIpowdm(context.ContextOuterClass.ConfigRule_IPOWDM.Builder builderForValue) {
+                if (ipowdmBuilder_ == null) {
+                    configRule_ = builderForValue.build();
+                    onChanged();
+                } else {
+                    ipowdmBuilder_.setMessage(builderForValue.build());
+                }
+                configRuleCase_ = 6;
+                return this;
+            }
+
+            /**
+             * .context.ConfigRule_IPOWDM ipowdm = 6;
+             */
+            public Builder mergeIpowdm(context.ContextOuterClass.ConfigRule_IPOWDM value) {
+                if (ipowdmBuilder_ == null) {
+                    if (configRuleCase_ == 6 && configRule_ != context.ContextOuterClass.ConfigRule_IPOWDM.getDefaultInstance()) {
+                        configRule_ = context.ContextOuterClass.ConfigRule_IPOWDM.newBuilder((context.ContextOuterClass.ConfigRule_IPOWDM) configRule_).mergeFrom(value).buildPartial();
+                    } else {
+                        configRule_ = value;
+                    }
+                    onChanged();
+                } else {
+                    if (configRuleCase_ == 6) {
+                        ipowdmBuilder_.mergeFrom(value);
+                    } else {
+                        ipowdmBuilder_.setMessage(value);
+                    }
+                }
+                configRuleCase_ = 6;
+                return this;
+            }
+
+            /**
+             * .context.ConfigRule_IPOWDM ipowdm = 6;
+             */
+            public Builder clearIpowdm() {
+                if (ipowdmBuilder_ == null) {
+                    if (configRuleCase_ == 6) {
+                        configRuleCase_ = 0;
+                        configRule_ = null;
+                        onChanged();
+                    }
+                } else {
+                    if (configRuleCase_ == 6) {
+                        configRuleCase_ = 0;
+                        configRule_ = null;
+                    }
+                    ipowdmBuilder_.clear();
+                }
+                return this;
+            }
+
+            /**
+             * .context.ConfigRule_IPOWDM ipowdm = 6;
+             */
+            public context.ContextOuterClass.ConfigRule_IPOWDM.Builder getIpowdmBuilder() {
+                return getIpowdmFieldBuilder().getBuilder();
+            }
+
+            /**
+             * .context.ConfigRule_IPOWDM ipowdm = 6;
+             */
+            @java.lang.Override
+            public context.ContextOuterClass.ConfigRule_IPOWDMOrBuilder getIpowdmOrBuilder() {
+                if ((configRuleCase_ == 6) && (ipowdmBuilder_ != null)) {
+                    return ipowdmBuilder_.getMessageOrBuilder();
+                } else {
+                    if (configRuleCase_ == 6) {
+                        return (context.ContextOuterClass.ConfigRule_IPOWDM) configRule_;
+                    }
+                    return context.ContextOuterClass.ConfigRule_IPOWDM.getDefaultInstance();
+                }
+            }
+
+            /**
+             * .context.ConfigRule_IPOWDM ipowdm = 6;
+             */
+            private com.google.protobuf.SingleFieldBuilderV3 getIpowdmFieldBuilder() {
+                if (ipowdmBuilder_ == null) {
+                    if (!(configRuleCase_ == 6)) {
+                        configRule_ = context.ContextOuterClass.ConfigRule_IPOWDM.getDefaultInstance();
+                    }
+                    ipowdmBuilder_ = new com.google.protobuf.SingleFieldBuilderV3((context.ContextOuterClass.ConfigRule_IPOWDM) configRule_, getParentForChildren(), isClean());
+                    configRule_ = null;
+                }
+                configRuleCase_ = 6;
+                onChanged();
+                return ipowdmBuilder_;
+            }
+
             @java.lang.Override
             public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) {
                 return super.setUnknownFields(unknownFields);
@@ -87855,6 +89987,14 @@ public final class ContextOuterClass {
 
     private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ConfigRule_ACL_fieldAccessorTable;
 
+    private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ConfigRule_IPOWDM_descriptor;
+
+    private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ConfigRule_IPOWDM_fieldAccessorTable;
+
+    private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ConfigRule_TAPI_LSP_descriptor;
+
+    private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ConfigRule_TAPI_LSP_fieldAccessorTable;
+
     private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ConfigRule_IP_LINK_descriptor;
 
     private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ConfigRule_IP_LINK_fieldAccessorTable;
@@ -87998,8 +90138,8 @@ public final class ContextOuterClass {
     private static com.google.protobuf.Descriptors.FileDescriptor descriptor;
 
     static {
-        java.lang.String[] descriptorData = { "\n\rcontext.proto\022\007context\032\031google/protobu" + "f/any.proto\032\tacl.proto\032\rip_link.proto\032\026k" + "pi_sample_types.proto\"\007\n\005Empty\"\024\n\004Uuid\022\014" + "\n\004uuid\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.conte" + "xt.Timestamp\022*\n\nevent_type\030\002 \001(\0162\026.conte" + "xt.EventTypeEnum\"\265\002\n\010AnyEvent\022(\n\007context" + "\030\001 \001(\0132\025.context.ContextEventH\000\022*\n\010topol" + "ogy\030\002 \001(\0132\026.context.TopologyEventH\000\022&\n\006d" + "evice\030\003 \001(\0132\024.context.DeviceEventH\000\022\"\n\004l" + "ink\030\004 \001(\0132\022.context.LinkEventH\000\022(\n\007servi" + "ce\030\005 \001(\0132\025.context.ServiceEventH\000\022$\n\005sli" + "ce\030\006 \001(\0132\023.context.SliceEventH\000\022.\n\nconne" + "ction\030\007 \001(\0132\030.context.ConnectionEventH\000B" + "\007\n\005event\"0\n\tContextId\022#\n\014context_uuid\030\001 " + "\001(\0132\r.context.Uuid\"\351\001\n\007Context\022&\n\ncontex" + "t_id\030\001 \001(\0132\022.context.ContextId\022\014\n\004name\030\002" + " \001(\t\022)\n\014topology_ids\030\003 \003(\0132\023.context.Top" + "ologyId\022\'\n\013service_ids\030\004 \003(\0132\022.context.S" + "erviceId\022#\n\tslice_ids\030\005 \003(\0132\020.context.Sl" + "iceId\022/\n\ncontroller\030\006 \001(\0132\033.context.Tera" + "FlowController\"8\n\rContextIdList\022\'\n\013conte" + "xt_ids\030\001 \003(\0132\022.context.ContextId\"1\n\013Cont" + "extList\022\"\n\010contexts\030\001 \003(\0132\020.context.Cont" + "ext\"U\n\014ContextEvent\022\035\n\005event\030\001 \001(\0132\016.con" + "text.Event\022&\n\ncontext_id\030\002 \001(\0132\022.context" + ".ContextId\"Z\n\nTopologyId\022&\n\ncontext_id\030\001" + " \001(\0132\022.context.ContextId\022$\n\rtopology_uui" + "d\030\002 \001(\0132\r.context.Uuid\"\267\001\n\010Topology\022(\n\013t" + "opology_id\030\001 \001(\0132\023.context.TopologyId\022\014\n" + "\004name\030\002 \001(\t\022%\n\ndevice_ids\030\003 \003(\0132\021.contex" + "t.DeviceId\022!\n\010link_ids\030\004 \003(\0132\017.context.L" + "inkId\022)\n\020optical_link_ids\030\005 \003(\0132\017.contex" + "t.LinkId\"\266\001\n\017TopologyDetails\022(\n\013topology" + "_id\030\001 \001(\0132\023.context.TopologyId\022\014\n\004name\030\002" + " \001(\t\022 \n\007devices\030\003 \003(\0132\017.context.Device\022\034" + "\n\005links\030\004 \003(\0132\r.context.Link\022+\n\roptical_" + "links\030\005 \003(\0132\024.context.OpticalLink\";\n\016Top" + "ologyIdList\022)\n\014topology_ids\030\001 \003(\0132\023.cont" + "ext.TopologyId\"5\n\014TopologyList\022%\n\ntopolo" + "gies\030\001 \003(\0132\021.context.Topology\"X\n\rTopolog" + "yEvent\022\035\n\005event\030\001 \001(\0132\016.context.Event\022(\n" + "\013topology_id\030\002 \001(\0132\023.context.TopologyId\"" + ".\n\010DeviceId\022\"\n\013device_uuid\030\001 \001(\0132\r.conte" + "xt.Uuid\"\372\002\n\006Device\022$\n\tdevice_id\030\001 \001(\0132\021." + "context.DeviceId\022\014\n\004name\030\002 \001(\t\022\023\n\013device" + "_type\030\003 \001(\t\022,\n\rdevice_config\030\004 \001(\0132\025.con" + "text.DeviceConfig\022G\n\031device_operational_" + "status\030\005 \001(\0162$.context.DeviceOperational" + "StatusEnum\0221\n\016device_drivers\030\006 \003(\0162\031.con" + "text.DeviceDriverEnum\022+\n\020device_endpoint" + "s\030\007 \003(\0132\021.context.EndPoint\022&\n\ncomponents" + "\030\010 \003(\0132\022.context.Component\022(\n\rcontroller" + "_id\030\t \001(\0132\021.context.DeviceId\"\311\001\n\tCompone" + "nt\022%\n\016component_uuid\030\001 \001(\0132\r.context.Uui" + "d\022\014\n\004name\030\002 \001(\t\022\014\n\004type\030\003 \001(\t\0226\n\nattribu" + "tes\030\004 \003(\0132\".context.Component.Attributes" + "Entry\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\014Devi" + "ceConfig\022)\n\014config_rules\030\001 \003(\0132\023.context" + ".ConfigRule\"5\n\014DeviceIdList\022%\n\ndevice_id" + "s\030\001 \003(\0132\021.context.DeviceId\".\n\nDeviceList" + "\022 \n\007devices\030\001 \003(\0132\017.context.Device\"\216\001\n\014D" + "eviceFilter\022)\n\ndevice_ids\030\001 \001(\0132\025.contex" + "t.DeviceIdList\022\031\n\021include_endpoints\030\002 \001(" + "\010\022\034\n\024include_config_rules\030\003 \001(\010\022\032\n\022inclu" + "de_components\030\004 \001(\010\"\200\001\n\013DeviceEvent\022\035\n\005e" + "vent\030\001 \001(\0132\016.context.Event\022$\n\tdevice_id\030" + "\002 \001(\0132\021.context.DeviceId\022,\n\rdevice_confi" + "g\030\003 \001(\0132\025.context.DeviceConfig\"*\n\006LinkId" + "\022 \n\tlink_uuid\030\001 \001(\0132\r.context.Uuid\"c\n\016Li" + "nkAttributes\022\030\n\020is_bidirectional\030\001 \001(\010\022\033" + "\n\023total_capacity_gbps\030\002 \001(\002\022\032\n\022used_capa" + "city_gbps\030\003 \001(\002\"\275\001\n\004Link\022 \n\007link_id\030\001 \001(" + "\0132\017.context.LinkId\022\014\n\004name\030\002 \001(\t\022(\n\tlink" + "_type\030\003 \001(\0162\025.context.LinkTypeEnum\022.\n\021li" + "nk_endpoint_ids\030\004 \003(\0132\023.context.EndPoint" + "Id\022+\n\nattributes\030\005 \001(\0132\027.context.LinkAtt" + "ributes\"/\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\tLinkEvent\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.ServiceId\022\014" + "\n\004name\030\002 \001(\t\022.\n\014service_type\030\003 \001(\0162\030.con" + "text.ServiceTypeEnum\0221\n\024service_endpoint" + "_ids\030\004 \003(\0132\023.context.EndPointId\0220\n\023servi" + "ce_constraints\030\005 \003(\0132\023.context.Constrain" + "t\022.\n\016service_status\030\006 \001(\0132\026.context.Serv" + "iceStatus\022.\n\016service_config\030\007 \001(\0132\026.cont" + "ext.ServiceConfig\022%\n\ttimestamp\030\010 \001(\0132\022.c" + "ontext.Timestamp\"C\n\rServiceStatus\0222\n\016ser" + "vice_status\030\001 \001(\0162\032.context.ServiceStatu" + "sEnum\":\n\rServiceConfig\022)\n\014config_rules\030\001" + " \003(\0132\023.context.ConfigRule\"8\n\rServiceIdLi" + "st\022\'\n\013service_ids\030\001 \003(\0132\022.context.Servic" + "eId\"1\n\013ServiceList\022\"\n\010services\030\001 \003(\0132\020.c" + "ontext.Service\"\225\001\n\rServiceFilter\022+\n\013serv" + "ice_ids\030\001 \001(\0132\026.context.ServiceIdList\022\034\n" + "\024include_endpoint_ids\030\002 \001(\010\022\033\n\023include_c" + "onstraints\030\003 \001(\010\022\034\n\024include_config_rules" + "\030\004 \001(\010\"U\n\014ServiceEvent\022\035\n\005event\030\001 \001(\0132\016." + "context.Event\022&\n\nservice_id\030\002 \001(\0132\022.cont" + "ext.ServiceId\"T\n\007SliceId\022&\n\ncontext_id\030\001" + " \001(\0132\022.context.ContextId\022!\n\nslice_uuid\030\002" + " \001(\0132\r.context.Uuid\"\240\003\n\005Slice\022\"\n\010slice_i" + "d\030\001 \001(\0132\020.context.SliceId\022\014\n\004name\030\002 \001(\t\022" + "/\n\022slice_endpoint_ids\030\003 \003(\0132\023.context.En" + "dPointId\022.\n\021slice_constraints\030\004 \003(\0132\023.co" + "ntext.Constraint\022-\n\021slice_service_ids\030\005 " + "\003(\0132\022.context.ServiceId\022,\n\022slice_subslic" + "e_ids\030\006 \003(\0132\020.context.SliceId\022*\n\014slice_s" + "tatus\030\007 \001(\0132\024.context.SliceStatus\022*\n\014sli" + "ce_config\030\010 \001(\0132\024.context.SliceConfig\022(\n" + "\013slice_owner\030\t \001(\0132\023.context.SliceOwner\022" + "%\n\ttimestamp\030\n \001(\0132\022.context.Timestamp\"E" + "\n\nSliceOwner\022!\n\nowner_uuid\030\001 \001(\0132\r.conte" + "xt.Uuid\022\024\n\014owner_string\030\002 \001(\t\"=\n\013SliceSt" + "atus\022.\n\014slice_status\030\001 \001(\0162\030.context.Sli" + "ceStatusEnum\"8\n\013SliceConfig\022)\n\014config_ru" + "les\030\001 \003(\0132\023.context.ConfigRule\"2\n\013SliceI" + "dList\022#\n\tslice_ids\030\001 \003(\0132\020.context.Slice" + "Id\"+\n\tSliceList\022\036\n\006slices\030\001 \003(\0132\016.contex" + "t.Slice\"\312\001\n\013SliceFilter\022\'\n\tslice_ids\030\001 \001" + "(\0132\024.context.SliceIdList\022\034\n\024include_endp" + "oint_ids\030\002 \001(\010\022\033\n\023include_constraints\030\003 " + "\001(\010\022\033\n\023include_service_ids\030\004 \001(\010\022\034\n\024incl" + "ude_subslice_ids\030\005 \001(\010\022\034\n\024include_config" + "_rules\030\006 \001(\010\"O\n\nSliceEvent\022\035\n\005event\030\001 \001(" + "\0132\016.context.Event\022\"\n\010slice_id\030\002 \001(\0132\020.co" + "ntext.SliceId\"6\n\014ConnectionId\022&\n\017connect" + "ion_uuid\030\001 \001(\0132\r.context.Uuid\"2\n\025Connect" + "ionSettings_L0\022\031\n\021lsp_symbolic_name\030\001 \001(" + "\t\"\236\001\n\025ConnectionSettings_L2\022\027\n\017src_mac_a" + "ddress\030\001 \001(\t\022\027\n\017dst_mac_address\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\nmp" + "ls_label\030\005 \001(\r\022\032\n\022mpls_traffic_class\030\006 \001" + "(\r\"t\n\025ConnectionSettings_L3\022\026\n\016src_ip_ad" + "dress\030\001 \001(\t\022\026\n\016dst_ip_address\030\002 \001(\t\022\014\n\004d" + "scp\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\010src_port\030\001 " + "\001(\r\022\020\n\010dst_port\030\002 \001(\r\022\021\n\ttcp_flags\030\003 \001(\r" + "\022\013\n\003ttl\030\004 \001(\r\"\304\001\n\022ConnectionSettings\022*\n\002" + "l0\030\001 \001(\0132\036.context.ConnectionSettings_L0" + "\022*\n\002l2\030\002 \001(\0132\036.context.ConnectionSetting" + "s_L2\022*\n\002l3\030\003 \001(\0132\036.context.ConnectionSet" + "tings_L3\022*\n\002l4\030\004 \001(\0132\036.context.Connectio" + "nSettings_L4\"\363\001\n\nConnection\022,\n\rconnectio" + "n_id\030\001 \001(\0132\025.context.ConnectionId\022&\n\nser" + "vice_id\030\002 \001(\0132\022.context.ServiceId\0223\n\026pat" + "h_hops_endpoint_ids\030\003 \003(\0132\023.context.EndP" + "ointId\022+\n\017sub_service_ids\030\004 \003(\0132\022.contex" + "t.ServiceId\022-\n\010settings\030\005 \001(\0132\033.context." + "ConnectionSettings\"A\n\020ConnectionIdList\022-" + "\n\016connection_ids\030\001 \003(\0132\025.context.Connect" + "ionId\":\n\016ConnectionList\022(\n\013connections\030\001" + " \003(\0132\023.context.Connection\"^\n\017ConnectionE" + "vent\022\035\n\005event\030\001 \001(\0132\016.context.Event\022,\n\rc" + "onnection_id\030\002 \001(\0132\025.context.ConnectionI" + "d\"\202\001\n\nEndPointId\022(\n\013topology_id\030\001 \001(\0132\023." + "context.TopologyId\022$\n\tdevice_id\030\002 \001(\0132\021." + "context.DeviceId\022$\n\rendpoint_uuid\030\003 \001(\0132" + "\r.context.Uuid\"\310\002\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\020kpi_sample" + "_types\030\004 \003(\0162\037.kpi_sample_types.KpiSampl" + "eType\022,\n\021endpoint_location\030\005 \001(\0132\021.conte" + "xt.Location\0229\n\014capabilities\030\006 \003(\0132#.cont" + "ext.EndPoint.CapabilitiesEntry\032I\n\021Capabi" + "litiesEntry\022\013\n\003key\030\001 \001(\t\022#\n\005value\030\002 \001(\0132" + "\024.google.protobuf.Any:\0028\001\"{\n\014EndPointNam" + "e\022(\n\013endpoint_id\030\001 \001(\0132\023.context.EndPoin" + "tId\022\023\n\013device_name\030\002 \001(\t\022\025\n\rendpoint_nam" + "e\030\003 \001(\t\022\025\n\rendpoint_type\030\004 \001(\t\";\n\016EndPoi" + "ntIdList\022)\n\014endpoint_ids\030\001 \003(\0132\023.context" + ".EndPointId\"A\n\020EndPointNameList\022-\n\016endpo" + "int_names\030\001 \003(\0132\025.context.EndPointName\"A" + "\n\021ConfigRule_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.EndPo" + "intId\022!\n\010rule_set\030\002 \001(\0132\017.acl.AclRuleSet" + "\"h\n\022ConfigRule_IP_LINK\022(\n\013endpoint_id\030\001 " + "\001(\0132\023.context.EndPointId\022(\n\010rule_set\030\002 \001" + "(\0132\026.ip_link.IpLinkRuleSet\"\314\001\n\nConfigRul" + "e\022)\n\006action\030\001 \001(\0162\031.context.ConfigAction" + "Enum\022,\n\006custom\030\002 \001(\0132\032.context.ConfigRul" + "e_CustomH\000\022&\n\003acl\030\003 \001(\0132\027.context.Config" + "Rule_ACLH\000\022.\n\007ip_link\030\004 \001(\0132\033.context.Co" + "nfigRule_IP_LINKH\000B\r\n\013config_rule\"F\n\021Con" + "straint_Custom\022\027\n\017constraint_type\030\001 \001(\t\022" + "\030\n\020constraint_value\030\002 \001(\t\"E\n\023Constraint_" + "Schedule\022\027\n\017start_timestamp\030\001 \001(\001\022\025\n\rdur" + "ation_days\030\002 \001(\002\"3\n\014GPS_Position\022\020\n\010lati" + "tude\030\001 \001(\002\022\021\n\tlongitude\030\002 \001(\002\"\204\001\n\010Locati" + "on\022\020\n\006region\030\001 \001(\tH\000\022-\n\014gps_position\030\002 \001" + "(\0132\025.context.GPS_PositionH\000\022\023\n\tinterface" + "\030\003 \001(\tH\000\022\026\n\014circuit_pack\030\004 \001(\tH\000B\n\n\010loca" + "tion\"l\n\033Constraint_EndPointLocation\022(\n\013e" + "ndpoint_id\030\001 \001(\0132\023.context.EndPointId\022#\n" + "\010location\030\002 \001(\0132\021.context.Location\"Y\n\033Co" + "nstraint_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_l" + "atency_ms\030\001 \001(\002\"0\n\027Constraint_SLA_Capaci" + "ty\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\017isolation_level\030\001 \003(\0162\033.context.Isol" + "ationLevelEnum\"\242\001\n\025Constraint_Exclusions" + "\022\024\n\014is_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\"5\n\014QoSProfileId\022%\n\016q" + "os_profile_id\030\001 \001(\0132\r.context.Uuid\"`\n\025Co" + "nstraint_QoSProfile\022-\n\016qos_profile_id\030\001 " + "\001(\0132\025.context.QoSProfileId\022\030\n\020qos_profil" + "e_name\030\002 \001(\t\"\222\005\n\nConstraint\022-\n\006action\030\001 " + "\001(\0162\035.context.ConstraintActionEnum\022,\n\006cu" + "stom\030\002 \001(\0132\032.context.Constraint_CustomH\000" + "\0220\n\010schedule\030\003 \001(\0132\034.context.Constraint_" + "ScheduleH\000\022A\n\021endpoint_location\030\004 \001(\0132$." + "context.Constraint_EndPointLocationH\000\022A\n" + "\021endpoint_priority\030\005 \001(\0132$.context.Const" + "raint_EndPointPriorityH\000\0228\n\014sla_capacity" + "\030\006 \001(\0132 .context.Constraint_SLA_Capacity" + "H\000\0226\n\013sla_latency\030\007 \001(\0132\037.context.Constr" + "aint_SLA_LatencyH\000\022@\n\020sla_availability\030\010" + " \001(\0132$.context.Constraint_SLA_Availabili" + "tyH\000\022@\n\rsla_isolation\030\t \001(\0132\'.context.Co" + "nstraint_SLA_Isolation_levelH\000\0224\n\nexclus" + "ions\030\n \001(\0132\036.context.Constraint_Exclusio" + "nsH\000\0225\n\013qos_profile\030\013 \001(\0132\036.context.Cons" + "traint_QoSProfileH\000B\014\n\nconstraint\"^\n\022Ter" + "aFlowController\022&\n\ncontext_id\030\001 \001(\0132\022.co" + "ntext.ContextId\022\022\n\nip_address\030\002 \001(\t\022\014\n\004p" + "ort\030\003 \001(\r\"U\n\024AuthenticationResult\022&\n\ncon" + "text_id\030\001 \001(\0132\022.context.ContextId\022\025\n\raut" + "henticated\030\002 \001(\010\"-\n\017OpticalConfigId\022\032\n\022o" + "pticalconfig_uuid\030\001 \001(\t\"y\n\rOpticalConfig" + "\0222\n\020opticalconfig_id\030\001 \001(\0132\030.context.Opt" + "icalConfigId\022\016\n\006config\030\002 \001(\t\022$\n\tdevice_i" + "d\030\003 \001(\0132\021.context.DeviceId\"C\n\021OpticalCon" + "figList\022.\n\016opticalconfigs\030\001 \003(\0132\026.contex" + "t.OpticalConfig\"g\n\022OpticalConfigEvent\022\035\n" + "\005event\030\001 \001(\0132\016.context.Event\0222\n\020opticalc" + "onfig_id\030\002 \001(\0132\030.context.OpticalConfigId" + "\"_\n\021OpticalEndPointId\022$\n\tdevice_id\030\002 \001(\013" + "2\021.context.DeviceId\022$\n\rendpoint_uuid\030\003 \001" + "(\0132\r.context.Uuid\">\n\017OpticalLinkList\022+\n\r" + "optical_links\030\001 \003(\0132\024.context.OpticalLin" + "k\"\304\003\n\022OpticalLinkDetails\022\016\n\006length\030\001 \001(\002" + "\022\020\n\010src_port\030\002 \001(\t\022\020\n\010dst_port\030\003 \001(\t\022\027\n\017" + "local_peer_port\030\004 \001(\t\022\030\n\020remote_peer_por" + "t\030\005 \001(\t\022\014\n\004used\030\006 \001(\010\0228\n\007c_slots\030\007 \003(\0132\'" + ".context.OpticalLinkDetails.CSlotsEntry\022" + "8\n\007l_slots\030\010 \003(\0132\'.context.OpticalLinkDe" + "tails.LSlotsEntry\0228\n\007s_slots\030\t \003(\0132\'.con" + "text.OpticalLinkDetails.SSlotsEntry\032-\n\013C" + "SlotsEntry\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\002" + "8\001\032-\n\013LSlotsEntry\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030" + "\002 \001(\005:\0028\001\032-\n\013SSlotsEntry\022\013\n\003key\030\001 \001(\t\022\r\n" + "\005value\030\002 \001(\005:\0028\001\"\243\001\n\013OpticalLink\022\014\n\004name" + "\030\001 \001(\t\0224\n\017optical_details\030\002 \001(\0132\033.contex" + "t.OpticalLinkDetails\022 \n\007link_id\030\003 \001(\0132\017." + "context.LinkId\022.\n\021link_endpoint_ids\030\004 \003(" + "\0132\023.context.EndPointId\"0\n\tChannelId\022#\n\014c" + "hannel_uuid\030\001 \001(\0132\r.context.Uuid\"8\n\rOpti" + "calBandId\022\'\n\020opticalband_uuid\030\001 \001(\0132\r.co" + "ntext.Uuid\"\247\002\n\013OpticalBand\022.\n\016opticalban" + "d_id\030\001 \001(\0132\026.context.OpticalBandId\022,\n\rco" + "nnection_id\030\002 \001(\0132\025.context.ConnectionId" + "\022&\n\nchannel_id\030\003 \001(\0132\022.context.ChannelId" + "\022&\n\nservice_id\030\004 \001(\0132\022.context.ServiceId" + "\022#\n\007service\030\005 \001(\0132\020.context.ServiceH\000\022)\n" + "\nconnection\030\006 \001(\0132\023.context.ConnectionH\000" + "\022\021\n\007channel\030\007 \001(\tH\000B\007\n\005field\"=\n\017OpticalB" + "andList\022*\n\014opticalbands\030\001 \003(\0132\024.context." + "OpticalBand\"r\n\021ServiceConfigRule\022&\n\nserv" + "ice_id\030\001 \001(\0132\022.context.ServiceId\0225\n\021conf" + "igrule_custom\030\002 \001(\0132\032.context.ConfigRule" + "_Custom*j\n\rEventTypeEnum\022\027\n\023EVENTTYPE_UN" + "DEFINED\020\000\022\024\n\020EVENTTYPE_CREATE\020\001\022\024\n\020EVENT" + "TYPE_UPDATE\020\002\022\024\n\020EVENTTYPE_REMOVE\020\003*\333\004\n\020" + "DeviceDriverEnum\022\032\n\026DEVICEDRIVER_UNDEFIN" + "ED\020\000\022\033\n\027DEVICEDRIVER_OPENCONFIG\020\001\022\036\n\032DEV" + "ICEDRIVER_TRANSPORT_API\020\002\022\023\n\017DEVICEDRIVE" + "R_P4\020\003\022&\n\"DEVICEDRIVER_IETF_NETWORK_TOPO" + "LOGY\020\004\022\033\n\027DEVICEDRIVER_ONF_TR_532\020\005\022\023\n\017D" + "EVICEDRIVER_XR\020\006\022\033\n\027DEVICEDRIVER_IETF_L2" + "VPN\020\007\022 \n\034DEVICEDRIVER_GNMI_OPENCONFIG\020\010\022" + "\034\n\030DEVICEDRIVER_OPTICAL_TFS\020\t\022\032\n\026DEVICED" + "RIVER_IETF_ACTN\020\n\022\023\n\017DEVICEDRIVER_OC\020\013\022\024" + "\n\020DEVICEDRIVER_QKD\020\014\022\033\n\027DEVICEDRIVER_IET" + "F_L3VPN\020\r\022\033\n\027DEVICEDRIVER_IETF_SLICE\020\016\022\024" + "\n\020DEVICEDRIVER_NCE\020\017\022\031\n\025DEVICEDRIVER_SMA" + "RTNIC\020\020\022\031\n\025DEVICEDRIVER_MORPHEUS\020\021\022\024\n\020DE" + "VICEDRIVER_RYU\020\022\022#\n\037DEVICEDRIVER_GNMI_NO" + "KIA_SRLINUX\020\023\022\032\n\026DEVICEDRIVER_OPENROADM\020" + "\024*\217\001\n\033DeviceOperationalStatusEnum\022%\n!DEV" + "ICEOPERATIONALSTATUS_UNDEFINED\020\000\022$\n DEVI" + "CEOPERATIONALSTATUS_DISABLED\020\001\022#\n\037DEVICE" + "OPERATIONALSTATUS_ENABLED\020\002*\245\001\n\014LinkType" + "Enum\022\024\n\020LINKTYPE_UNKNOWN\020\000\022\023\n\017LINKTYPE_C" + "OPPER\020\001\022\022\n\016LINKTYPE_FIBER\020\002\022\022\n\016LINKTYPE_" + "RADIO\020\003\022\024\n\020LINKTYPE_VIRTUAL\020\004\022\027\n\023LINKTYP" + "E_MANAGEMENT\020\005\022\023\n\017LINKTYPE_REMOTE\020\006*\276\002\n\017" + "ServiceTypeEnum\022\027\n\023SERVICETYPE_UNKNOWN\020\000" + "\022\024\n\020SERVICETYPE_L3NM\020\001\022\024\n\020SERVICETYPE_L2" + "NM\020\002\022)\n%SERVICETYPE_TAPI_CONNECTIVITY_SE" + "RVICE\020\003\022\022\n\016SERVICETYPE_TE\020\004\022\023\n\017SERVICETY" + "PE_E2E\020\005\022$\n SERVICETYPE_OPTICAL_CONNECTI" + "VITY\020\006\022\023\n\017SERVICETYPE_QKD\020\007\022\024\n\020SERVICETY" + "PE_L1NM\020\010\022\023\n\017SERVICETYPE_INT\020\t\022\023\n\017SERVIC" + "ETYPE_ACL\020\n\022\027\n\023SERVICETYPE_IP_LINK\020\013*\304\001\n" + "\021ServiceStatusEnum\022\033\n\027SERVICESTATUS_UNDE" + "FINED\020\000\022\031\n\025SERVICESTATUS_PLANNED\020\001\022\030\n\024SE" + "RVICESTATUS_ACTIVE\020\002\022\032\n\026SERVICESTATUS_UP" + "DATING\020\003\022!\n\035SERVICESTATUS_PENDING_REMOVA" + "L\020\004\022\036\n\032SERVICESTATUS_SLA_VIOLATED\020\005*\251\001\n\017" + "SliceStatusEnum\022\031\n\025SLICESTATUS_UNDEFINED" + "\020\000\022\027\n\023SLICESTATUS_PLANNED\020\001\022\024\n\020SLICESTAT" + "US_INIT\020\002\022\026\n\022SLICESTATUS_ACTIVE\020\003\022\026\n\022SLI" + "CESTATUS_DEINIT\020\004\022\034\n\030SLICESTATUS_SLA_VIO" + "LATED\020\005*]\n\020ConfigActionEnum\022\032\n\026CONFIGACT" + "ION_UNDEFINED\020\000\022\024\n\020CONFIGACTION_SET\020\001\022\027\n" + "\023CONFIGACTION_DELETE\020\002*m\n\024ConstraintActi" + "onEnum\022\036\n\032CONSTRAINTACTION_UNDEFINED\020\000\022\030" + "\n\024CONSTRAINTACTION_SET\020\001\022\033\n\027CONSTRAINTAC" + "TION_DELETE\020\002*\203\002\n\022IsolationLevelEnum\022\020\n\014" + "NO_ISOLATION\020\000\022\026\n\022PHYSICAL_ISOLATION\020\001\022\025" + "\n\021LOGICAL_ISOLATION\020\002\022\025\n\021PROCESS_ISOLATI" + "ON\020\003\022\035\n\031PHYSICAL_MEMORY_ISOLATION\020\004\022\036\n\032P" + "HYSICAL_NETWORK_ISOLATION\020\005\022\036\n\032VIRTUAL_R" + "ESOURCE_ISOLATION\020\006\022\037\n\033NETWORK_FUNCTIONS" + "_ISOLATION\020\007\022\025\n\021SERVICE_ISOLATION\020\0102\274\035\n\016" + "ContextService\022:\n\016ListContextIds\022\016.conte" + "xt.Empty\032\026.context.ContextIdList\"\000\0226\n\014Li" + "stContexts\022\016.context.Empty\032\024.context.Con" + "textList\"\000\0224\n\nGetContext\022\022.context.Conte" + "xtId\032\020.context.Context\"\000\0224\n\nSetContext\022\020" + ".context.Context\032\022.context.ContextId\"\000\0225" + "\n\rRemoveContext\022\022.context.ContextId\032\016.co" + "ntext.Empty\"\000\022=\n\020GetContextEvents\022\016.cont" + "ext.Empty\032\025.context.ContextEvent\"\0000\001\022@\n\017" + "ListTopologyIds\022\022.context.ContextId\032\027.co" + "ntext.TopologyIdList\"\000\022=\n\016ListTopologies" + "\022\022.context.ContextId\032\025.context.TopologyL" + "ist\"\000\0227\n\013GetTopology\022\023.context.TopologyI" + "d\032\021.context.Topology\"\000\022E\n\022GetTopologyDet" + "ails\022\023.context.TopologyId\032\030.context.Topo" + "logyDetails\"\000\0227\n\013SetTopology\022\021.context.T" + "opology\032\023.context.TopologyId\"\000\0227\n\016Remove" + "Topology\022\023.context.TopologyId\032\016.context." + "Empty\"\000\022?\n\021GetTopologyEvents\022\016.context.E" + "mpty\032\026.context.TopologyEvent\"\0000\001\0228\n\rList" + "DeviceIds\022\016.context.Empty\032\025.context.Devi" + "ceIdList\"\000\0224\n\013ListDevices\022\016.context.Empt" + "y\032\023.context.DeviceList\"\000\0221\n\tGetDevice\022\021." + "context.DeviceId\032\017.context.Device\"\000\0221\n\tS" + "etDevice\022\017.context.Device\032\021.context.Devi" + "ceId\"\000\0223\n\014RemoveDevice\022\021.context.DeviceI" + "d\032\016.context.Empty\"\000\022;\n\017GetDeviceEvents\022\016" + ".context.Empty\032\024.context.DeviceEvent\"\0000\001" + "\022<\n\014SelectDevice\022\025.context.DeviceFilter\032" + "\023.context.DeviceList\"\000\022I\n\021ListEndPointNa" + "mes\022\027.context.EndPointIdList\032\031.context.E" + "ndPointNameList\"\000\0224\n\013ListLinkIds\022\016.conte" + "xt.Empty\032\023.context.LinkIdList\"\000\0220\n\tListL" + "inks\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.conte" + "xt.LinkId\"\000\022/\n\nRemoveLink\022\017.context.Link" + "Id\032\016.context.Empty\"\000\0227\n\rGetLinkEvents\022\016." + "context.Empty\032\022.context.LinkEvent\"\0000\001\022>\n" + "\016ListServiceIds\022\022.context.ContextId\032\026.co" + "ntext.ServiceIdList\"\000\022:\n\014ListServices\022\022." + "context.ContextId\032\024.context.ServiceList\"" + "\000\0224\n\nGetService\022\022.context.ServiceId\032\020.co" + "ntext.Service\"\000\0224\n\nSetService\022\020.context." + "Service\032\022.context.ServiceId\"\000\0226\n\014UnsetSe" + "rvice\022\020.context.Service\032\022.context.Servic" + "eId\"\000\0225\n\rRemoveService\022\022.context.Service" + "Id\032\016.context.Empty\"\000\022=\n\020GetServiceEvents" + "\022\016.context.Empty\032\025.context.ServiceEvent\"" + "\0000\001\022?\n\rSelectService\022\026.context.ServiceFi" + "lter\032\024.context.ServiceList\"\000\022:\n\014ListSlic" + "eIds\022\022.context.ContextId\032\024.context.Slice" + "IdList\"\000\0226\n\nListSlices\022\022.context.Context" + "Id\032\022.context.SliceList\"\000\022.\n\010GetSlice\022\020.c" + "ontext.SliceId\032\016.context.Slice\"\000\022.\n\010SetS" + "lice\022\016.context.Slice\032\020.context.SliceId\"\000" + "\0220\n\nUnsetSlice\022\016.context.Slice\032\020.context" + ".SliceId\"\000\0221\n\013RemoveSlice\022\020.context.Slic" + "eId\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." + "context.SliceList\"\000\022D\n\021ListConnectionIds", "\022\022.context.ServiceId\032\031.context.Connectio" + "nIdList\"\000\022@\n\017ListConnections\022\022.context.S" + "erviceId\032\027.context.ConnectionList\"\000\022=\n\rG" + "etConnection\022\025.context.ConnectionId\032\023.co" + "ntext.Connection\"\000\022=\n\rSetConnection\022\023.co" + "ntext.Connection\032\025.context.ConnectionId\"" + "\000\022;\n\020RemoveConnection\022\025.context.Connecti" + "onId\032\016.context.Empty\"\000\022C\n\023GetConnectionE" + "vents\022\016.context.Empty\032\030.context.Connecti" + "onEvent\"\0000\001\0225\n\014GetAllEvents\022\016.context.Em" + "pty\032\021.context.AnyEvent\"\0000\001\022@\n\020GetOptical" + "Config\022\016.context.Empty\032\032.context.Optical" + "ConfigList\"\000\022F\n\020SetOpticalConfig\022\026.conte" + "xt.OpticalConfig\032\030.context.OpticalConfig" + "Id\"\000\022I\n\023UpdateOpticalConfig\022\026.context.Op" + "ticalConfig\032\030.context.OpticalConfigId\"\000\022" + "I\n\023SelectOpticalConfig\022\030.context.Optical" + "ConfigId\032\026.context.OpticalConfig\"\000\022A\n\023De" + "leteOpticalConfig\022\030.context.OpticalConfi" + "gId\032\016.context.Empty\"\000\022@\n\024DeleteOpticalCh" + "annel\022\026.context.OpticalConfig\032\016.context." + "Empty\"\000\0228\n\016SetOpticalLink\022\024.context.Opti" + "calLink\032\016.context.Empty\"\000\0229\n\016GetOpticalL" + "ink\022\017.context.LinkId\032\024.context.OpticalLi" + "nk\"\000\0226\n\021DeleteOpticalLink\022\017.context.Link" + "Id\032\016.context.Empty\"\000\022@\n\022GetOpticalLinkLi" + "st\022\016.context.Empty\032\030.context.OpticalLink" + "List\"\000\022<\n\016GetOpticalBand\022\016.context.Empty" + "\032\030.context.OpticalBandList\"\000\022C\n\021SelectOp" + "ticalBand\022\026.context.OpticalBandId\032\024.cont" + "ext.OpticalBand\"\000\022G\n\027DeleteServiceConfig" + "Rule\022\032.context.ServiceConfigRule\032\016.conte" + "xt.Empty\"\000b\006proto3" };
-        descriptor = com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] { com.google.protobuf.AnyProto.getDescriptor(), acl.Acl.getDescriptor(), ip_link.IpLink.getDescriptor(), kpi_sample_types.KpiSampleTypes.getDescriptor() });
+        java.lang.String[] descriptorData = { "\n\rcontext.proto\022\007context\032\031google/protobu" + "f/any.proto\032\tacl.proto\032\014ipowdm.proto\032\rip" + "_link.proto\032\026kpi_sample_types.proto\032\016tap" + "i_lsp.proto\"\007\n\005Empty\"\024\n\004Uuid\022\014\n\004uuid\030\001 \001" + "(\t\"\036\n\tTimestamp\022\021\n\ttimestamp\030\001 \001(\001\"Z\n\005Ev" + "ent\022%\n\ttimestamp\030\001 \001(\0132\022.context.Timesta" + "mp\022*\n\nevent_type\030\002 \001(\0162\026.context.EventTy" + "peEnum\"\265\002\n\010AnyEvent\022(\n\007context\030\001 \001(\0132\025.c" + "ontext.ContextEventH\000\022*\n\010topology\030\002 \001(\0132" + "\026.context.TopologyEventH\000\022&\n\006device\030\003 \001(" + "\0132\024.context.DeviceEventH\000\022\"\n\004link\030\004 \001(\0132" + "\022.context.LinkEventH\000\022(\n\007service\030\005 \001(\0132\025" + ".context.ServiceEventH\000\022$\n\005slice\030\006 \001(\0132\023" + ".context.SliceEventH\000\022.\n\nconnection\030\007 \001(" + "\0132\030.context.ConnectionEventH\000B\007\n\005event\"0" + "\n\tContextId\022#\n\014context_uuid\030\001 \001(\0132\r.cont" + "ext.Uuid\"\351\001\n\007Context\022&\n\ncontext_id\030\001 \001(\013" + "2\022.context.ContextId\022\014\n\004name\030\002 \001(\t\022)\n\014to" + "pology_ids\030\003 \003(\0132\023.context.TopologyId\022\'\n" + "\013service_ids\030\004 \003(\0132\022.context.ServiceId\022#" + "\n\tslice_ids\030\005 \003(\0132\020.context.SliceId\022/\n\nc" + "ontroller\030\006 \001(\0132\033.context.TeraFlowContro" + "ller\"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.context.Context\"U\n\014Con" + "textEvent\022\035\n\005event\030\001 \001(\0132\016.context.Event" + "\022&\n\ncontext_id\030\002 \001(\0132\022.context.ContextId" + "\"Z\n\nTopologyId\022&\n\ncontext_id\030\001 \001(\0132\022.con" + "text.ContextId\022$\n\rtopology_uuid\030\002 \001(\0132\r." + "context.Uuid\"\267\001\n\010Topology\022(\n\013topology_id" + "\030\001 \001(\0132\023.context.TopologyId\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.context.LinkId\022)\n\020o" + "ptical_link_ids\030\005 \003(\0132\017.context.LinkId\"\266" + "\001\n\017TopologyDetails\022(\n\013topology_id\030\001 \001(\0132" + "\023.context.TopologyId\022\014\n\004name\030\002 \001(\t\022 \n\007de" + "vices\030\003 \003(\0132\017.context.Device\022\034\n\005links\030\004 " + "\003(\0132\r.context.Link\022+\n\roptical_links\030\005 \003(" + "\0132\024.context.OpticalLink\";\n\016TopologyIdLis" + "t\022)\n\014topology_ids\030\001 \003(\0132\023.context.Topolo" + "gyId\"5\n\014TopologyList\022%\n\ntopologies\030\001 \003(\013" + "2\021.context.Topology\"X\n\rTopologyEvent\022\035\n\005" + "event\030\001 \001(\0132\016.context.Event\022(\n\013topology_" + "id\030\002 \001(\0132\023.context.TopologyId\".\n\010DeviceI" + "d\022\"\n\013device_uuid\030\001 \001(\0132\r.context.Uuid\"\372\002" + "\n\006Device\022$\n\tdevice_id\030\001 \001(\0132\021.context.De" + "viceId\022\014\n\004name\030\002 \001(\t\022\023\n\013device_type\030\003 \001(" + "\t\022,\n\rdevice_config\030\004 \001(\0132\025.context.Devic" + "eConfig\022G\n\031device_operational_status\030\005 \001" + "(\0162$.context.DeviceOperationalStatusEnum" + "\0221\n\016device_drivers\030\006 \003(\0162\031.context.Devic" + "eDriverEnum\022+\n\020device_endpoints\030\007 \003(\0132\021." + "context.EndPoint\022&\n\ncomponents\030\010 \003(\0132\022.c" + "ontext.Component\022(\n\rcontroller_id\030\t \001(\0132" + "\021.context.DeviceId\"\311\001\n\tComponent\022%\n\016comp" + "onent_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\nattributes\030\004 \003(\0132" + "\".context.Component.AttributesEntry\022\016\n\006p" + "arent\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\014DeviceConfig\022)" + "\n\014config_rules\030\001 \003(\0132\023.context.ConfigRul" + "e\"5\n\014DeviceIdList\022%\n\ndevice_ids\030\001 \003(\0132\021." + "context.DeviceId\".\n\nDeviceList\022 \n\007device" + "s\030\001 \003(\0132\017.context.Device\"\216\001\n\014DeviceFilte" + "r\022)\n\ndevice_ids\030\001 \001(\0132\025.context.DeviceId" + "List\022\031\n\021include_endpoints\030\002 \001(\010\022\034\n\024inclu" + "de_config_rules\030\003 \001(\010\022\032\n\022include_compone" + "nts\030\004 \001(\010\"\200\001\n\013DeviceEvent\022\035\n\005event\030\001 \001(\013" + "2\016.context.Event\022$\n\tdevice_id\030\002 \001(\0132\021.co" + "ntext.DeviceId\022,\n\rdevice_config\030\003 \001(\0132\025." + "context.DeviceConfig\"*\n\006LinkId\022 \n\tlink_u" + "uid\030\001 \001(\0132\r.context.Uuid\"c\n\016LinkAttribut" + "es\022\030\n\020is_bidirectional\030\001 \001(\010\022\033\n\023total_ca" + "pacity_gbps\030\002 \001(\002\022\032\n\022used_capacity_gbps\030" + "\003 \001(\002\"\275\001\n\004Link\022 \n\007link_id\030\001 \001(\0132\017.contex" + "t.LinkId\022\014\n\004name\030\002 \001(\t\022(\n\tlink_type\030\003 \001(" + "\0162\025.context.LinkTypeEnum\022.\n\021link_endpoin" + "t_ids\030\004 \003(\0132\023.context.EndPointId\022+\n\nattr" + "ibutes\030\005 \001(\0132\027.context.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.cont" + "ext.Link\"L\n\tLinkEvent\022\035\n\005event\030\001 \001(\0132\016.c" + "ontext.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.ServiceId\022\014\n\004name\030\002 \001" + "(\t\022.\n\014service_type\030\003 \001(\0162\030.context.Servi" + "ceTypeEnum\0221\n\024service_endpoint_ids\030\004 \003(\013" + "2\023.context.EndPointId\0220\n\023service_constra" + "ints\030\005 \003(\0132\023.context.Constraint\022.\n\016servi" + "ce_status\030\006 \001(\0132\026.context.ServiceStatus\022" + ".\n\016service_config\030\007 \001(\0132\026.context.Servic" + "eConfig\022%\n\ttimestamp\030\010 \001(\0132\022.context.Tim" + "estamp\"C\n\rServiceStatus\0222\n\016service_statu" + "s\030\001 \001(\0162\032.context.ServiceStatusEnum\":\n\rS" + "erviceConfig\022)\n\014config_rules\030\001 \003(\0132\023.con" + "text.ConfigRule\"8\n\rServiceIdList\022\'\n\013serv" + "ice_ids\030\001 \003(\0132\022.context.ServiceId\"1\n\013Ser" + "viceList\022\"\n\010services\030\001 \003(\0132\020.context.Ser" + "vice\"\225\001\n\rServiceFilter\022+\n\013service_ids\030\001 " + "\001(\0132\026.context.ServiceIdList\022\034\n\024include_e" + "ndpoint_ids\030\002 \001(\010\022\033\n\023include_constraints" + "\030\003 \001(\010\022\034\n\024include_config_rules\030\004 \001(\010\"U\n\014" + "ServiceEvent\022\035\n\005event\030\001 \001(\0132\016.context.Ev" + "ent\022&\n\nservice_id\030\002 \001(\0132\022.context.Servic" + "eId\"T\n\007SliceId\022&\n\ncontext_id\030\001 \001(\0132\022.con" + "text.ContextId\022!\n\nslice_uuid\030\002 \001(\0132\r.con" + "text.Uuid\"\240\003\n\005Slice\022\"\n\010slice_id\030\001 \001(\0132\020." + "context.SliceId\022\014\n\004name\030\002 \001(\t\022/\n\022slice_e" + "ndpoint_ids\030\003 \003(\0132\023.context.EndPointId\022." + "\n\021slice_constraints\030\004 \003(\0132\023.context.Cons" + "traint\022-\n\021slice_service_ids\030\005 \003(\0132\022.cont" + "ext.ServiceId\022,\n\022slice_subslice_ids\030\006 \003(" + "\0132\020.context.SliceId\022*\n\014slice_status\030\007 \001(" + "\0132\024.context.SliceStatus\022*\n\014slice_config\030" + "\010 \001(\0132\024.context.SliceConfig\022(\n\013slice_own" + "er\030\t \001(\0132\023.context.SliceOwner\022%\n\ttimesta" + "mp\030\n \001(\0132\022.context.Timestamp\"E\n\nSliceOwn" + "er\022!\n\nowner_uuid\030\001 \001(\0132\r.context.Uuid\022\024\n" + "\014owner_string\030\002 \001(\t\"=\n\013SliceStatus\022.\n\014sl" + "ice_status\030\001 \001(\0162\030.context.SliceStatusEn" + "um\"8\n\013SliceConfig\022)\n\014config_rules\030\001 \003(\0132" + "\023.context.ConfigRule\"2\n\013SliceIdList\022#\n\ts" + "lice_ids\030\001 \003(\0132\020.context.SliceId\"+\n\tSlic" + "eList\022\036\n\006slices\030\001 \003(\0132\016.context.Slice\"\312\001" + "\n\013SliceFilter\022\'\n\tslice_ids\030\001 \001(\0132\024.conte" + "xt.SliceIdList\022\034\n\024include_endpoint_ids\030\002" + " \001(\010\022\033\n\023include_constraints\030\003 \001(\010\022\033\n\023inc" + "lude_service_ids\030\004 \001(\010\022\034\n\024include_subsli" + "ce_ids\030\005 \001(\010\022\034\n\024include_config_rules\030\006 \001" + "(\010\"O\n\nSliceEvent\022\035\n\005event\030\001 \001(\0132\016.contex" + "t.Event\022\"\n\010slice_id\030\002 \001(\0132\020.context.Slic" + "eId\"6\n\014ConnectionId\022&\n\017connection_uuid\030\001" + " \001(\0132\r.context.Uuid\"2\n\025ConnectionSetting" + "s_L0\022\031\n\021lsp_symbolic_name\030\001 \001(\t\"\236\001\n\025Conn" + "ectionSettings_L2\022\027\n\017src_mac_address\030\001 \001" + "(\t\022\027\n\017dst_mac_address\030\002 \001(\t\022\022\n\nether_typ" + "e\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\025Conn" + "ectionSettings_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\025Connec" + "tionSettings_L4\022\020\n\010src_port\030\001 \001(\r\022\020\n\010dst" + "_port\030\002 \001(\r\022\021\n\ttcp_flags\030\003 \001(\r\022\013\n\003ttl\030\004 " + "\001(\r\"\304\001\n\022ConnectionSettings\022*\n\002l0\030\001 \001(\0132\036" + ".context.ConnectionSettings_L0\022*\n\002l2\030\002 \001" + "(\0132\036.context.ConnectionSettings_L2\022*\n\002l3" + "\030\003 \001(\0132\036.context.ConnectionSettings_L3\022*" + "\n\002l4\030\004 \001(\0132\036.context.ConnectionSettings_" + "L4\"\363\001\n\nConnection\022,\n\rconnection_id\030\001 \001(\013" + "2\025.context.ConnectionId\022&\n\nservice_id\030\002 " + "\001(\0132\022.context.ServiceId\0223\n\026path_hops_end" + "point_ids\030\003 \003(\0132\023.context.EndPointId\022+\n\017" + "sub_service_ids\030\004 \003(\0132\022.context.ServiceI" + "d\022-\n\010settings\030\005 \001(\0132\033.context.Connection" + "Settings\"A\n\020ConnectionIdList\022-\n\016connecti" + "on_ids\030\001 \003(\0132\025.context.ConnectionId\":\n\016C" + "onnectionList\022(\n\013connections\030\001 \003(\0132\023.con" + "text.Connection\"^\n\017ConnectionEvent\022\035\n\005ev" + "ent\030\001 \001(\0132\016.context.Event\022,\n\rconnection_" + "id\030\002 \001(\0132\025.context.ConnectionId\"\202\001\n\nEndP" + "ointId\022(\n\013topology_id\030\001 \001(\0132\023.context.To" + "pologyId\022$\n\tdevice_id\030\002 \001(\0132\021.context.De" + "viceId\022$\n\rendpoint_uuid\030\003 \001(\0132\r.context." + "Uuid\"\310\002\n\010EndPoint\022(\n\013endpoint_id\030\001 \001(\0132\023" + ".context.EndPointId\022\014\n\004name\030\002 \001(\t\022\025\n\rend" + "point_type\030\003 \001(\t\0229\n\020kpi_sample_types\030\004 \003" + "(\0162\037.kpi_sample_types.KpiSampleType\022,\n\021e" + "ndpoint_location\030\005 \001(\0132\021.context.Locatio" + "n\0229\n\014capabilities\030\006 \003(\0132#.context.EndPoi" + "nt.CapabilitiesEntry\032I\n\021CapabilitiesEntr" + "y\022\013\n\003key\030\001 \001(\t\022#\n\005value\030\002 \001(\0132\024.google.p" + "rotobuf.Any:\0028\001\"{\n\014EndPointName\022(\n\013endpo" + "int_id\030\001 \001(\0132\023.context.EndPointId\022\023\n\013dev" + "ice_name\030\002 \001(\t\022\025\n\rendpoint_name\030\003 \001(\t\022\025\n" + "\rendpoint_type\030\004 \001(\t\";\n\016EndPointIdList\022)" + "\n\014endpoint_ids\030\001 \003(\0132\023.context.EndPointI" + "d\"A\n\020EndPointNameList\022-\n\016endpoint_names\030" + "\001 \003(\0132\025.context.EndPointName\"A\n\021ConfigRu" + "le_Custom\022\024\n\014resource_key\030\001 \001(\t\022\026\n\016resou" + "rce_value\030\002 \001(\t\"]\n\016ConfigRule_ACL\022(\n\013end" + "point_id\030\001 \001(\0132\023.context.EndPointId\022!\n\010r" + "ule_set\030\002 \001(\0132\017.acl.AclRuleSet\"f\n\021Config" + "Rule_IPOWDM\022(\n\013endpoint_id\030\001 \001(\0132\023.conte" + "xt.EndPointId\022\'\n\010rule_set\030\002 \001(\0132\025.ipowdm" + ".IpowdmRuleSet\"k\n\023ConfigRule_TAPI_LSP\022(\n" + "\013endpoint_id\030\001 \001(\0132\023.context.EndPointId\022" + "*\n\010rule_set\030\002 \003(\0132\030.tapi_lsp.TapiLspRule" + "Set\"h\n\022ConfigRule_IP_LINK\022(\n\013endpoint_id" + "\030\001 \001(\0132\023.context.EndPointId\022(\n\010rule_set\030" + "\002 \001(\0132\026.ip_link.IpLinkRuleSet\"\254\002\n\nConfig" + "Rule\022)\n\006action\030\001 \001(\0162\031.context.ConfigAct" + "ionEnum\022,\n\006custom\030\002 \001(\0132\032.context.Config" + "Rule_CustomH\000\022&\n\003acl\030\003 \001(\0132\027.context.Con" + "figRule_ACLH\000\022.\n\007ip_link\030\004 \001(\0132\033.context" + ".ConfigRule_IP_LINKH\000\0220\n\010tapi_lsp\030\005 \001(\0132" + "\034.context.ConfigRule_TAPI_LSPH\000\022,\n\006ipowd" + "m\030\006 \001(\0132\032.context.ConfigRule_IPOWDMH\000B\r\n" + "\013config_rule\"F\n\021Constraint_Custom\022\027\n\017con" + "straint_type\030\001 \001(\t\022\030\n\020constraint_value\030\002" + " \001(\t\"E\n\023Constraint_Schedule\022\027\n\017start_tim" + "estamp\030\001 \001(\001\022\025\n\rduration_days\030\002 \001(\002\"3\n\014G" + "PS_Position\022\020\n\010latitude\030\001 \001(\002\022\021\n\tlongitu" + "de\030\002 \001(\002\"\204\001\n\010Location\022\020\n\006region\030\001 \001(\tH\000\022" + "-\n\014gps_position\030\002 \001(\0132\025.context.GPS_Posi" + "tionH\000\022\023\n\tinterface\030\003 \001(\tH\000\022\026\n\014circuit_p" + "ack\030\004 \001(\tH\000B\n\n\010location\"l\n\033Constraint_En" + "dPointLocation\022(\n\013endpoint_id\030\001 \001(\0132\023.co" + "ntext.EndPointId\022#\n\010location\030\002 \001(\0132\021.con" + "text.Location\"Y\n\033Constraint_EndPointPrio" + "rity\022(\n\013endpoint_id\030\001 \001(\0132\023.context.EndP" + "ointId\022\020\n\010priority\030\002 \001(\r\"0\n\026Constraint_S" + "LA_Latency\022\026\n\016e2e_latency_ms\030\001 \001(\002\"0\n\027Co" + "nstraint_SLA_Capacity\022\025\n\rcapacity_gbps\030\001" + " \001(\002\"c\n\033Constraint_SLA_Availability\022\032\n\022n" + "um_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\017isolation_level\030\001" + " \003(\0162\033.context.IsolationLevelEnum\"\242\001\n\025Co" + "nstraint_Exclusions\022\024\n\014is_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.EndPoin" + "tId\022!\n\010link_ids\030\004 \003(\0132\017.context.LinkId\"5" + "\n\014QoSProfileId\022%\n\016qos_profile_id\030\001 \001(\0132\r" + ".context.Uuid\"`\n\025Constraint_QoSProfile\022-" + "\n\016qos_profile_id\030\001 \001(\0132\025.context.QoSProf" + "ileId\022\030\n\020qos_profile_name\030\002 \001(\t\"\222\005\n\nCons" + "traint\022-\n\006action\030\001 \001(\0162\035.context.Constra" + "intActionEnum\022,\n\006custom\030\002 \001(\0132\032.context." + "Constraint_CustomH\000\0220\n\010schedule\030\003 \001(\0132\034." + "context.Constraint_ScheduleH\000\022A\n\021endpoin" + "t_location\030\004 \001(\0132$.context.Constraint_En" + "dPointLocationH\000\022A\n\021endpoint_priority\030\005 " + "\001(\0132$.context.Constraint_EndPointPriorit" + "yH\000\0228\n\014sla_capacity\030\006 \001(\0132 .context.Cons" + "traint_SLA_CapacityH\000\0226\n\013sla_latency\030\007 \001" + "(\0132\037.context.Constraint_SLA_LatencyH\000\022@\n" + "\020sla_availability\030\010 \001(\0132$.context.Constr" + "aint_SLA_AvailabilityH\000\022@\n\rsla_isolation" + "\030\t \001(\0132\'.context.Constraint_SLA_Isolatio" + "n_levelH\000\0224\n\nexclusions\030\n \001(\0132\036.context." + "Constraint_ExclusionsH\000\0225\n\013qos_profile\030\013" + " \001(\0132\036.context.Constraint_QoSProfileH\000B\014" + "\n\nconstraint\"^\n\022TeraFlowController\022&\n\nco" + "ntext_id\030\001 \001(\0132\022.context.ContextId\022\022\n\nip" + "_address\030\002 \001(\t\022\014\n\004port\030\003 \001(\r\"U\n\024Authenti" + "cationResult\022&\n\ncontext_id\030\001 \001(\0132\022.conte" + "xt.ContextId\022\025\n\rauthenticated\030\002 \001(\010\"-\n\017O" + "pticalConfigId\022\032\n\022opticalconfig_uuid\030\001 \001" + "(\t\"y\n\rOpticalConfig\0222\n\020opticalconfig_id\030" + "\001 \001(\0132\030.context.OpticalConfigId\022\016\n\006confi" + "g\030\002 \001(\t\022$\n\tdevice_id\030\003 \001(\0132\021.context.Dev" + "iceId\"C\n\021OpticalConfigList\022.\n\016opticalcon" + "figs\030\001 \003(\0132\026.context.OpticalConfig\"g\n\022Op" + "ticalConfigEvent\022\035\n\005event\030\001 \001(\0132\016.contex" + "t.Event\0222\n\020opticalconfig_id\030\002 \001(\0132\030.cont" + "ext.OpticalConfigId\"_\n\021OpticalEndPointId" + "\022$\n\tdevice_id\030\002 \001(\0132\021.context.DeviceId\022$" + "\n\rendpoint_uuid\030\003 \001(\0132\r.context.Uuid\">\n\017" + "OpticalLinkList\022+\n\roptical_links\030\001 \003(\0132\024" + ".context.OpticalLink\"\304\003\n\022OpticalLinkDeta" + "ils\022\016\n\006length\030\001 \001(\002\022\020\n\010src_port\030\002 \001(\t\022\020\n" + "\010dst_port\030\003 \001(\t\022\027\n\017local_peer_port\030\004 \001(\t" + "\022\030\n\020remote_peer_port\030\005 \001(\t\022\014\n\004used\030\006 \001(\010" + "\0228\n\007c_slots\030\007 \003(\0132\'.context.OpticalLinkD" + "etails.CSlotsEntry\0228\n\007l_slots\030\010 \003(\0132\'.co" + "ntext.OpticalLinkDetails.LSlotsEntry\0228\n\007" + "s_slots\030\t \003(\0132\'.context.OpticalLinkDetai" + "ls.SSlotsEntry\032-\n\013CSlotsEntry\022\013\n\003key\030\001 \001" + "(\t\022\r\n\005value\030\002 \001(\005:\0028\001\032-\n\013LSlotsEntry\022\013\n\003" + "key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\0028\001\032-\n\013SSlotsEn" + "try\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\0028\001\"\243\001\n\013" + "OpticalLink\022\014\n\004name\030\001 \001(\t\0224\n\017optical_det" + "ails\030\002 \001(\0132\033.context.OpticalLinkDetails\022" + " \n\007link_id\030\003 \001(\0132\017.context.LinkId\022.\n\021lin" + "k_endpoint_ids\030\004 \003(\0132\023.context.EndPointI" + "d\"0\n\tChannelId\022#\n\014channel_uuid\030\001 \001(\0132\r.c" + "ontext.Uuid\"8\n\rOpticalBandId\022\'\n\020opticalb" + "and_uuid\030\001 \001(\0132\r.context.Uuid\"\247\002\n\013Optica" + "lBand\022.\n\016opticalband_id\030\001 \001(\0132\026.context." + "OpticalBandId\022,\n\rconnection_id\030\002 \001(\0132\025.c" + "ontext.ConnectionId\022&\n\nchannel_id\030\003 \001(\0132" + "\022.context.ChannelId\022&\n\nservice_id\030\004 \001(\0132" + "\022.context.ServiceId\022#\n\007service\030\005 \001(\0132\020.c" + "ontext.ServiceH\000\022)\n\nconnection\030\006 \001(\0132\023.c" + "ontext.ConnectionH\000\022\021\n\007channel\030\007 \001(\tH\000B\007" + "\n\005field\"=\n\017OpticalBandList\022*\n\014opticalban" + "ds\030\001 \003(\0132\024.context.OpticalBand\"r\n\021Servic" + "eConfigRule\022&\n\nservice_id\030\001 \001(\0132\022.contex" + "t.ServiceId\0225\n\021configrule_custom\030\002 \001(\0132\032" + ".context.ConfigRule_Custom*j\n\rEventTypeE" + "num\022\027\n\023EVENTTYPE_UNDEFINED\020\000\022\024\n\020EVENTTYP" + "E_CREATE\020\001\022\024\n\020EVENTTYPE_UPDATE\020\002\022\024\n\020EVEN" + "TTYPE_REMOVE\020\003*\333\004\n\020DeviceDriverEnum\022\032\n\026D" + "EVICEDRIVER_UNDEFINED\020\000\022\033\n\027DEVICEDRIVER_" + "OPENCONFIG\020\001\022\036\n\032DEVICEDRIVER_TRANSPORT_A" + "PI\020\002\022\023\n\017DEVICEDRIVER_P4\020\003\022&\n\"DEVICEDRIVE" + "R_IETF_NETWORK_TOPOLOGY\020\004\022\033\n\027DEVICEDRIVE" + "R_ONF_TR_532\020\005\022\023\n\017DEVICEDRIVER_XR\020\006\022\033\n\027D" + "EVICEDRIVER_IETF_L2VPN\020\007\022 \n\034DEVICEDRIVER" + "_GNMI_OPENCONFIG\020\010\022\034\n\030DEVICEDRIVER_OPTIC" + "AL_TFS\020\t\022\032\n\026DEVICEDRIVER_IETF_ACTN\020\n\022\023\n\017" + "DEVICEDRIVER_OC\020\013\022\024\n\020DEVICEDRIVER_QKD\020\014\022" + "\033\n\027DEVICEDRIVER_IETF_L3VPN\020\r\022\033\n\027DEVICEDR" + "IVER_IETF_SLICE\020\016\022\024\n\020DEVICEDRIVER_NCE\020\017\022" + "\031\n\025DEVICEDRIVER_SMARTNIC\020\020\022\031\n\025DEVICEDRIV" + "ER_MORPHEUS\020\021\022\024\n\020DEVICEDRIVER_RYU\020\022\022#\n\037D" + "EVICEDRIVER_GNMI_NOKIA_SRLINUX\020\023\022\032\n\026DEVI" + "CEDRIVER_OPENROADM\020\024*\217\001\n\033DeviceOperation" + "alStatusEnum\022%\n!DEVICEOPERATIONALSTATUS_" + "UNDEFINED\020\000\022$\n DEVICEOPERATIONALSTATUS_D" + "ISABLED\020\001\022#\n\037DEVICEOPERATIONALSTATUS_ENA" + "BLED\020\002*\245\001\n\014LinkTypeEnum\022\024\n\020LINKTYPE_UNKN" + "OWN\020\000\022\023\n\017LINKTYPE_COPPER\020\001\022\022\n\016LINKTYPE_F" + "IBER\020\002\022\022\n\016LINKTYPE_RADIO\020\003\022\024\n\020LINKTYPE_V" + "IRTUAL\020\004\022\027\n\023LINKTYPE_MANAGEMENT\020\005\022\023\n\017LIN" + "KTYPE_REMOTE\020\006*\360\002\n\017ServiceTypeEnum\022\027\n\023SE" + "RVICETYPE_UNKNOWN\020\000\022\024\n\020SERVICETYPE_L3NM\020" + "\001\022\024\n\020SERVICETYPE_L2NM\020\002\022)\n%SERVICETYPE_T" + "API_CONNECTIVITY_SERVICE\020\003\022\022\n\016SERVICETYP" + "E_TE\020\004\022\023\n\017SERVICETYPE_E2E\020\005\022$\n SERVICETY" + "PE_OPTICAL_CONNECTIVITY\020\006\022\023\n\017SERVICETYPE" + "_QKD\020\007\022\024\n\020SERVICETYPE_L1NM\020\010\022\023\n\017SERVICET" + "YPE_INT\020\t\022\023\n\017SERVICETYPE_ACL\020\n\022\027\n\023SERVIC" + "ETYPE_IP_LINK\020\013\022\030\n\024SERVICETYPE_TAPI_LSP\020" + "\014\022\026\n\022SERVICETYPE_IPOWDM\020\r*\304\001\n\021ServiceSta" + "tusEnum\022\033\n\027SERVICESTATUS_UNDEFINED\020\000\022\031\n\025" + "SERVICESTATUS_PLANNED\020\001\022\030\n\024SERVICESTATUS" + "_ACTIVE\020\002\022\032\n\026SERVICESTATUS_UPDATING\020\003\022!\n" + "\035SERVICESTATUS_PENDING_REMOVAL\020\004\022\036\n\032SERV" + "ICESTATUS_SLA_VIOLATED\020\005*\251\001\n\017SliceStatus" + "Enum\022\031\n\025SLICESTATUS_UNDEFINED\020\000\022\027\n\023SLICE" + "STATUS_PLANNED\020\001\022\024\n\020SLICESTATUS_INIT\020\002\022\026" + "\n\022SLICESTATUS_ACTIVE\020\003\022\026\n\022SLICESTATUS_DE" + "INIT\020\004\022\034\n\030SLICESTATUS_SLA_VIOLATED\020\005*]\n\020" + "ConfigActionEnum\022\032\n\026CONFIGACTION_UNDEFIN" + "ED\020\000\022\024\n\020CONFIGACTION_SET\020\001\022\027\n\023CONFIGACTI" + "ON_DELETE\020\002*m\n\024ConstraintActionEnum\022\036\n\032C" + "ONSTRAINTACTION_UNDEFINED\020\000\022\030\n\024CONSTRAIN" + "TACTION_SET\020\001\022\033\n\027CONSTRAINTACTION_DELETE" + "\020\002*\203\002\n\022IsolationLevelEnum\022\020\n\014NO_ISOLATIO" + "N\020\000\022\026\n\022PHYSICAL_ISOLATION\020\001\022\025\n\021LOGICAL_I" + "SOLATION\020\002\022\025\n\021PROCESS_ISOLATION\020\003\022\035\n\031PHY" + "SICAL_MEMORY_ISOLATION\020\004\022\036\n\032PHYSICAL_NET" + "WORK_ISOLATION\020\005\022\036\n\032VIRTUAL_RESOURCE_ISO" + "LATION\020\006\022\037\n\033NETWORK_FUNCTIONS_ISOLATION\020" + "\007\022\025\n\021SERVICE_ISOLATION\020\0102\274\035\n\016ContextServ" + "ice\022:\n\016ListContextIds\022\016.context.Empty\032\026." + "context.ContextIdList\"\000\0226\n\014ListContexts\022" + "\016.context.Empty\032\024.context.ContextList\"\000\022" + "4\n\nGetContext\022\022.context.ContextId\032\020.cont" + "ext.Context\"\000\0224\n\nSetContext\022\020.context.Co" + "ntext\032\022.context.ContextId\"\000\0225\n\rRemoveCon" + "text\022\022.context.ContextId\032\016.context.Empty" + "\"\000\022=\n\020GetContextEvents\022\016.context.Empty\032\025" + ".context.ContextEvent\"\0000\001\022@\n\017ListTopolog" + "yIds\022\022.context.ContextId\032\027.context.Topol" + "ogyIdList\"\000\022=\n\016ListTopologies\022\022.context." + "ContextId\032\025.context.TopologyList\"\000\0227\n\013Ge" + "tTopology\022\023.context.TopologyId\032\021.context" + ".Topology\"\000\022E\n\022GetTopologyDetails\022\023.cont" + "ext.TopologyId\032\030.context.TopologyDetails" + "\"\000\0227\n\013SetTopology\022\021.context.Topology\032\023.c" + "ontext.TopologyId\"\000\0227\n\016RemoveTopology\022\023." + "context.TopologyId\032\016.context.Empty\"\000\022?\n\021" + "GetTopologyEvents\022\016.context.Empty\032\026.cont" + "ext.TopologyEvent\"\0000\001\0228\n\rListDeviceIds\022\016" + ".context.Empty\032\025.context.DeviceIdList\"\000\022" + "4\n\013ListDevices\022\016.context.Empty\032\023.context" + ".DeviceList\"\000\0221\n\tGetDevice\022\021.context.Dev" + "iceId\032\017.context.Device\"\000\0221\n\tSetDevice\022\017." + "context.Device\032\021.context.DeviceId\"\000\0223\n\014R" + "emoveDevice\022\021.context.DeviceId\032\016.context" + ".Empty\"\000\022;\n\017GetDeviceEvents\022\016.context.Em" + "pty\032\024.context.DeviceEvent\"\0000\001\022<\n\014SelectD" + "evice\022\025.context.DeviceFilter\032\023.context.D" + "eviceList\"\000\022I\n\021ListEndPointNames\022\027.conte" + "xt.EndPointIdList\032\031.context.EndPointName" + "List\"\000\0224\n\013ListLinkIds\022\016.context.Empty\032\023." + "context.LinkIdList\"\000\0220\n\tListLinks\022\016.cont" + "ext.Empty\032\021.context.LinkList\"\000\022+\n\007GetLin" + "k\022\017.context.LinkId\032\r.context.Link\"\000\022+\n\007S" + "etLink\022\r.context.Link\032\017.context.LinkId\"\000" + "\022/\n\nRemoveLink\022\017.context.LinkId\032\016.contex" + "t.Empty\"\000\0227\n\rGetLinkEvents\022\016.context.Emp" + "ty\032\022.context.LinkEvent\"\0000\001\022>\n\016ListServic" + "eIds\022\022.context.ContextId\032\026.context.Servi" + "ceIdList\"\000\022:\n\014ListServices\022\022.context.Con" + "textId\032\024.context.ServiceList\"\000\0224\n\nGetSer" + "vice\022\022.context.ServiceId\032\020.context.Servi" + "ce\"\000\0224\n\nSetService\022\020.context.Service\032\022.c" + "ontext.ServiceId\"\000\0226\n\014UnsetService\022\020.con" + "text.Service\032\022.context.ServiceId\"\000\0225\n\rRe" + "moveService\022\022.context.ServiceId\032\016.contex" + "t.Empty\"\000\022=\n\020GetServiceEvents\022\016.context." + "Empty\032\025.context.ServiceEvent\"\0000\001\022?\n\rSele" + "ctService\022\026.context.ServiceFilter\032\024.cont" + "ext.ServiceList\"\000\022:\n\014ListSliceIds\022\022.cont" + "ext.ContextId\032\024.context.SliceIdList\"\000\0226\n", "\nListSlices\022\022.context.ContextId\032\022.contex" + "t.SliceList\"\000\022.\n\010GetSlice\022\020.context.Slic" + "eId\032\016.context.Slice\"\000\022.\n\010SetSlice\022\016.cont" + "ext.Slice\032\020.context.SliceId\"\000\0220\n\nUnsetSl" + "ice\022\016.context.Slice\032\020.context.SliceId\"\000\022" + "1\n\013RemoveSlice\022\020.context.SliceId\032\016.conte" + "xt.Empty\"\000\0229\n\016GetSliceEvents\022\016.context.E" + "mpty\032\023.context.SliceEvent\"\0000\001\0229\n\013SelectS" + "lice\022\024.context.SliceFilter\032\022.context.Sli" + "ceList\"\000\022D\n\021ListConnectionIds\022\022.context." + "ServiceId\032\031.context.ConnectionIdList\"\000\022@" + "\n\017ListConnections\022\022.context.ServiceId\032\027." + "context.ConnectionList\"\000\022=\n\rGetConnectio" + "n\022\025.context.ConnectionId\032\023.context.Conne" + "ction\"\000\022=\n\rSetConnection\022\023.context.Conne" + "ction\032\025.context.ConnectionId\"\000\022;\n\020Remove" + "Connection\022\025.context.ConnectionId\032\016.cont" + "ext.Empty\"\000\022C\n\023GetConnectionEvents\022\016.con" + "text.Empty\032\030.context.ConnectionEvent\"\0000\001" + "\0225\n\014GetAllEvents\022\016.context.Empty\032\021.conte" + "xt.AnyEvent\"\0000\001\022@\n\020GetOpticalConfig\022\016.co" + "ntext.Empty\032\032.context.OpticalConfigList\"" + "\000\022F\n\020SetOpticalConfig\022\026.context.OpticalC" + "onfig\032\030.context.OpticalConfigId\"\000\022I\n\023Upd" + "ateOpticalConfig\022\026.context.OpticalConfig" + "\032\030.context.OpticalConfigId\"\000\022I\n\023SelectOp" + "ticalConfig\022\030.context.OpticalConfigId\032\026." + "context.OpticalConfig\"\000\022A\n\023DeleteOptical" + "Config\022\030.context.OpticalConfigId\032\016.conte" + "xt.Empty\"\000\022@\n\024DeleteOpticalChannel\022\026.con" + "text.OpticalConfig\032\016.context.Empty\"\000\0228\n\016" + "SetOpticalLink\022\024.context.OpticalLink\032\016.c" + "ontext.Empty\"\000\0229\n\016GetOpticalLink\022\017.conte" + "xt.LinkId\032\024.context.OpticalLink\"\000\0226\n\021Del" + "eteOpticalLink\022\017.context.LinkId\032\016.contex" + "t.Empty\"\000\022@\n\022GetOpticalLinkList\022\016.contex" + "t.Empty\032\030.context.OpticalLinkList\"\000\022<\n\016G" + "etOpticalBand\022\016.context.Empty\032\030.context." + "OpticalBandList\"\000\022C\n\021SelectOpticalBand\022\026" + ".context.OpticalBandId\032\024.context.Optical" + "Band\"\000\022G\n\027DeleteServiceConfigRule\022\032.cont" + "ext.ServiceConfigRule\032\016.context.Empty\"\000b" + "\006proto3" };
+        descriptor = com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] { com.google.protobuf.AnyProto.getDescriptor(), acl.Acl.getDescriptor(), ipowdm.Ipowdm.getDescriptor(), ip_link.IpLink.getDescriptor(), kpi_sample_types.KpiSampleTypes.getDescriptor(), tapi_lsp.TapiLsp.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[] {});
         internal_static_context_Uuid_descriptor = getDescriptor().getMessageTypes().get(1);
@@ -88132,55 +90272,59 @@ public final class ContextOuterClass {
         internal_static_context_ConfigRule_Custom_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_ConfigRule_Custom_descriptor, new java.lang.String[] { "ResourceKey", "ResourceValue" });
         internal_static_context_ConfigRule_ACL_descriptor = getDescriptor().getMessageTypes().get(63);
         internal_static_context_ConfigRule_ACL_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_ConfigRule_ACL_descriptor, new java.lang.String[] { "EndpointId", "RuleSet" });
-        internal_static_context_ConfigRule_IP_LINK_descriptor = getDescriptor().getMessageTypes().get(64);
+        internal_static_context_ConfigRule_IPOWDM_descriptor = getDescriptor().getMessageTypes().get(64);
+        internal_static_context_ConfigRule_IPOWDM_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_ConfigRule_IPOWDM_descriptor, new java.lang.String[] { "EndpointId", "RuleSet" });
+        internal_static_context_ConfigRule_TAPI_LSP_descriptor = getDescriptor().getMessageTypes().get(65);
+        internal_static_context_ConfigRule_TAPI_LSP_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_ConfigRule_TAPI_LSP_descriptor, new java.lang.String[] { "EndpointId", "RuleSet" });
+        internal_static_context_ConfigRule_IP_LINK_descriptor = getDescriptor().getMessageTypes().get(66);
         internal_static_context_ConfigRule_IP_LINK_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_ConfigRule_IP_LINK_descriptor, new java.lang.String[] { "EndpointId", "RuleSet" });
-        internal_static_context_ConfigRule_descriptor = getDescriptor().getMessageTypes().get(65);
-        internal_static_context_ConfigRule_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_ConfigRule_descriptor, new java.lang.String[] { "Action", "Custom", "Acl", "IpLink", "ConfigRule" });
-        internal_static_context_Constraint_Custom_descriptor = getDescriptor().getMessageTypes().get(66);
+        internal_static_context_ConfigRule_descriptor = getDescriptor().getMessageTypes().get(67);
+        internal_static_context_ConfigRule_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_ConfigRule_descriptor, new java.lang.String[] { "Action", "Custom", "Acl", "IpLink", "TapiLsp", "Ipowdm", "ConfigRule" });
+        internal_static_context_Constraint_Custom_descriptor = getDescriptor().getMessageTypes().get(68);
         internal_static_context_Constraint_Custom_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_Constraint_Custom_descriptor, new java.lang.String[] { "ConstraintType", "ConstraintValue" });
-        internal_static_context_Constraint_Schedule_descriptor = getDescriptor().getMessageTypes().get(67);
+        internal_static_context_Constraint_Schedule_descriptor = getDescriptor().getMessageTypes().get(69);
         internal_static_context_Constraint_Schedule_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_Constraint_Schedule_descriptor, new java.lang.String[] { "StartTimestamp", "DurationDays" });
-        internal_static_context_GPS_Position_descriptor = getDescriptor().getMessageTypes().get(68);
+        internal_static_context_GPS_Position_descriptor = getDescriptor().getMessageTypes().get(70);
         internal_static_context_GPS_Position_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_GPS_Position_descriptor, new java.lang.String[] { "Latitude", "Longitude" });
-        internal_static_context_Location_descriptor = getDescriptor().getMessageTypes().get(69);
+        internal_static_context_Location_descriptor = getDescriptor().getMessageTypes().get(71);
         internal_static_context_Location_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_Location_descriptor, new java.lang.String[] { "Region", "GpsPosition", "Interface", "CircuitPack", "Location" });
-        internal_static_context_Constraint_EndPointLocation_descriptor = getDescriptor().getMessageTypes().get(70);
+        internal_static_context_Constraint_EndPointLocation_descriptor = getDescriptor().getMessageTypes().get(72);
         internal_static_context_Constraint_EndPointLocation_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_Constraint_EndPointLocation_descriptor, new java.lang.String[] { "EndpointId", "Location" });
-        internal_static_context_Constraint_EndPointPriority_descriptor = getDescriptor().getMessageTypes().get(71);
+        internal_static_context_Constraint_EndPointPriority_descriptor = getDescriptor().getMessageTypes().get(73);
         internal_static_context_Constraint_EndPointPriority_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_Constraint_EndPointPriority_descriptor, new java.lang.String[] { "EndpointId", "Priority" });
-        internal_static_context_Constraint_SLA_Latency_descriptor = getDescriptor().getMessageTypes().get(72);
+        internal_static_context_Constraint_SLA_Latency_descriptor = getDescriptor().getMessageTypes().get(74);
         internal_static_context_Constraint_SLA_Latency_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_Constraint_SLA_Latency_descriptor, new java.lang.String[] { "E2ELatencyMs" });
-        internal_static_context_Constraint_SLA_Capacity_descriptor = getDescriptor().getMessageTypes().get(73);
+        internal_static_context_Constraint_SLA_Capacity_descriptor = getDescriptor().getMessageTypes().get(75);
         internal_static_context_Constraint_SLA_Capacity_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_Constraint_SLA_Capacity_descriptor, new java.lang.String[] { "CapacityGbps" });
-        internal_static_context_Constraint_SLA_Availability_descriptor = getDescriptor().getMessageTypes().get(74);
+        internal_static_context_Constraint_SLA_Availability_descriptor = getDescriptor().getMessageTypes().get(76);
         internal_static_context_Constraint_SLA_Availability_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_Constraint_SLA_Availability_descriptor, new java.lang.String[] { "NumDisjointPaths", "AllActive", "Availability" });
-        internal_static_context_Constraint_SLA_Isolation_level_descriptor = getDescriptor().getMessageTypes().get(75);
+        internal_static_context_Constraint_SLA_Isolation_level_descriptor = getDescriptor().getMessageTypes().get(77);
         internal_static_context_Constraint_SLA_Isolation_level_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_Constraint_SLA_Isolation_level_descriptor, new java.lang.String[] { "IsolationLevel" });
-        internal_static_context_Constraint_Exclusions_descriptor = getDescriptor().getMessageTypes().get(76);
+        internal_static_context_Constraint_Exclusions_descriptor = getDescriptor().getMessageTypes().get(78);
         internal_static_context_Constraint_Exclusions_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_Constraint_Exclusions_descriptor, new java.lang.String[] { "IsPermanent", "DeviceIds", "EndpointIds", "LinkIds" });
-        internal_static_context_QoSProfileId_descriptor = getDescriptor().getMessageTypes().get(77);
+        internal_static_context_QoSProfileId_descriptor = getDescriptor().getMessageTypes().get(79);
         internal_static_context_QoSProfileId_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_QoSProfileId_descriptor, new java.lang.String[] { "QosProfileId" });
-        internal_static_context_Constraint_QoSProfile_descriptor = getDescriptor().getMessageTypes().get(78);
+        internal_static_context_Constraint_QoSProfile_descriptor = getDescriptor().getMessageTypes().get(80);
         internal_static_context_Constraint_QoSProfile_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_Constraint_QoSProfile_descriptor, new java.lang.String[] { "QosProfileId", "QosProfileName" });
-        internal_static_context_Constraint_descriptor = getDescriptor().getMessageTypes().get(79);
+        internal_static_context_Constraint_descriptor = getDescriptor().getMessageTypes().get(81);
         internal_static_context_Constraint_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_Constraint_descriptor, new java.lang.String[] { "Action", "Custom", "Schedule", "EndpointLocation", "EndpointPriority", "SlaCapacity", "SlaLatency", "SlaAvailability", "SlaIsolation", "Exclusions", "QosProfile", "Constraint" });
-        internal_static_context_TeraFlowController_descriptor = getDescriptor().getMessageTypes().get(80);
+        internal_static_context_TeraFlowController_descriptor = getDescriptor().getMessageTypes().get(82);
         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(81);
+        internal_static_context_AuthenticationResult_descriptor = getDescriptor().getMessageTypes().get(83);
         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(82);
+        internal_static_context_OpticalConfigId_descriptor = getDescriptor().getMessageTypes().get(84);
         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(83);
+        internal_static_context_OpticalConfig_descriptor = getDescriptor().getMessageTypes().get(85);
         internal_static_context_OpticalConfig_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalConfig_descriptor, new java.lang.String[] { "OpticalconfigId", "Config", "DeviceId" });
-        internal_static_context_OpticalConfigList_descriptor = getDescriptor().getMessageTypes().get(84);
+        internal_static_context_OpticalConfigList_descriptor = getDescriptor().getMessageTypes().get(86);
         internal_static_context_OpticalConfigList_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalConfigList_descriptor, new java.lang.String[] { "Opticalconfigs" });
-        internal_static_context_OpticalConfigEvent_descriptor = getDescriptor().getMessageTypes().get(85);
+        internal_static_context_OpticalConfigEvent_descriptor = getDescriptor().getMessageTypes().get(87);
         internal_static_context_OpticalConfigEvent_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalConfigEvent_descriptor, new java.lang.String[] { "Event", "OpticalconfigId" });
-        internal_static_context_OpticalEndPointId_descriptor = getDescriptor().getMessageTypes().get(86);
+        internal_static_context_OpticalEndPointId_descriptor = getDescriptor().getMessageTypes().get(88);
         internal_static_context_OpticalEndPointId_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalEndPointId_descriptor, new java.lang.String[] { "DeviceId", "EndpointUuid" });
-        internal_static_context_OpticalLinkList_descriptor = getDescriptor().getMessageTypes().get(87);
+        internal_static_context_OpticalLinkList_descriptor = getDescriptor().getMessageTypes().get(89);
         internal_static_context_OpticalLinkList_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalLinkList_descriptor, new java.lang.String[] { "OpticalLinks" });
-        internal_static_context_OpticalLinkDetails_descriptor = getDescriptor().getMessageTypes().get(88);
+        internal_static_context_OpticalLinkDetails_descriptor = getDescriptor().getMessageTypes().get(90);
         internal_static_context_OpticalLinkDetails_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalLinkDetails_descriptor, new java.lang.String[] { "Length", "SrcPort", "DstPort", "LocalPeerPort", "RemotePeerPort", "Used", "CSlots", "LSlots", "SSlots" });
         internal_static_context_OpticalLinkDetails_CSlotsEntry_descriptor = internal_static_context_OpticalLinkDetails_descriptor.getNestedTypes().get(0);
         internal_static_context_OpticalLinkDetails_CSlotsEntry_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalLinkDetails_CSlotsEntry_descriptor, new java.lang.String[] { "Key", "Value" });
@@ -88188,22 +90332,24 @@ public final class ContextOuterClass {
         internal_static_context_OpticalLinkDetails_LSlotsEntry_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalLinkDetails_LSlotsEntry_descriptor, new java.lang.String[] { "Key", "Value" });
         internal_static_context_OpticalLinkDetails_SSlotsEntry_descriptor = internal_static_context_OpticalLinkDetails_descriptor.getNestedTypes().get(2);
         internal_static_context_OpticalLinkDetails_SSlotsEntry_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalLinkDetails_SSlotsEntry_descriptor, new java.lang.String[] { "Key", "Value" });
-        internal_static_context_OpticalLink_descriptor = getDescriptor().getMessageTypes().get(89);
+        internal_static_context_OpticalLink_descriptor = getDescriptor().getMessageTypes().get(91);
         internal_static_context_OpticalLink_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalLink_descriptor, new java.lang.String[] { "Name", "OpticalDetails", "LinkId", "LinkEndpointIds" });
-        internal_static_context_ChannelId_descriptor = getDescriptor().getMessageTypes().get(90);
+        internal_static_context_ChannelId_descriptor = getDescriptor().getMessageTypes().get(92);
         internal_static_context_ChannelId_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_ChannelId_descriptor, new java.lang.String[] { "ChannelUuid" });
-        internal_static_context_OpticalBandId_descriptor = getDescriptor().getMessageTypes().get(91);
+        internal_static_context_OpticalBandId_descriptor = getDescriptor().getMessageTypes().get(93);
         internal_static_context_OpticalBandId_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalBandId_descriptor, new java.lang.String[] { "OpticalbandUuid" });
-        internal_static_context_OpticalBand_descriptor = getDescriptor().getMessageTypes().get(92);
+        internal_static_context_OpticalBand_descriptor = getDescriptor().getMessageTypes().get(94);
         internal_static_context_OpticalBand_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalBand_descriptor, new java.lang.String[] { "OpticalbandId", "ConnectionId", "ChannelId", "ServiceId", "Service", "Connection", "Channel", "Field" });
-        internal_static_context_OpticalBandList_descriptor = getDescriptor().getMessageTypes().get(93);
+        internal_static_context_OpticalBandList_descriptor = getDescriptor().getMessageTypes().get(95);
         internal_static_context_OpticalBandList_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalBandList_descriptor, new java.lang.String[] { "Opticalbands" });
-        internal_static_context_ServiceConfigRule_descriptor = getDescriptor().getMessageTypes().get(94);
+        internal_static_context_ServiceConfigRule_descriptor = getDescriptor().getMessageTypes().get(96);
         internal_static_context_ServiceConfigRule_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_ServiceConfigRule_descriptor, new java.lang.String[] { "ServiceId", "ConfigruleCustom" });
         com.google.protobuf.AnyProto.getDescriptor();
         acl.Acl.getDescriptor();
+        ipowdm.Ipowdm.getDescriptor();
         ip_link.IpLink.getDescriptor();
         kpi_sample_types.KpiSampleTypes.getDescriptor();
+        tapi_lsp.TapiLsp.getDescriptor();
     }
     // @@protoc_insertion_point(outer_class_scope)
 }
diff --git a/src/policy/target/generated-sources/grpc/ipowdm/Ipowdm.java b/src/policy/target/generated-sources/grpc/ipowdm/Ipowdm.java
new file mode 100644
index 000000000..2008e5d4f
--- /dev/null
+++ b/src/policy/target/generated-sources/grpc/ipowdm/Ipowdm.java
@@ -0,0 +1,5782 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: ipowdm.proto
+package ipowdm;
+
+public final class Ipowdm {
+
+    private Ipowdm() {
+    }
+
+    public static void registerAllExtensions(com.google.protobuf.ExtensionRegistryLite registry) {
+    }
+
+    public static void registerAllExtensions(com.google.protobuf.ExtensionRegistry registry) {
+        registerAllExtensions((com.google.protobuf.ExtensionRegistryLite) registry);
+    }
+
+    public interface RuleEndpointOrBuilder extends // @@protoc_insertion_point(interface_extends:ipowdm.RuleEndpoint)
+    com.google.protobuf.MessageOrBuilder {
+
+        /**
+         * string uuid = 1;
+         * @return The uuid.
+         */
+        java.lang.String getUuid();
+
+        /**
+         * string uuid = 1;
+         * @return The bytes for uuid.
+         */
+        com.google.protobuf.ByteString getUuidBytes();
+
+        /**
+         * string ip_address = 2;
+         * @return The ipAddress.
+         */
+        java.lang.String getIpAddress();
+
+        /**
+         * string ip_address = 2;
+         * @return The bytes for ipAddress.
+         */
+        com.google.protobuf.ByteString getIpAddressBytes();
+
+        /**
+         * string ip_mask = 3;
+         * @return The ipMask.
+         */
+        java.lang.String getIpMask();
+
+        /**
+         * string ip_mask = 3;
+         * @return The bytes for ipMask.
+         */
+        com.google.protobuf.ByteString getIpMaskBytes();
+
+        /**
+         * int32 vlan_id = 4;
+         * @return The vlanId.
+         */
+        int getVlanId();
+    }
+
+    /**
+     * Protobuf type {@code ipowdm.RuleEndpoint}
+     */
+    public static final class RuleEndpoint extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:ipowdm.RuleEndpoint)
+    RuleEndpointOrBuilder {
+
+        private static final long serialVersionUID = 0L;
+
+        // Use RuleEndpoint.newBuilder() to construct.
+        private RuleEndpoint(com.google.protobuf.GeneratedMessageV3.Builder builder) {
+            super(builder);
+        }
+
+        private RuleEndpoint() {
+            uuid_ = "";
+            ipAddress_ = "";
+            ipMask_ = "";
+        }
+
+        @java.lang.Override
+        @SuppressWarnings({ "unused" })
+        protected java.lang.Object newInstance(UnusedPrivateParameter unused) {
+            return new RuleEndpoint();
+        }
+
+        public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+            return ipowdm.Ipowdm.internal_static_ipowdm_RuleEndpoint_descriptor;
+        }
+
+        @java.lang.Override
+        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+            return ipowdm.Ipowdm.internal_static_ipowdm_RuleEndpoint_fieldAccessorTable.ensureFieldAccessorsInitialized(ipowdm.Ipowdm.RuleEndpoint.class, ipowdm.Ipowdm.RuleEndpoint.Builder.class);
+        }
+
+        public static final int UUID_FIELD_NUMBER = 1;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object uuid_ = "";
+
+        /**
+         * string uuid = 1;
+         * @return The uuid.
+         */
+        @java.lang.Override
+        public java.lang.String getUuid() {
+            java.lang.Object ref = uuid_;
+            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();
+                uuid_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string uuid = 1;
+         * @return The bytes for uuid.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getUuidBytes() {
+            java.lang.Object ref = uuid_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                uuid_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int IP_ADDRESS_FIELD_NUMBER = 2;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object ipAddress_ = "";
+
+        /**
+         * string ip_address = 2;
+         * @return The ipAddress.
+         */
+        @java.lang.Override
+        public java.lang.String getIpAddress() {
+            java.lang.Object ref = ipAddress_;
+            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();
+                ipAddress_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string ip_address = 2;
+         * @return The bytes for ipAddress.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getIpAddressBytes() {
+            java.lang.Object ref = ipAddress_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                ipAddress_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int IP_MASK_FIELD_NUMBER = 3;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object ipMask_ = "";
+
+        /**
+         * string ip_mask = 3;
+         * @return The ipMask.
+         */
+        @java.lang.Override
+        public java.lang.String getIpMask() {
+            java.lang.Object ref = ipMask_;
+            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();
+                ipMask_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string ip_mask = 3;
+         * @return The bytes for ipMask.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getIpMaskBytes() {
+            java.lang.Object ref = ipMask_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                ipMask_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int VLAN_ID_FIELD_NUMBER = 4;
+
+        private int vlanId_ = 0;
+
+        /**
+         * int32 vlan_id = 4;
+         * @return The vlanId.
+         */
+        @java.lang.Override
+        public int getVlanId() {
+            return vlanId_;
+        }
+
+        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(uuid_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 1, uuid_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(ipAddress_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 2, ipAddress_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(ipMask_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 3, ipMask_);
+            }
+            if (vlanId_ != 0) {
+                output.writeInt32(4, vlanId_);
+            }
+            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(uuid_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, uuid_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(ipAddress_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, ipAddress_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(ipMask_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, ipMask_);
+            }
+            if (vlanId_ != 0) {
+                size += com.google.protobuf.CodedOutputStream.computeInt32Size(4, vlanId_);
+            }
+            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 ipowdm.Ipowdm.RuleEndpoint)) {
+                return super.equals(obj);
+            }
+            ipowdm.Ipowdm.RuleEndpoint other = (ipowdm.Ipowdm.RuleEndpoint) obj;
+            if (!getUuid().equals(other.getUuid()))
+                return false;
+            if (!getIpAddress().equals(other.getIpAddress()))
+                return false;
+            if (!getIpMask().equals(other.getIpMask()))
+                return false;
+            if (getVlanId() != other.getVlanId())
+                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) + UUID_FIELD_NUMBER;
+            hash = (53 * hash) + getUuid().hashCode();
+            hash = (37 * hash) + IP_ADDRESS_FIELD_NUMBER;
+            hash = (53 * hash) + getIpAddress().hashCode();
+            hash = (37 * hash) + IP_MASK_FIELD_NUMBER;
+            hash = (53 * hash) + getIpMask().hashCode();
+            hash = (37 * hash) + VLAN_ID_FIELD_NUMBER;
+            hash = (53 * hash) + getVlanId();
+            hash = (29 * hash) + getUnknownFields().hashCode();
+            memoizedHashCode = hash;
+            return hash;
+        }
+
+        public static ipowdm.Ipowdm.RuleEndpoint parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.RuleEndpoint parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.RuleEndpoint parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.RuleEndpoint parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.RuleEndpoint parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.RuleEndpoint parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.RuleEndpoint parseFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.RuleEndpoint 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 ipowdm.Ipowdm.RuleEndpoint parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.RuleEndpoint 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 ipowdm.Ipowdm.RuleEndpoint parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.RuleEndpoint 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(ipowdm.Ipowdm.RuleEndpoint 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 ipowdm.RuleEndpoint}
+         */
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:ipowdm.RuleEndpoint)
+        ipowdm.Ipowdm.RuleEndpointOrBuilder {
+
+            public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_RuleEndpoint_descriptor;
+            }
+
+            @java.lang.Override
+            protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_RuleEndpoint_fieldAccessorTable.ensureFieldAccessorsInitialized(ipowdm.Ipowdm.RuleEndpoint.class, ipowdm.Ipowdm.RuleEndpoint.Builder.class);
+            }
+
+            // Construct using ipowdm.Ipowdm.RuleEndpoint.newBuilder()
+            private Builder() {
+            }
+
+            private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+                super(parent);
+            }
+
+            @java.lang.Override
+            public Builder clear() {
+                super.clear();
+                bitField0_ = 0;
+                uuid_ = "";
+                ipAddress_ = "";
+                ipMask_ = "";
+                vlanId_ = 0;
+                return this;
+            }
+
+            @java.lang.Override
+            public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_RuleEndpoint_descriptor;
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.RuleEndpoint getDefaultInstanceForType() {
+                return ipowdm.Ipowdm.RuleEndpoint.getDefaultInstance();
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.RuleEndpoint build() {
+                ipowdm.Ipowdm.RuleEndpoint result = buildPartial();
+                if (!result.isInitialized()) {
+                    throw newUninitializedMessageException(result);
+                }
+                return result;
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.RuleEndpoint buildPartial() {
+                ipowdm.Ipowdm.RuleEndpoint result = new ipowdm.Ipowdm.RuleEndpoint(this);
+                if (bitField0_ != 0) {
+                    buildPartial0(result);
+                }
+                onBuilt();
+                return result;
+            }
+
+            private void buildPartial0(ipowdm.Ipowdm.RuleEndpoint result) {
+                int from_bitField0_ = bitField0_;
+                if (((from_bitField0_ & 0x00000001) != 0)) {
+                    result.uuid_ = uuid_;
+                }
+                if (((from_bitField0_ & 0x00000002) != 0)) {
+                    result.ipAddress_ = ipAddress_;
+                }
+                if (((from_bitField0_ & 0x00000004) != 0)) {
+                    result.ipMask_ = ipMask_;
+                }
+                if (((from_bitField0_ & 0x00000008) != 0)) {
+                    result.vlanId_ = vlanId_;
+                }
+            }
+
+            @java.lang.Override
+            public Builder mergeFrom(com.google.protobuf.Message other) {
+                if (other instanceof ipowdm.Ipowdm.RuleEndpoint) {
+                    return mergeFrom((ipowdm.Ipowdm.RuleEndpoint) other);
+                } else {
+                    super.mergeFrom(other);
+                    return this;
+                }
+            }
+
+            public Builder mergeFrom(ipowdm.Ipowdm.RuleEndpoint other) {
+                if (other == ipowdm.Ipowdm.RuleEndpoint.getDefaultInstance())
+                    return this;
+                if (!other.getUuid().isEmpty()) {
+                    uuid_ = other.uuid_;
+                    bitField0_ |= 0x00000001;
+                    onChanged();
+                }
+                if (!other.getIpAddress().isEmpty()) {
+                    ipAddress_ = other.ipAddress_;
+                    bitField0_ |= 0x00000002;
+                    onChanged();
+                }
+                if (!other.getIpMask().isEmpty()) {
+                    ipMask_ = other.ipMask_;
+                    bitField0_ |= 0x00000004;
+                    onChanged();
+                }
+                if (other.getVlanId() != 0) {
+                    setVlanId(other.getVlanId());
+                }
+                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:
+                                {
+                                    uuid_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00000001;
+                                    break;
+                                }
+                            // case 10
+                            case 18:
+                                {
+                                    ipAddress_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00000002;
+                                    break;
+                                }
+                            // case 18
+                            case 26:
+                                {
+                                    ipMask_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00000004;
+                                    break;
+                                }
+                            // case 26
+                            case 32:
+                                {
+                                    vlanId_ = input.readInt32();
+                                    bitField0_ |= 0x00000008;
+                                    break;
+                                }
+                            // case 32
+                            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 uuid_ = "";
+
+            /**
+             * string uuid = 1;
+             * @return The uuid.
+             */
+            public java.lang.String getUuid() {
+                java.lang.Object ref = uuid_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    uuid_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string uuid = 1;
+             * @return The bytes for uuid.
+             */
+            public com.google.protobuf.ByteString getUuidBytes() {
+                java.lang.Object ref = uuid_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    uuid_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string uuid = 1;
+             * @param value The uuid to set.
+             * @return This builder for chaining.
+             */
+            public Builder setUuid(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                uuid_ = value;
+                bitField0_ |= 0x00000001;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string uuid = 1;
+             * @return This builder for chaining.
+             */
+            public Builder clearUuid() {
+                uuid_ = getDefaultInstance().getUuid();
+                bitField0_ = (bitField0_ & ~0x00000001);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string uuid = 1;
+             * @param value The bytes for uuid to set.
+             * @return This builder for chaining.
+             */
+            public Builder setUuidBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                uuid_ = value;
+                bitField0_ |= 0x00000001;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object ipAddress_ = "";
+
+            /**
+             * string ip_address = 2;
+             * @return The ipAddress.
+             */
+            public java.lang.String getIpAddress() {
+                java.lang.Object ref = ipAddress_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    ipAddress_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string ip_address = 2;
+             * @return The bytes for ipAddress.
+             */
+            public com.google.protobuf.ByteString getIpAddressBytes() {
+                java.lang.Object ref = ipAddress_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    ipAddress_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string ip_address = 2;
+             * @param value The ipAddress to set.
+             * @return This builder for chaining.
+             */
+            public Builder setIpAddress(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                ipAddress_ = value;
+                bitField0_ |= 0x00000002;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string ip_address = 2;
+             * @return This builder for chaining.
+             */
+            public Builder clearIpAddress() {
+                ipAddress_ = getDefaultInstance().getIpAddress();
+                bitField0_ = (bitField0_ & ~0x00000002);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string ip_address = 2;
+             * @param value The bytes for ipAddress to set.
+             * @return This builder for chaining.
+             */
+            public Builder setIpAddressBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                ipAddress_ = value;
+                bitField0_ |= 0x00000002;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object ipMask_ = "";
+
+            /**
+             * string ip_mask = 3;
+             * @return The ipMask.
+             */
+            public java.lang.String getIpMask() {
+                java.lang.Object ref = ipMask_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    ipMask_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string ip_mask = 3;
+             * @return The bytes for ipMask.
+             */
+            public com.google.protobuf.ByteString getIpMaskBytes() {
+                java.lang.Object ref = ipMask_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    ipMask_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string ip_mask = 3;
+             * @param value The ipMask to set.
+             * @return This builder for chaining.
+             */
+            public Builder setIpMask(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                ipMask_ = value;
+                bitField0_ |= 0x00000004;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string ip_mask = 3;
+             * @return This builder for chaining.
+             */
+            public Builder clearIpMask() {
+                ipMask_ = getDefaultInstance().getIpMask();
+                bitField0_ = (bitField0_ & ~0x00000004);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string ip_mask = 3;
+             * @param value The bytes for ipMask to set.
+             * @return This builder for chaining.
+             */
+            public Builder setIpMaskBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                ipMask_ = value;
+                bitField0_ |= 0x00000004;
+                onChanged();
+                return this;
+            }
+
+            private int vlanId_;
+
+            /**
+             * int32 vlan_id = 4;
+             * @return The vlanId.
+             */
+            @java.lang.Override
+            public int getVlanId() {
+                return vlanId_;
+            }
+
+            /**
+             * int32 vlan_id = 4;
+             * @param value The vlanId to set.
+             * @return This builder for chaining.
+             */
+            public Builder setVlanId(int value) {
+                vlanId_ = value;
+                bitField0_ |= 0x00000008;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * int32 vlan_id = 4;
+             * @return This builder for chaining.
+             */
+            public Builder clearVlanId() {
+                bitField0_ = (bitField0_ & ~0x00000008);
+                vlanId_ = 0;
+                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:ipowdm.RuleEndpoint)
+        }
+
+        // @@protoc_insertion_point(class_scope:ipowdm.RuleEndpoint)
+        private static final ipowdm.Ipowdm.RuleEndpoint DEFAULT_INSTANCE;
+
+        static {
+            DEFAULT_INSTANCE = new ipowdm.Ipowdm.RuleEndpoint();
+        }
+
+        public static ipowdm.Ipowdm.RuleEndpoint getDefaultInstance() {
+            return DEFAULT_INSTANCE;
+        }
+
+        private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+
+            @java.lang.Override
+            public RuleEndpoint parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+                Builder builder = newBuilder();
+                try {
+                    builder.mergeFrom(input, extensionRegistry);
+                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    throw e.setUnfinishedMessage(builder.buildPartial());
+                } catch (com.google.protobuf.UninitializedMessageException e) {
+                    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 ipowdm.Ipowdm.RuleEndpoint getDefaultInstanceForType() {
+            return DEFAULT_INSTANCE;
+        }
+    }
+
+    public interface DigitalSubCarrierIdOrBuilder extends // @@protoc_insertion_point(interface_extends:ipowdm.DigitalSubCarrierId)
+    com.google.protobuf.MessageOrBuilder {
+
+        /**
+         * int32 sub_carrier_id = 1;
+         * @return The subCarrierId.
+         */
+        int getSubCarrierId();
+
+        /**
+         * string active = 2;
+         * @return The active.
+         */
+        java.lang.String getActive();
+
+        /**
+         * string active = 2;
+         * @return The bytes for active.
+         */
+        com.google.protobuf.ByteString getActiveBytes();
+    }
+
+    /**
+     * Protobuf type {@code ipowdm.DigitalSubCarrierId}
+     */
+    public static final class DigitalSubCarrierId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:ipowdm.DigitalSubCarrierId)
+    DigitalSubCarrierIdOrBuilder {
+
+        private static final long serialVersionUID = 0L;
+
+        // Use DigitalSubCarrierId.newBuilder() to construct.
+        private DigitalSubCarrierId(com.google.protobuf.GeneratedMessageV3.Builder builder) {
+            super(builder);
+        }
+
+        private DigitalSubCarrierId() {
+            active_ = "";
+        }
+
+        @java.lang.Override
+        @SuppressWarnings({ "unused" })
+        protected java.lang.Object newInstance(UnusedPrivateParameter unused) {
+            return new DigitalSubCarrierId();
+        }
+
+        public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+            return ipowdm.Ipowdm.internal_static_ipowdm_DigitalSubCarrierId_descriptor;
+        }
+
+        @java.lang.Override
+        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+            return ipowdm.Ipowdm.internal_static_ipowdm_DigitalSubCarrierId_fieldAccessorTable.ensureFieldAccessorsInitialized(ipowdm.Ipowdm.DigitalSubCarrierId.class, ipowdm.Ipowdm.DigitalSubCarrierId.Builder.class);
+        }
+
+        public static final int SUB_CARRIER_ID_FIELD_NUMBER = 1;
+
+        private int subCarrierId_ = 0;
+
+        /**
+         * int32 sub_carrier_id = 1;
+         * @return The subCarrierId.
+         */
+        @java.lang.Override
+        public int getSubCarrierId() {
+            return subCarrierId_;
+        }
+
+        public static final int ACTIVE_FIELD_NUMBER = 2;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object active_ = "";
+
+        /**
+         * string active = 2;
+         * @return The active.
+         */
+        @java.lang.Override
+        public java.lang.String getActive() {
+            java.lang.Object ref = active_;
+            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();
+                active_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string active = 2;
+         * @return The bytes for active.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getActiveBytes() {
+            java.lang.Object ref = active_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                active_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        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 (subCarrierId_ != 0) {
+                output.writeInt32(1, subCarrierId_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(active_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 2, active_);
+            }
+            getUnknownFields().writeTo(output);
+        }
+
+        @java.lang.Override
+        public int getSerializedSize() {
+            int size = memoizedSize;
+            if (size != -1)
+                return size;
+            size = 0;
+            if (subCarrierId_ != 0) {
+                size += com.google.protobuf.CodedOutputStream.computeInt32Size(1, subCarrierId_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(active_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, active_);
+            }
+            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 ipowdm.Ipowdm.DigitalSubCarrierId)) {
+                return super.equals(obj);
+            }
+            ipowdm.Ipowdm.DigitalSubCarrierId other = (ipowdm.Ipowdm.DigitalSubCarrierId) obj;
+            if (getSubCarrierId() != other.getSubCarrierId())
+                return false;
+            if (!getActive().equals(other.getActive()))
+                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) + SUB_CARRIER_ID_FIELD_NUMBER;
+            hash = (53 * hash) + getSubCarrierId();
+            hash = (37 * hash) + ACTIVE_FIELD_NUMBER;
+            hash = (53 * hash) + getActive().hashCode();
+            hash = (29 * hash) + getUnknownFields().hashCode();
+            memoizedHashCode = hash;
+            return hash;
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarrierId parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarrierId parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarrierId parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarrierId parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarrierId parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarrierId parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarrierId parseFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarrierId 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 ipowdm.Ipowdm.DigitalSubCarrierId parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarrierId 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 ipowdm.Ipowdm.DigitalSubCarrierId parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarrierId 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(ipowdm.Ipowdm.DigitalSubCarrierId 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 ipowdm.DigitalSubCarrierId}
+         */
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:ipowdm.DigitalSubCarrierId)
+        ipowdm.Ipowdm.DigitalSubCarrierIdOrBuilder {
+
+            public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_DigitalSubCarrierId_descriptor;
+            }
+
+            @java.lang.Override
+            protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_DigitalSubCarrierId_fieldAccessorTable.ensureFieldAccessorsInitialized(ipowdm.Ipowdm.DigitalSubCarrierId.class, ipowdm.Ipowdm.DigitalSubCarrierId.Builder.class);
+            }
+
+            // Construct using ipowdm.Ipowdm.DigitalSubCarrierId.newBuilder()
+            private Builder() {
+            }
+
+            private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+                super(parent);
+            }
+
+            @java.lang.Override
+            public Builder clear() {
+                super.clear();
+                bitField0_ = 0;
+                subCarrierId_ = 0;
+                active_ = "";
+                return this;
+            }
+
+            @java.lang.Override
+            public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_DigitalSubCarrierId_descriptor;
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.DigitalSubCarrierId getDefaultInstanceForType() {
+                return ipowdm.Ipowdm.DigitalSubCarrierId.getDefaultInstance();
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.DigitalSubCarrierId build() {
+                ipowdm.Ipowdm.DigitalSubCarrierId result = buildPartial();
+                if (!result.isInitialized()) {
+                    throw newUninitializedMessageException(result);
+                }
+                return result;
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.DigitalSubCarrierId buildPartial() {
+                ipowdm.Ipowdm.DigitalSubCarrierId result = new ipowdm.Ipowdm.DigitalSubCarrierId(this);
+                if (bitField0_ != 0) {
+                    buildPartial0(result);
+                }
+                onBuilt();
+                return result;
+            }
+
+            private void buildPartial0(ipowdm.Ipowdm.DigitalSubCarrierId result) {
+                int from_bitField0_ = bitField0_;
+                if (((from_bitField0_ & 0x00000001) != 0)) {
+                    result.subCarrierId_ = subCarrierId_;
+                }
+                if (((from_bitField0_ & 0x00000002) != 0)) {
+                    result.active_ = active_;
+                }
+            }
+
+            @java.lang.Override
+            public Builder mergeFrom(com.google.protobuf.Message other) {
+                if (other instanceof ipowdm.Ipowdm.DigitalSubCarrierId) {
+                    return mergeFrom((ipowdm.Ipowdm.DigitalSubCarrierId) other);
+                } else {
+                    super.mergeFrom(other);
+                    return this;
+                }
+            }
+
+            public Builder mergeFrom(ipowdm.Ipowdm.DigitalSubCarrierId other) {
+                if (other == ipowdm.Ipowdm.DigitalSubCarrierId.getDefaultInstance())
+                    return this;
+                if (other.getSubCarrierId() != 0) {
+                    setSubCarrierId(other.getSubCarrierId());
+                }
+                if (!other.getActive().isEmpty()) {
+                    active_ = other.active_;
+                    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 8:
+                                {
+                                    subCarrierId_ = input.readInt32();
+                                    bitField0_ |= 0x00000001;
+                                    break;
+                                }
+                            // case 8
+                            case 18:
+                                {
+                                    active_ = 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 int subCarrierId_;
+
+            /**
+             * int32 sub_carrier_id = 1;
+             * @return The subCarrierId.
+             */
+            @java.lang.Override
+            public int getSubCarrierId() {
+                return subCarrierId_;
+            }
+
+            /**
+             * int32 sub_carrier_id = 1;
+             * @param value The subCarrierId to set.
+             * @return This builder for chaining.
+             */
+            public Builder setSubCarrierId(int value) {
+                subCarrierId_ = value;
+                bitField0_ |= 0x00000001;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * int32 sub_carrier_id = 1;
+             * @return This builder for chaining.
+             */
+            public Builder clearSubCarrierId() {
+                bitField0_ = (bitField0_ & ~0x00000001);
+                subCarrierId_ = 0;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object active_ = "";
+
+            /**
+             * string active = 2;
+             * @return The active.
+             */
+            public java.lang.String getActive() {
+                java.lang.Object ref = active_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    active_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string active = 2;
+             * @return The bytes for active.
+             */
+            public com.google.protobuf.ByteString getActiveBytes() {
+                java.lang.Object ref = active_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    active_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string active = 2;
+             * @param value The active to set.
+             * @return This builder for chaining.
+             */
+            public Builder setActive(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                active_ = value;
+                bitField0_ |= 0x00000002;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string active = 2;
+             * @return This builder for chaining.
+             */
+            public Builder clearActive() {
+                active_ = getDefaultInstance().getActive();
+                bitField0_ = (bitField0_ & ~0x00000002);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string active = 2;
+             * @param value The bytes for active to set.
+             * @return This builder for chaining.
+             */
+            public Builder setActiveBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                active_ = 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:ipowdm.DigitalSubCarrierId)
+        }
+
+        // @@protoc_insertion_point(class_scope:ipowdm.DigitalSubCarrierId)
+        private static final ipowdm.Ipowdm.DigitalSubCarrierId DEFAULT_INSTANCE;
+
+        static {
+            DEFAULT_INSTANCE = new ipowdm.Ipowdm.DigitalSubCarrierId();
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarrierId getDefaultInstance() {
+            return DEFAULT_INSTANCE;
+        }
+
+        private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+
+            @java.lang.Override
+            public DigitalSubCarrierId parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+                Builder builder = newBuilder();
+                try {
+                    builder.mergeFrom(input, extensionRegistry);
+                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    throw e.setUnfinishedMessage(builder.buildPartial());
+                } catch (com.google.protobuf.UninitializedMessageException e) {
+                    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 ipowdm.Ipowdm.DigitalSubCarrierId getDefaultInstanceForType() {
+            return DEFAULT_INSTANCE;
+        }
+    }
+
+    public interface DigitalSubCarriersGroupOrBuilder extends // @@protoc_insertion_point(interface_extends:ipowdm.DigitalSubCarriersGroup)
+    com.google.protobuf.MessageOrBuilder {
+
+        /**
+         * int32 digital_sub_carriers_group_id = 1;
+         * @return The digitalSubCarriersGroupId.
+         */
+        int getDigitalSubCarriersGroupId();
+
+        /**
+         * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+         */
+        java.util.List getDigitalSubCarrierIdList();
+
+        /**
+         * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+         */
+        ipowdm.Ipowdm.DigitalSubCarrierId getDigitalSubCarrierId(int index);
+
+        /**
+         * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+         */
+        int getDigitalSubCarrierIdCount();
+
+        /**
+         * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+         */
+        java.util.List getDigitalSubCarrierIdOrBuilderList();
+
+        /**
+         * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+         */
+        ipowdm.Ipowdm.DigitalSubCarrierIdOrBuilder getDigitalSubCarrierIdOrBuilder(int index);
+    }
+
+    /**
+     * Protobuf type {@code ipowdm.DigitalSubCarriersGroup}
+     */
+    public static final class DigitalSubCarriersGroup extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:ipowdm.DigitalSubCarriersGroup)
+    DigitalSubCarriersGroupOrBuilder {
+
+        private static final long serialVersionUID = 0L;
+
+        // Use DigitalSubCarriersGroup.newBuilder() to construct.
+        private DigitalSubCarriersGroup(com.google.protobuf.GeneratedMessageV3.Builder builder) {
+            super(builder);
+        }
+
+        private DigitalSubCarriersGroup() {
+            digitalSubCarrierId_ = java.util.Collections.emptyList();
+        }
+
+        @java.lang.Override
+        @SuppressWarnings({ "unused" })
+        protected java.lang.Object newInstance(UnusedPrivateParameter unused) {
+            return new DigitalSubCarriersGroup();
+        }
+
+        public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+            return ipowdm.Ipowdm.internal_static_ipowdm_DigitalSubCarriersGroup_descriptor;
+        }
+
+        @java.lang.Override
+        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+            return ipowdm.Ipowdm.internal_static_ipowdm_DigitalSubCarriersGroup_fieldAccessorTable.ensureFieldAccessorsInitialized(ipowdm.Ipowdm.DigitalSubCarriersGroup.class, ipowdm.Ipowdm.DigitalSubCarriersGroup.Builder.class);
+        }
+
+        public static final int DIGITAL_SUB_CARRIERS_GROUP_ID_FIELD_NUMBER = 1;
+
+        private int digitalSubCarriersGroupId_ = 0;
+
+        /**
+         * int32 digital_sub_carriers_group_id = 1;
+         * @return The digitalSubCarriersGroupId.
+         */
+        @java.lang.Override
+        public int getDigitalSubCarriersGroupId() {
+            return digitalSubCarriersGroupId_;
+        }
+
+        public static final int DIGITAL_SUB_CARRIER_ID_FIELD_NUMBER = 4;
+
+        @SuppressWarnings("serial")
+        private java.util.List digitalSubCarrierId_;
+
+        /**
+         * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+         */
+        @java.lang.Override
+        public java.util.List getDigitalSubCarrierIdList() {
+            return digitalSubCarrierId_;
+        }
+
+        /**
+         * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+         */
+        @java.lang.Override
+        public java.util.List getDigitalSubCarrierIdOrBuilderList() {
+            return digitalSubCarrierId_;
+        }
+
+        /**
+         * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+         */
+        @java.lang.Override
+        public int getDigitalSubCarrierIdCount() {
+            return digitalSubCarrierId_.size();
+        }
+
+        /**
+         * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+         */
+        @java.lang.Override
+        public ipowdm.Ipowdm.DigitalSubCarrierId getDigitalSubCarrierId(int index) {
+            return digitalSubCarrierId_.get(index);
+        }
+
+        /**
+         * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+         */
+        @java.lang.Override
+        public ipowdm.Ipowdm.DigitalSubCarrierIdOrBuilder getDigitalSubCarrierIdOrBuilder(int index) {
+            return digitalSubCarrierId_.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 (digitalSubCarriersGroupId_ != 0) {
+                output.writeInt32(1, digitalSubCarriersGroupId_);
+            }
+            for (int i = 0; i < digitalSubCarrierId_.size(); i++) {
+                output.writeMessage(4, digitalSubCarrierId_.get(i));
+            }
+            getUnknownFields().writeTo(output);
+        }
+
+        @java.lang.Override
+        public int getSerializedSize() {
+            int size = memoizedSize;
+            if (size != -1)
+                return size;
+            size = 0;
+            if (digitalSubCarriersGroupId_ != 0) {
+                size += com.google.protobuf.CodedOutputStream.computeInt32Size(1, digitalSubCarriersGroupId_);
+            }
+            for (int i = 0; i < digitalSubCarrierId_.size(); i++) {
+                size += com.google.protobuf.CodedOutputStream.computeMessageSize(4, digitalSubCarrierId_.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 ipowdm.Ipowdm.DigitalSubCarriersGroup)) {
+                return super.equals(obj);
+            }
+            ipowdm.Ipowdm.DigitalSubCarriersGroup other = (ipowdm.Ipowdm.DigitalSubCarriersGroup) obj;
+            if (getDigitalSubCarriersGroupId() != other.getDigitalSubCarriersGroupId())
+                return false;
+            if (!getDigitalSubCarrierIdList().equals(other.getDigitalSubCarrierIdList()))
+                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) + DIGITAL_SUB_CARRIERS_GROUP_ID_FIELD_NUMBER;
+            hash = (53 * hash) + getDigitalSubCarriersGroupId();
+            if (getDigitalSubCarrierIdCount() > 0) {
+                hash = (37 * hash) + DIGITAL_SUB_CARRIER_ID_FIELD_NUMBER;
+                hash = (53 * hash) + getDigitalSubCarrierIdList().hashCode();
+            }
+            hash = (29 * hash) + getUnknownFields().hashCode();
+            memoizedHashCode = hash;
+            return hash;
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarriersGroup parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarriersGroup parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarriersGroup parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarriersGroup parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarriersGroup parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarriersGroup parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarriersGroup parseFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarriersGroup 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 ipowdm.Ipowdm.DigitalSubCarriersGroup parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarriersGroup 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 ipowdm.Ipowdm.DigitalSubCarriersGroup parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarriersGroup 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(ipowdm.Ipowdm.DigitalSubCarriersGroup 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 ipowdm.DigitalSubCarriersGroup}
+         */
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:ipowdm.DigitalSubCarriersGroup)
+        ipowdm.Ipowdm.DigitalSubCarriersGroupOrBuilder {
+
+            public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_DigitalSubCarriersGroup_descriptor;
+            }
+
+            @java.lang.Override
+            protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_DigitalSubCarriersGroup_fieldAccessorTable.ensureFieldAccessorsInitialized(ipowdm.Ipowdm.DigitalSubCarriersGroup.class, ipowdm.Ipowdm.DigitalSubCarriersGroup.Builder.class);
+            }
+
+            // Construct using ipowdm.Ipowdm.DigitalSubCarriersGroup.newBuilder()
+            private Builder() {
+            }
+
+            private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+                super(parent);
+            }
+
+            @java.lang.Override
+            public Builder clear() {
+                super.clear();
+                bitField0_ = 0;
+                digitalSubCarriersGroupId_ = 0;
+                if (digitalSubCarrierIdBuilder_ == null) {
+                    digitalSubCarrierId_ = java.util.Collections.emptyList();
+                } else {
+                    digitalSubCarrierId_ = null;
+                    digitalSubCarrierIdBuilder_.clear();
+                }
+                bitField0_ = (bitField0_ & ~0x00000002);
+                return this;
+            }
+
+            @java.lang.Override
+            public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_DigitalSubCarriersGroup_descriptor;
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.DigitalSubCarriersGroup getDefaultInstanceForType() {
+                return ipowdm.Ipowdm.DigitalSubCarriersGroup.getDefaultInstance();
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.DigitalSubCarriersGroup build() {
+                ipowdm.Ipowdm.DigitalSubCarriersGroup result = buildPartial();
+                if (!result.isInitialized()) {
+                    throw newUninitializedMessageException(result);
+                }
+                return result;
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.DigitalSubCarriersGroup buildPartial() {
+                ipowdm.Ipowdm.DigitalSubCarriersGroup result = new ipowdm.Ipowdm.DigitalSubCarriersGroup(this);
+                buildPartialRepeatedFields(result);
+                if (bitField0_ != 0) {
+                    buildPartial0(result);
+                }
+                onBuilt();
+                return result;
+            }
+
+            private void buildPartialRepeatedFields(ipowdm.Ipowdm.DigitalSubCarriersGroup result) {
+                if (digitalSubCarrierIdBuilder_ == null) {
+                    if (((bitField0_ & 0x00000002) != 0)) {
+                        digitalSubCarrierId_ = java.util.Collections.unmodifiableList(digitalSubCarrierId_);
+                        bitField0_ = (bitField0_ & ~0x00000002);
+                    }
+                    result.digitalSubCarrierId_ = digitalSubCarrierId_;
+                } else {
+                    result.digitalSubCarrierId_ = digitalSubCarrierIdBuilder_.build();
+                }
+            }
+
+            private void buildPartial0(ipowdm.Ipowdm.DigitalSubCarriersGroup result) {
+                int from_bitField0_ = bitField0_;
+                if (((from_bitField0_ & 0x00000001) != 0)) {
+                    result.digitalSubCarriersGroupId_ = digitalSubCarriersGroupId_;
+                }
+            }
+
+            @java.lang.Override
+            public Builder mergeFrom(com.google.protobuf.Message other) {
+                if (other instanceof ipowdm.Ipowdm.DigitalSubCarriersGroup) {
+                    return mergeFrom((ipowdm.Ipowdm.DigitalSubCarriersGroup) other);
+                } else {
+                    super.mergeFrom(other);
+                    return this;
+                }
+            }
+
+            public Builder mergeFrom(ipowdm.Ipowdm.DigitalSubCarriersGroup other) {
+                if (other == ipowdm.Ipowdm.DigitalSubCarriersGroup.getDefaultInstance())
+                    return this;
+                if (other.getDigitalSubCarriersGroupId() != 0) {
+                    setDigitalSubCarriersGroupId(other.getDigitalSubCarriersGroupId());
+                }
+                if (digitalSubCarrierIdBuilder_ == null) {
+                    if (!other.digitalSubCarrierId_.isEmpty()) {
+                        if (digitalSubCarrierId_.isEmpty()) {
+                            digitalSubCarrierId_ = other.digitalSubCarrierId_;
+                            bitField0_ = (bitField0_ & ~0x00000002);
+                        } else {
+                            ensureDigitalSubCarrierIdIsMutable();
+                            digitalSubCarrierId_.addAll(other.digitalSubCarrierId_);
+                        }
+                        onChanged();
+                    }
+                } else {
+                    if (!other.digitalSubCarrierId_.isEmpty()) {
+                        if (digitalSubCarrierIdBuilder_.isEmpty()) {
+                            digitalSubCarrierIdBuilder_.dispose();
+                            digitalSubCarrierIdBuilder_ = null;
+                            digitalSubCarrierId_ = other.digitalSubCarrierId_;
+                            bitField0_ = (bitField0_ & ~0x00000002);
+                            digitalSubCarrierIdBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getDigitalSubCarrierIdFieldBuilder() : null;
+                        } else {
+                            digitalSubCarrierIdBuilder_.addAllMessages(other.digitalSubCarrierId_);
+                        }
+                    }
+                }
+                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 8:
+                                {
+                                    digitalSubCarriersGroupId_ = input.readInt32();
+                                    bitField0_ |= 0x00000001;
+                                    break;
+                                }
+                            // case 8
+                            case 34:
+                                {
+                                    ipowdm.Ipowdm.DigitalSubCarrierId m = input.readMessage(ipowdm.Ipowdm.DigitalSubCarrierId.parser(), extensionRegistry);
+                                    if (digitalSubCarrierIdBuilder_ == null) {
+                                        ensureDigitalSubCarrierIdIsMutable();
+                                        digitalSubCarrierId_.add(m);
+                                    } else {
+                                        digitalSubCarrierIdBuilder_.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 int digitalSubCarriersGroupId_;
+
+            /**
+             * int32 digital_sub_carriers_group_id = 1;
+             * @return The digitalSubCarriersGroupId.
+             */
+            @java.lang.Override
+            public int getDigitalSubCarriersGroupId() {
+                return digitalSubCarriersGroupId_;
+            }
+
+            /**
+             * int32 digital_sub_carriers_group_id = 1;
+             * @param value The digitalSubCarriersGroupId to set.
+             * @return This builder for chaining.
+             */
+            public Builder setDigitalSubCarriersGroupId(int value) {
+                digitalSubCarriersGroupId_ = value;
+                bitField0_ |= 0x00000001;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * int32 digital_sub_carriers_group_id = 1;
+             * @return This builder for chaining.
+             */
+            public Builder clearDigitalSubCarriersGroupId() {
+                bitField0_ = (bitField0_ & ~0x00000001);
+                digitalSubCarriersGroupId_ = 0;
+                onChanged();
+                return this;
+            }
+
+            private java.util.List digitalSubCarrierId_ = java.util.Collections.emptyList();
+
+            private void ensureDigitalSubCarrierIdIsMutable() {
+                if (!((bitField0_ & 0x00000002) != 0)) {
+                    digitalSubCarrierId_ = new java.util.ArrayList(digitalSubCarrierId_);
+                    bitField0_ |= 0x00000002;
+                }
+            }
+
+            private com.google.protobuf.RepeatedFieldBuilderV3 digitalSubCarrierIdBuilder_;
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public java.util.List getDigitalSubCarrierIdList() {
+                if (digitalSubCarrierIdBuilder_ == null) {
+                    return java.util.Collections.unmodifiableList(digitalSubCarrierId_);
+                } else {
+                    return digitalSubCarrierIdBuilder_.getMessageList();
+                }
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public int getDigitalSubCarrierIdCount() {
+                if (digitalSubCarrierIdBuilder_ == null) {
+                    return digitalSubCarrierId_.size();
+                } else {
+                    return digitalSubCarrierIdBuilder_.getCount();
+                }
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public ipowdm.Ipowdm.DigitalSubCarrierId getDigitalSubCarrierId(int index) {
+                if (digitalSubCarrierIdBuilder_ == null) {
+                    return digitalSubCarrierId_.get(index);
+                } else {
+                    return digitalSubCarrierIdBuilder_.getMessage(index);
+                }
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public Builder setDigitalSubCarrierId(int index, ipowdm.Ipowdm.DigitalSubCarrierId value) {
+                if (digitalSubCarrierIdBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureDigitalSubCarrierIdIsMutable();
+                    digitalSubCarrierId_.set(index, value);
+                    onChanged();
+                } else {
+                    digitalSubCarrierIdBuilder_.setMessage(index, value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public Builder setDigitalSubCarrierId(int index, ipowdm.Ipowdm.DigitalSubCarrierId.Builder builderForValue) {
+                if (digitalSubCarrierIdBuilder_ == null) {
+                    ensureDigitalSubCarrierIdIsMutable();
+                    digitalSubCarrierId_.set(index, builderForValue.build());
+                    onChanged();
+                } else {
+                    digitalSubCarrierIdBuilder_.setMessage(index, builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public Builder addDigitalSubCarrierId(ipowdm.Ipowdm.DigitalSubCarrierId value) {
+                if (digitalSubCarrierIdBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureDigitalSubCarrierIdIsMutable();
+                    digitalSubCarrierId_.add(value);
+                    onChanged();
+                } else {
+                    digitalSubCarrierIdBuilder_.addMessage(value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public Builder addDigitalSubCarrierId(int index, ipowdm.Ipowdm.DigitalSubCarrierId value) {
+                if (digitalSubCarrierIdBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureDigitalSubCarrierIdIsMutable();
+                    digitalSubCarrierId_.add(index, value);
+                    onChanged();
+                } else {
+                    digitalSubCarrierIdBuilder_.addMessage(index, value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public Builder addDigitalSubCarrierId(ipowdm.Ipowdm.DigitalSubCarrierId.Builder builderForValue) {
+                if (digitalSubCarrierIdBuilder_ == null) {
+                    ensureDigitalSubCarrierIdIsMutable();
+                    digitalSubCarrierId_.add(builderForValue.build());
+                    onChanged();
+                } else {
+                    digitalSubCarrierIdBuilder_.addMessage(builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public Builder addDigitalSubCarrierId(int index, ipowdm.Ipowdm.DigitalSubCarrierId.Builder builderForValue) {
+                if (digitalSubCarrierIdBuilder_ == null) {
+                    ensureDigitalSubCarrierIdIsMutable();
+                    digitalSubCarrierId_.add(index, builderForValue.build());
+                    onChanged();
+                } else {
+                    digitalSubCarrierIdBuilder_.addMessage(index, builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public Builder addAllDigitalSubCarrierId(java.lang.Iterable values) {
+                if (digitalSubCarrierIdBuilder_ == null) {
+                    ensureDigitalSubCarrierIdIsMutable();
+                    com.google.protobuf.AbstractMessageLite.Builder.addAll(values, digitalSubCarrierId_);
+                    onChanged();
+                } else {
+                    digitalSubCarrierIdBuilder_.addAllMessages(values);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public Builder clearDigitalSubCarrierId() {
+                if (digitalSubCarrierIdBuilder_ == null) {
+                    digitalSubCarrierId_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000002);
+                    onChanged();
+                } else {
+                    digitalSubCarrierIdBuilder_.clear();
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public Builder removeDigitalSubCarrierId(int index) {
+                if (digitalSubCarrierIdBuilder_ == null) {
+                    ensureDigitalSubCarrierIdIsMutable();
+                    digitalSubCarrierId_.remove(index);
+                    onChanged();
+                } else {
+                    digitalSubCarrierIdBuilder_.remove(index);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public ipowdm.Ipowdm.DigitalSubCarrierId.Builder getDigitalSubCarrierIdBuilder(int index) {
+                return getDigitalSubCarrierIdFieldBuilder().getBuilder(index);
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public ipowdm.Ipowdm.DigitalSubCarrierIdOrBuilder getDigitalSubCarrierIdOrBuilder(int index) {
+                if (digitalSubCarrierIdBuilder_ == null) {
+                    return digitalSubCarrierId_.get(index);
+                } else {
+                    return digitalSubCarrierIdBuilder_.getMessageOrBuilder(index);
+                }
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public java.util.List getDigitalSubCarrierIdOrBuilderList() {
+                if (digitalSubCarrierIdBuilder_ != null) {
+                    return digitalSubCarrierIdBuilder_.getMessageOrBuilderList();
+                } else {
+                    return java.util.Collections.unmodifiableList(digitalSubCarrierId_);
+                }
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public ipowdm.Ipowdm.DigitalSubCarrierId.Builder addDigitalSubCarrierIdBuilder() {
+                return getDigitalSubCarrierIdFieldBuilder().addBuilder(ipowdm.Ipowdm.DigitalSubCarrierId.getDefaultInstance());
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public ipowdm.Ipowdm.DigitalSubCarrierId.Builder addDigitalSubCarrierIdBuilder(int index) {
+                return getDigitalSubCarrierIdFieldBuilder().addBuilder(index, ipowdm.Ipowdm.DigitalSubCarrierId.getDefaultInstance());
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public java.util.List getDigitalSubCarrierIdBuilderList() {
+                return getDigitalSubCarrierIdFieldBuilder().getBuilderList();
+            }
+
+            private com.google.protobuf.RepeatedFieldBuilderV3 getDigitalSubCarrierIdFieldBuilder() {
+                if (digitalSubCarrierIdBuilder_ == null) {
+                    digitalSubCarrierIdBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(digitalSubCarrierId_, ((bitField0_ & 0x00000002) != 0), getParentForChildren(), isClean());
+                    digitalSubCarrierId_ = null;
+                }
+                return digitalSubCarrierIdBuilder_;
+            }
+
+            @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:ipowdm.DigitalSubCarriersGroup)
+        }
+
+        // @@protoc_insertion_point(class_scope:ipowdm.DigitalSubCarriersGroup)
+        private static final ipowdm.Ipowdm.DigitalSubCarriersGroup DEFAULT_INSTANCE;
+
+        static {
+            DEFAULT_INSTANCE = new ipowdm.Ipowdm.DigitalSubCarriersGroup();
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarriersGroup getDefaultInstance() {
+            return DEFAULT_INSTANCE;
+        }
+
+        private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+
+            @java.lang.Override
+            public DigitalSubCarriersGroup parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+                Builder builder = newBuilder();
+                try {
+                    builder.mergeFrom(input, extensionRegistry);
+                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    throw e.setUnfinishedMessage(builder.buildPartial());
+                } catch (com.google.protobuf.UninitializedMessageException e) {
+                    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 ipowdm.Ipowdm.DigitalSubCarriersGroup getDefaultInstanceForType() {
+            return DEFAULT_INSTANCE;
+        }
+    }
+
+    public interface ComponentOrBuilder extends // @@protoc_insertion_point(interface_extends:ipowdm.Component)
+    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();
+
+        /**
+         * float frequency = 2;
+         * @return The frequency.
+         */
+        float getFrequency();
+
+        /**
+         * float target_output_power = 3;
+         * @return The targetOutputPower.
+         */
+        float getTargetOutputPower();
+
+        /**
+         * int32 operational_mode = 4;
+         * @return The operationalMode.
+         */
+        int getOperationalMode();
+
+        /**
+         * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+         */
+        java.util.List getDigitalSubCarriersGroupList();
+
+        /**
+         * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+         */
+        ipowdm.Ipowdm.DigitalSubCarriersGroup getDigitalSubCarriersGroup(int index);
+
+        /**
+         * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+         */
+        int getDigitalSubCarriersGroupCount();
+
+        /**
+         * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+         */
+        java.util.List getDigitalSubCarriersGroupOrBuilderList();
+
+        /**
+         * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+         */
+        ipowdm.Ipowdm.DigitalSubCarriersGroupOrBuilder getDigitalSubCarriersGroupOrBuilder(int index);
+
+        /**
+         * string operation = 6;
+         * @return The operation.
+         */
+        java.lang.String getOperation();
+
+        /**
+         * string operation = 6;
+         * @return The bytes for operation.
+         */
+        com.google.protobuf.ByteString getOperationBytes();
+    }
+
+    /**
+     * Protobuf type {@code ipowdm.Component}
+     */
+    public static final class Component extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:ipowdm.Component)
+    ComponentOrBuilder {
+
+        private static final long serialVersionUID = 0L;
+
+        // Use Component.newBuilder() to construct.
+        private Component(com.google.protobuf.GeneratedMessageV3.Builder builder) {
+            super(builder);
+        }
+
+        private Component() {
+            name_ = "";
+            digitalSubCarriersGroup_ = java.util.Collections.emptyList();
+            operation_ = "";
+        }
+
+        @java.lang.Override
+        @SuppressWarnings({ "unused" })
+        protected java.lang.Object newInstance(UnusedPrivateParameter unused) {
+            return new Component();
+        }
+
+        public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+            return ipowdm.Ipowdm.internal_static_ipowdm_Component_descriptor;
+        }
+
+        @java.lang.Override
+        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+            return ipowdm.Ipowdm.internal_static_ipowdm_Component_fieldAccessorTable.ensureFieldAccessorsInitialized(ipowdm.Ipowdm.Component.class, ipowdm.Ipowdm.Component.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 FREQUENCY_FIELD_NUMBER = 2;
+
+        private float frequency_ = 0F;
+
+        /**
+         * float frequency = 2;
+         * @return The frequency.
+         */
+        @java.lang.Override
+        public float getFrequency() {
+            return frequency_;
+        }
+
+        public static final int TARGET_OUTPUT_POWER_FIELD_NUMBER = 3;
+
+        private float targetOutputPower_ = 0F;
+
+        /**
+         * float target_output_power = 3;
+         * @return The targetOutputPower.
+         */
+        @java.lang.Override
+        public float getTargetOutputPower() {
+            return targetOutputPower_;
+        }
+
+        public static final int OPERATIONAL_MODE_FIELD_NUMBER = 4;
+
+        private int operationalMode_ = 0;
+
+        /**
+         * int32 operational_mode = 4;
+         * @return The operationalMode.
+         */
+        @java.lang.Override
+        public int getOperationalMode() {
+            return operationalMode_;
+        }
+
+        public static final int DIGITAL_SUB_CARRIERS_GROUP_FIELD_NUMBER = 5;
+
+        @SuppressWarnings("serial")
+        private java.util.List digitalSubCarriersGroup_;
+
+        /**
+         * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+         */
+        @java.lang.Override
+        public java.util.List getDigitalSubCarriersGroupList() {
+            return digitalSubCarriersGroup_;
+        }
+
+        /**
+         * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+         */
+        @java.lang.Override
+        public java.util.List getDigitalSubCarriersGroupOrBuilderList() {
+            return digitalSubCarriersGroup_;
+        }
+
+        /**
+         * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+         */
+        @java.lang.Override
+        public int getDigitalSubCarriersGroupCount() {
+            return digitalSubCarriersGroup_.size();
+        }
+
+        /**
+         * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+         */
+        @java.lang.Override
+        public ipowdm.Ipowdm.DigitalSubCarriersGroup getDigitalSubCarriersGroup(int index) {
+            return digitalSubCarriersGroup_.get(index);
+        }
+
+        /**
+         * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+         */
+        @java.lang.Override
+        public ipowdm.Ipowdm.DigitalSubCarriersGroupOrBuilder getDigitalSubCarriersGroupOrBuilder(int index) {
+            return digitalSubCarriersGroup_.get(index);
+        }
+
+        public static final int OPERATION_FIELD_NUMBER = 6;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object operation_ = "";
+
+        /**
+         * string operation = 6;
+         * @return The operation.
+         */
+        @java.lang.Override
+        public java.lang.String getOperation() {
+            java.lang.Object ref = operation_;
+            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();
+                operation_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string operation = 6;
+         * @return The bytes for operation.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getOperationBytes() {
+            java.lang.Object ref = operation_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                operation_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        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 (java.lang.Float.floatToRawIntBits(frequency_) != 0) {
+                output.writeFloat(2, frequency_);
+            }
+            if (java.lang.Float.floatToRawIntBits(targetOutputPower_) != 0) {
+                output.writeFloat(3, targetOutputPower_);
+            }
+            if (operationalMode_ != 0) {
+                output.writeInt32(4, operationalMode_);
+            }
+            for (int i = 0; i < digitalSubCarriersGroup_.size(); i++) {
+                output.writeMessage(5, digitalSubCarriersGroup_.get(i));
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(operation_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 6, operation_);
+            }
+            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 (java.lang.Float.floatToRawIntBits(frequency_) != 0) {
+                size += com.google.protobuf.CodedOutputStream.computeFloatSize(2, frequency_);
+            }
+            if (java.lang.Float.floatToRawIntBits(targetOutputPower_) != 0) {
+                size += com.google.protobuf.CodedOutputStream.computeFloatSize(3, targetOutputPower_);
+            }
+            if (operationalMode_ != 0) {
+                size += com.google.protobuf.CodedOutputStream.computeInt32Size(4, operationalMode_);
+            }
+            for (int i = 0; i < digitalSubCarriersGroup_.size(); i++) {
+                size += com.google.protobuf.CodedOutputStream.computeMessageSize(5, digitalSubCarriersGroup_.get(i));
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(operation_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(6, operation_);
+            }
+            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 ipowdm.Ipowdm.Component)) {
+                return super.equals(obj);
+            }
+            ipowdm.Ipowdm.Component other = (ipowdm.Ipowdm.Component) obj;
+            if (!getName().equals(other.getName()))
+                return false;
+            if (java.lang.Float.floatToIntBits(getFrequency()) != java.lang.Float.floatToIntBits(other.getFrequency()))
+                return false;
+            if (java.lang.Float.floatToIntBits(getTargetOutputPower()) != java.lang.Float.floatToIntBits(other.getTargetOutputPower()))
+                return false;
+            if (getOperationalMode() != other.getOperationalMode())
+                return false;
+            if (!getDigitalSubCarriersGroupList().equals(other.getDigitalSubCarriersGroupList()))
+                return false;
+            if (!getOperation().equals(other.getOperation()))
+                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();
+            hash = (37 * hash) + FREQUENCY_FIELD_NUMBER;
+            hash = (53 * hash) + java.lang.Float.floatToIntBits(getFrequency());
+            hash = (37 * hash) + TARGET_OUTPUT_POWER_FIELD_NUMBER;
+            hash = (53 * hash) + java.lang.Float.floatToIntBits(getTargetOutputPower());
+            hash = (37 * hash) + OPERATIONAL_MODE_FIELD_NUMBER;
+            hash = (53 * hash) + getOperationalMode();
+            if (getDigitalSubCarriersGroupCount() > 0) {
+                hash = (37 * hash) + DIGITAL_SUB_CARRIERS_GROUP_FIELD_NUMBER;
+                hash = (53 * hash) + getDigitalSubCarriersGroupList().hashCode();
+            }
+            hash = (37 * hash) + OPERATION_FIELD_NUMBER;
+            hash = (53 * hash) + getOperation().hashCode();
+            hash = (29 * hash) + getUnknownFields().hashCode();
+            memoizedHashCode = hash;
+            return hash;
+        }
+
+        public static ipowdm.Ipowdm.Component parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.Component parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.Component parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.Component parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.Component parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.Component parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.Component parseFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.Component 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 ipowdm.Ipowdm.Component parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.Component 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 ipowdm.Ipowdm.Component parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.Component 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(ipowdm.Ipowdm.Component 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 ipowdm.Component}
+         */
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:ipowdm.Component)
+        ipowdm.Ipowdm.ComponentOrBuilder {
+
+            public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_Component_descriptor;
+            }
+
+            @java.lang.Override
+            protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_Component_fieldAccessorTable.ensureFieldAccessorsInitialized(ipowdm.Ipowdm.Component.class, ipowdm.Ipowdm.Component.Builder.class);
+            }
+
+            // Construct using ipowdm.Ipowdm.Component.newBuilder()
+            private Builder() {
+            }
+
+            private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+                super(parent);
+            }
+
+            @java.lang.Override
+            public Builder clear() {
+                super.clear();
+                bitField0_ = 0;
+                name_ = "";
+                frequency_ = 0F;
+                targetOutputPower_ = 0F;
+                operationalMode_ = 0;
+                if (digitalSubCarriersGroupBuilder_ == null) {
+                    digitalSubCarriersGroup_ = java.util.Collections.emptyList();
+                } else {
+                    digitalSubCarriersGroup_ = null;
+                    digitalSubCarriersGroupBuilder_.clear();
+                }
+                bitField0_ = (bitField0_ & ~0x00000010);
+                operation_ = "";
+                return this;
+            }
+
+            @java.lang.Override
+            public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_Component_descriptor;
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.Component getDefaultInstanceForType() {
+                return ipowdm.Ipowdm.Component.getDefaultInstance();
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.Component build() {
+                ipowdm.Ipowdm.Component result = buildPartial();
+                if (!result.isInitialized()) {
+                    throw newUninitializedMessageException(result);
+                }
+                return result;
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.Component buildPartial() {
+                ipowdm.Ipowdm.Component result = new ipowdm.Ipowdm.Component(this);
+                buildPartialRepeatedFields(result);
+                if (bitField0_ != 0) {
+                    buildPartial0(result);
+                }
+                onBuilt();
+                return result;
+            }
+
+            private void buildPartialRepeatedFields(ipowdm.Ipowdm.Component result) {
+                if (digitalSubCarriersGroupBuilder_ == null) {
+                    if (((bitField0_ & 0x00000010) != 0)) {
+                        digitalSubCarriersGroup_ = java.util.Collections.unmodifiableList(digitalSubCarriersGroup_);
+                        bitField0_ = (bitField0_ & ~0x00000010);
+                    }
+                    result.digitalSubCarriersGroup_ = digitalSubCarriersGroup_;
+                } else {
+                    result.digitalSubCarriersGroup_ = digitalSubCarriersGroupBuilder_.build();
+                }
+            }
+
+            private void buildPartial0(ipowdm.Ipowdm.Component result) {
+                int from_bitField0_ = bitField0_;
+                if (((from_bitField0_ & 0x00000001) != 0)) {
+                    result.name_ = name_;
+                }
+                if (((from_bitField0_ & 0x00000002) != 0)) {
+                    result.frequency_ = frequency_;
+                }
+                if (((from_bitField0_ & 0x00000004) != 0)) {
+                    result.targetOutputPower_ = targetOutputPower_;
+                }
+                if (((from_bitField0_ & 0x00000008) != 0)) {
+                    result.operationalMode_ = operationalMode_;
+                }
+                if (((from_bitField0_ & 0x00000020) != 0)) {
+                    result.operation_ = operation_;
+                }
+            }
+
+            @java.lang.Override
+            public Builder mergeFrom(com.google.protobuf.Message other) {
+                if (other instanceof ipowdm.Ipowdm.Component) {
+                    return mergeFrom((ipowdm.Ipowdm.Component) other);
+                } else {
+                    super.mergeFrom(other);
+                    return this;
+                }
+            }
+
+            public Builder mergeFrom(ipowdm.Ipowdm.Component other) {
+                if (other == ipowdm.Ipowdm.Component.getDefaultInstance())
+                    return this;
+                if (!other.getName().isEmpty()) {
+                    name_ = other.name_;
+                    bitField0_ |= 0x00000001;
+                    onChanged();
+                }
+                if (other.getFrequency() != 0F) {
+                    setFrequency(other.getFrequency());
+                }
+                if (other.getTargetOutputPower() != 0F) {
+                    setTargetOutputPower(other.getTargetOutputPower());
+                }
+                if (other.getOperationalMode() != 0) {
+                    setOperationalMode(other.getOperationalMode());
+                }
+                if (digitalSubCarriersGroupBuilder_ == null) {
+                    if (!other.digitalSubCarriersGroup_.isEmpty()) {
+                        if (digitalSubCarriersGroup_.isEmpty()) {
+                            digitalSubCarriersGroup_ = other.digitalSubCarriersGroup_;
+                            bitField0_ = (bitField0_ & ~0x00000010);
+                        } else {
+                            ensureDigitalSubCarriersGroupIsMutable();
+                            digitalSubCarriersGroup_.addAll(other.digitalSubCarriersGroup_);
+                        }
+                        onChanged();
+                    }
+                } else {
+                    if (!other.digitalSubCarriersGroup_.isEmpty()) {
+                        if (digitalSubCarriersGroupBuilder_.isEmpty()) {
+                            digitalSubCarriersGroupBuilder_.dispose();
+                            digitalSubCarriersGroupBuilder_ = null;
+                            digitalSubCarriersGroup_ = other.digitalSubCarriersGroup_;
+                            bitField0_ = (bitField0_ & ~0x00000010);
+                            digitalSubCarriersGroupBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getDigitalSubCarriersGroupFieldBuilder() : null;
+                        } else {
+                            digitalSubCarriersGroupBuilder_.addAllMessages(other.digitalSubCarriersGroup_);
+                        }
+                    }
+                }
+                if (!other.getOperation().isEmpty()) {
+                    operation_ = other.operation_;
+                    bitField0_ |= 0x00000020;
+                    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:
+                                {
+                                    name_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00000001;
+                                    break;
+                                }
+                            // case 10
+                            case 21:
+                                {
+                                    frequency_ = input.readFloat();
+                                    bitField0_ |= 0x00000002;
+                                    break;
+                                }
+                            // case 21
+                            case 29:
+                                {
+                                    targetOutputPower_ = input.readFloat();
+                                    bitField0_ |= 0x00000004;
+                                    break;
+                                }
+                            // case 29
+                            case 32:
+                                {
+                                    operationalMode_ = input.readInt32();
+                                    bitField0_ |= 0x00000008;
+                                    break;
+                                }
+                            // case 32
+                            case 42:
+                                {
+                                    ipowdm.Ipowdm.DigitalSubCarriersGroup m = input.readMessage(ipowdm.Ipowdm.DigitalSubCarriersGroup.parser(), extensionRegistry);
+                                    if (digitalSubCarriersGroupBuilder_ == null) {
+                                        ensureDigitalSubCarriersGroupIsMutable();
+                                        digitalSubCarriersGroup_.add(m);
+                                    } else {
+                                        digitalSubCarriersGroupBuilder_.addMessage(m);
+                                    }
+                                    break;
+                                }
+                            // case 42
+                            case 50:
+                                {
+                                    operation_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00000020;
+                                    break;
+                                }
+                            // case 50
+                            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 float frequency_;
+
+            /**
+             * float frequency = 2;
+             * @return The frequency.
+             */
+            @java.lang.Override
+            public float getFrequency() {
+                return frequency_;
+            }
+
+            /**
+             * float frequency = 2;
+             * @param value The frequency to set.
+             * @return This builder for chaining.
+             */
+            public Builder setFrequency(float value) {
+                frequency_ = value;
+                bitField0_ |= 0x00000002;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * float frequency = 2;
+             * @return This builder for chaining.
+             */
+            public Builder clearFrequency() {
+                bitField0_ = (bitField0_ & ~0x00000002);
+                frequency_ = 0F;
+                onChanged();
+                return this;
+            }
+
+            private float targetOutputPower_;
+
+            /**
+             * float target_output_power = 3;
+             * @return The targetOutputPower.
+             */
+            @java.lang.Override
+            public float getTargetOutputPower() {
+                return targetOutputPower_;
+            }
+
+            /**
+             * float target_output_power = 3;
+             * @param value The targetOutputPower to set.
+             * @return This builder for chaining.
+             */
+            public Builder setTargetOutputPower(float value) {
+                targetOutputPower_ = value;
+                bitField0_ |= 0x00000004;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * float target_output_power = 3;
+             * @return This builder for chaining.
+             */
+            public Builder clearTargetOutputPower() {
+                bitField0_ = (bitField0_ & ~0x00000004);
+                targetOutputPower_ = 0F;
+                onChanged();
+                return this;
+            }
+
+            private int operationalMode_;
+
+            /**
+             * int32 operational_mode = 4;
+             * @return The operationalMode.
+             */
+            @java.lang.Override
+            public int getOperationalMode() {
+                return operationalMode_;
+            }
+
+            /**
+             * int32 operational_mode = 4;
+             * @param value The operationalMode to set.
+             * @return This builder for chaining.
+             */
+            public Builder setOperationalMode(int value) {
+                operationalMode_ = value;
+                bitField0_ |= 0x00000008;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * int32 operational_mode = 4;
+             * @return This builder for chaining.
+             */
+            public Builder clearOperationalMode() {
+                bitField0_ = (bitField0_ & ~0x00000008);
+                operationalMode_ = 0;
+                onChanged();
+                return this;
+            }
+
+            private java.util.List digitalSubCarriersGroup_ = java.util.Collections.emptyList();
+
+            private void ensureDigitalSubCarriersGroupIsMutable() {
+                if (!((bitField0_ & 0x00000010) != 0)) {
+                    digitalSubCarriersGroup_ = new java.util.ArrayList(digitalSubCarriersGroup_);
+                    bitField0_ |= 0x00000010;
+                }
+            }
+
+            private com.google.protobuf.RepeatedFieldBuilderV3 digitalSubCarriersGroupBuilder_;
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public java.util.List getDigitalSubCarriersGroupList() {
+                if (digitalSubCarriersGroupBuilder_ == null) {
+                    return java.util.Collections.unmodifiableList(digitalSubCarriersGroup_);
+                } else {
+                    return digitalSubCarriersGroupBuilder_.getMessageList();
+                }
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public int getDigitalSubCarriersGroupCount() {
+                if (digitalSubCarriersGroupBuilder_ == null) {
+                    return digitalSubCarriersGroup_.size();
+                } else {
+                    return digitalSubCarriersGroupBuilder_.getCount();
+                }
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public ipowdm.Ipowdm.DigitalSubCarriersGroup getDigitalSubCarriersGroup(int index) {
+                if (digitalSubCarriersGroupBuilder_ == null) {
+                    return digitalSubCarriersGroup_.get(index);
+                } else {
+                    return digitalSubCarriersGroupBuilder_.getMessage(index);
+                }
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public Builder setDigitalSubCarriersGroup(int index, ipowdm.Ipowdm.DigitalSubCarriersGroup value) {
+                if (digitalSubCarriersGroupBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureDigitalSubCarriersGroupIsMutable();
+                    digitalSubCarriersGroup_.set(index, value);
+                    onChanged();
+                } else {
+                    digitalSubCarriersGroupBuilder_.setMessage(index, value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public Builder setDigitalSubCarriersGroup(int index, ipowdm.Ipowdm.DigitalSubCarriersGroup.Builder builderForValue) {
+                if (digitalSubCarriersGroupBuilder_ == null) {
+                    ensureDigitalSubCarriersGroupIsMutable();
+                    digitalSubCarriersGroup_.set(index, builderForValue.build());
+                    onChanged();
+                } else {
+                    digitalSubCarriersGroupBuilder_.setMessage(index, builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public Builder addDigitalSubCarriersGroup(ipowdm.Ipowdm.DigitalSubCarriersGroup value) {
+                if (digitalSubCarriersGroupBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureDigitalSubCarriersGroupIsMutable();
+                    digitalSubCarriersGroup_.add(value);
+                    onChanged();
+                } else {
+                    digitalSubCarriersGroupBuilder_.addMessage(value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public Builder addDigitalSubCarriersGroup(int index, ipowdm.Ipowdm.DigitalSubCarriersGroup value) {
+                if (digitalSubCarriersGroupBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureDigitalSubCarriersGroupIsMutable();
+                    digitalSubCarriersGroup_.add(index, value);
+                    onChanged();
+                } else {
+                    digitalSubCarriersGroupBuilder_.addMessage(index, value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public Builder addDigitalSubCarriersGroup(ipowdm.Ipowdm.DigitalSubCarriersGroup.Builder builderForValue) {
+                if (digitalSubCarriersGroupBuilder_ == null) {
+                    ensureDigitalSubCarriersGroupIsMutable();
+                    digitalSubCarriersGroup_.add(builderForValue.build());
+                    onChanged();
+                } else {
+                    digitalSubCarriersGroupBuilder_.addMessage(builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public Builder addDigitalSubCarriersGroup(int index, ipowdm.Ipowdm.DigitalSubCarriersGroup.Builder builderForValue) {
+                if (digitalSubCarriersGroupBuilder_ == null) {
+                    ensureDigitalSubCarriersGroupIsMutable();
+                    digitalSubCarriersGroup_.add(index, builderForValue.build());
+                    onChanged();
+                } else {
+                    digitalSubCarriersGroupBuilder_.addMessage(index, builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public Builder addAllDigitalSubCarriersGroup(java.lang.Iterable values) {
+                if (digitalSubCarriersGroupBuilder_ == null) {
+                    ensureDigitalSubCarriersGroupIsMutable();
+                    com.google.protobuf.AbstractMessageLite.Builder.addAll(values, digitalSubCarriersGroup_);
+                    onChanged();
+                } else {
+                    digitalSubCarriersGroupBuilder_.addAllMessages(values);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public Builder clearDigitalSubCarriersGroup() {
+                if (digitalSubCarriersGroupBuilder_ == null) {
+                    digitalSubCarriersGroup_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000010);
+                    onChanged();
+                } else {
+                    digitalSubCarriersGroupBuilder_.clear();
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public Builder removeDigitalSubCarriersGroup(int index) {
+                if (digitalSubCarriersGroupBuilder_ == null) {
+                    ensureDigitalSubCarriersGroupIsMutable();
+                    digitalSubCarriersGroup_.remove(index);
+                    onChanged();
+                } else {
+                    digitalSubCarriersGroupBuilder_.remove(index);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public ipowdm.Ipowdm.DigitalSubCarriersGroup.Builder getDigitalSubCarriersGroupBuilder(int index) {
+                return getDigitalSubCarriersGroupFieldBuilder().getBuilder(index);
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public ipowdm.Ipowdm.DigitalSubCarriersGroupOrBuilder getDigitalSubCarriersGroupOrBuilder(int index) {
+                if (digitalSubCarriersGroupBuilder_ == null) {
+                    return digitalSubCarriersGroup_.get(index);
+                } else {
+                    return digitalSubCarriersGroupBuilder_.getMessageOrBuilder(index);
+                }
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public java.util.List getDigitalSubCarriersGroupOrBuilderList() {
+                if (digitalSubCarriersGroupBuilder_ != null) {
+                    return digitalSubCarriersGroupBuilder_.getMessageOrBuilderList();
+                } else {
+                    return java.util.Collections.unmodifiableList(digitalSubCarriersGroup_);
+                }
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public ipowdm.Ipowdm.DigitalSubCarriersGroup.Builder addDigitalSubCarriersGroupBuilder() {
+                return getDigitalSubCarriersGroupFieldBuilder().addBuilder(ipowdm.Ipowdm.DigitalSubCarriersGroup.getDefaultInstance());
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public ipowdm.Ipowdm.DigitalSubCarriersGroup.Builder addDigitalSubCarriersGroupBuilder(int index) {
+                return getDigitalSubCarriersGroupFieldBuilder().addBuilder(index, ipowdm.Ipowdm.DigitalSubCarriersGroup.getDefaultInstance());
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public java.util.List getDigitalSubCarriersGroupBuilderList() {
+                return getDigitalSubCarriersGroupFieldBuilder().getBuilderList();
+            }
+
+            private com.google.protobuf.RepeatedFieldBuilderV3 getDigitalSubCarriersGroupFieldBuilder() {
+                if (digitalSubCarriersGroupBuilder_ == null) {
+                    digitalSubCarriersGroupBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(digitalSubCarriersGroup_, ((bitField0_ & 0x00000010) != 0), getParentForChildren(), isClean());
+                    digitalSubCarriersGroup_ = null;
+                }
+                return digitalSubCarriersGroupBuilder_;
+            }
+
+            private java.lang.Object operation_ = "";
+
+            /**
+             * string operation = 6;
+             * @return The operation.
+             */
+            public java.lang.String getOperation() {
+                java.lang.Object ref = operation_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    operation_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string operation = 6;
+             * @return The bytes for operation.
+             */
+            public com.google.protobuf.ByteString getOperationBytes() {
+                java.lang.Object ref = operation_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    operation_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string operation = 6;
+             * @param value The operation to set.
+             * @return This builder for chaining.
+             */
+            public Builder setOperation(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                operation_ = value;
+                bitField0_ |= 0x00000020;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string operation = 6;
+             * @return This builder for chaining.
+             */
+            public Builder clearOperation() {
+                operation_ = getDefaultInstance().getOperation();
+                bitField0_ = (bitField0_ & ~0x00000020);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string operation = 6;
+             * @param value The bytes for operation to set.
+             * @return This builder for chaining.
+             */
+            public Builder setOperationBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                operation_ = value;
+                bitField0_ |= 0x00000020;
+                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:ipowdm.Component)
+        }
+
+        // @@protoc_insertion_point(class_scope:ipowdm.Component)
+        private static final ipowdm.Ipowdm.Component DEFAULT_INSTANCE;
+
+        static {
+            DEFAULT_INSTANCE = new ipowdm.Ipowdm.Component();
+        }
+
+        public static ipowdm.Ipowdm.Component getDefaultInstance() {
+            return DEFAULT_INSTANCE;
+        }
+
+        private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+
+            @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();
+            }
+        };
+
+        public static com.google.protobuf.Parser parser() {
+            return PARSER;
+        }
+
+        @java.lang.Override
+        public com.google.protobuf.Parser getParserForType() {
+            return PARSER;
+        }
+
+        @java.lang.Override
+        public ipowdm.Ipowdm.Component getDefaultInstanceForType() {
+            return DEFAULT_INSTANCE;
+        }
+    }
+
+    public interface TransceiverOrBuilder extends // @@protoc_insertion_point(interface_extends:ipowdm.Transceiver)
+    com.google.protobuf.MessageOrBuilder {
+
+        /**
+         * repeated .ipowdm.Component components = 1;
+         */
+        java.util.List getComponentsList();
+
+        /**
+         * repeated .ipowdm.Component components = 1;
+         */
+        ipowdm.Ipowdm.Component getComponents(int index);
+
+        /**
+         * repeated .ipowdm.Component components = 1;
+         */
+        int getComponentsCount();
+
+        /**
+         * repeated .ipowdm.Component components = 1;
+         */
+        java.util.List getComponentsOrBuilderList();
+
+        /**
+         * repeated .ipowdm.Component components = 1;
+         */
+        ipowdm.Ipowdm.ComponentOrBuilder getComponentsOrBuilder(int index);
+    }
+
+    /**
+     * Protobuf type {@code ipowdm.Transceiver}
+     */
+    public static final class Transceiver extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:ipowdm.Transceiver)
+    TransceiverOrBuilder {
+
+        private static final long serialVersionUID = 0L;
+
+        // Use Transceiver.newBuilder() to construct.
+        private Transceiver(com.google.protobuf.GeneratedMessageV3.Builder builder) {
+            super(builder);
+        }
+
+        private Transceiver() {
+            components_ = java.util.Collections.emptyList();
+        }
+
+        @java.lang.Override
+        @SuppressWarnings({ "unused" })
+        protected java.lang.Object newInstance(UnusedPrivateParameter unused) {
+            return new Transceiver();
+        }
+
+        public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+            return ipowdm.Ipowdm.internal_static_ipowdm_Transceiver_descriptor;
+        }
+
+        @java.lang.Override
+        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+            return ipowdm.Ipowdm.internal_static_ipowdm_Transceiver_fieldAccessorTable.ensureFieldAccessorsInitialized(ipowdm.Ipowdm.Transceiver.class, ipowdm.Ipowdm.Transceiver.Builder.class);
+        }
+
+        public static final int COMPONENTS_FIELD_NUMBER = 1;
+
+        @SuppressWarnings("serial")
+        private java.util.List components_;
+
+        /**
+         * repeated .ipowdm.Component components = 1;
+         */
+        @java.lang.Override
+        public java.util.List getComponentsList() {
+            return components_;
+        }
+
+        /**
+         * repeated .ipowdm.Component components = 1;
+         */
+        @java.lang.Override
+        public java.util.List getComponentsOrBuilderList() {
+            return components_;
+        }
+
+        /**
+         * repeated .ipowdm.Component components = 1;
+         */
+        @java.lang.Override
+        public int getComponentsCount() {
+            return components_.size();
+        }
+
+        /**
+         * repeated .ipowdm.Component components = 1;
+         */
+        @java.lang.Override
+        public ipowdm.Ipowdm.Component getComponents(int index) {
+            return components_.get(index);
+        }
+
+        /**
+         * repeated .ipowdm.Component components = 1;
+         */
+        @java.lang.Override
+        public ipowdm.Ipowdm.ComponentOrBuilder getComponentsOrBuilder(int index) {
+            return components_.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 < components_.size(); i++) {
+                output.writeMessage(1, components_.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 < components_.size(); i++) {
+                size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, components_.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 ipowdm.Ipowdm.Transceiver)) {
+                return super.equals(obj);
+            }
+            ipowdm.Ipowdm.Transceiver other = (ipowdm.Ipowdm.Transceiver) obj;
+            if (!getComponentsList().equals(other.getComponentsList()))
+                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 (getComponentsCount() > 0) {
+                hash = (37 * hash) + COMPONENTS_FIELD_NUMBER;
+                hash = (53 * hash) + getComponentsList().hashCode();
+            }
+            hash = (29 * hash) + getUnknownFields().hashCode();
+            memoizedHashCode = hash;
+            return hash;
+        }
+
+        public static ipowdm.Ipowdm.Transceiver parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.Transceiver parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.Transceiver parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.Transceiver parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.Transceiver parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.Transceiver parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.Transceiver parseFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.Transceiver 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 ipowdm.Ipowdm.Transceiver parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.Transceiver 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 ipowdm.Ipowdm.Transceiver parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.Transceiver 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(ipowdm.Ipowdm.Transceiver 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 ipowdm.Transceiver}
+         */
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:ipowdm.Transceiver)
+        ipowdm.Ipowdm.TransceiverOrBuilder {
+
+            public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_Transceiver_descriptor;
+            }
+
+            @java.lang.Override
+            protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_Transceiver_fieldAccessorTable.ensureFieldAccessorsInitialized(ipowdm.Ipowdm.Transceiver.class, ipowdm.Ipowdm.Transceiver.Builder.class);
+            }
+
+            // Construct using ipowdm.Ipowdm.Transceiver.newBuilder()
+            private Builder() {
+            }
+
+            private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+                super(parent);
+            }
+
+            @java.lang.Override
+            public Builder clear() {
+                super.clear();
+                bitField0_ = 0;
+                if (componentsBuilder_ == null) {
+                    components_ = java.util.Collections.emptyList();
+                } else {
+                    components_ = null;
+                    componentsBuilder_.clear();
+                }
+                bitField0_ = (bitField0_ & ~0x00000001);
+                return this;
+            }
+
+            @java.lang.Override
+            public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_Transceiver_descriptor;
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.Transceiver getDefaultInstanceForType() {
+                return ipowdm.Ipowdm.Transceiver.getDefaultInstance();
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.Transceiver build() {
+                ipowdm.Ipowdm.Transceiver result = buildPartial();
+                if (!result.isInitialized()) {
+                    throw newUninitializedMessageException(result);
+                }
+                return result;
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.Transceiver buildPartial() {
+                ipowdm.Ipowdm.Transceiver result = new ipowdm.Ipowdm.Transceiver(this);
+                buildPartialRepeatedFields(result);
+                if (bitField0_ != 0) {
+                    buildPartial0(result);
+                }
+                onBuilt();
+                return result;
+            }
+
+            private void buildPartialRepeatedFields(ipowdm.Ipowdm.Transceiver result) {
+                if (componentsBuilder_ == null) {
+                    if (((bitField0_ & 0x00000001) != 0)) {
+                        components_ = java.util.Collections.unmodifiableList(components_);
+                        bitField0_ = (bitField0_ & ~0x00000001);
+                    }
+                    result.components_ = components_;
+                } else {
+                    result.components_ = componentsBuilder_.build();
+                }
+            }
+
+            private void buildPartial0(ipowdm.Ipowdm.Transceiver result) {
+                int from_bitField0_ = bitField0_;
+            }
+
+            @java.lang.Override
+            public Builder mergeFrom(com.google.protobuf.Message other) {
+                if (other instanceof ipowdm.Ipowdm.Transceiver) {
+                    return mergeFrom((ipowdm.Ipowdm.Transceiver) other);
+                } else {
+                    super.mergeFrom(other);
+                    return this;
+                }
+            }
+
+            public Builder mergeFrom(ipowdm.Ipowdm.Transceiver other) {
+                if (other == ipowdm.Ipowdm.Transceiver.getDefaultInstance())
+                    return this;
+                if (componentsBuilder_ == null) {
+                    if (!other.components_.isEmpty()) {
+                        if (components_.isEmpty()) {
+                            components_ = other.components_;
+                            bitField0_ = (bitField0_ & ~0x00000001);
+                        } else {
+                            ensureComponentsIsMutable();
+                            components_.addAll(other.components_);
+                        }
+                        onChanged();
+                    }
+                } else {
+                    if (!other.components_.isEmpty()) {
+                        if (componentsBuilder_.isEmpty()) {
+                            componentsBuilder_.dispose();
+                            componentsBuilder_ = null;
+                            components_ = other.components_;
+                            bitField0_ = (bitField0_ & ~0x00000001);
+                            componentsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getComponentsFieldBuilder() : null;
+                        } else {
+                            componentsBuilder_.addAllMessages(other.components_);
+                        }
+                    }
+                }
+                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:
+                                {
+                                    ipowdm.Ipowdm.Component m = input.readMessage(ipowdm.Ipowdm.Component.parser(), extensionRegistry);
+                                    if (componentsBuilder_ == null) {
+                                        ensureComponentsIsMutable();
+                                        components_.add(m);
+                                    } else {
+                                        componentsBuilder_.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 components_ = java.util.Collections.emptyList();
+
+            private void ensureComponentsIsMutable() {
+                if (!((bitField0_ & 0x00000001) != 0)) {
+                    components_ = new java.util.ArrayList(components_);
+                    bitField0_ |= 0x00000001;
+                }
+            }
+
+            private com.google.protobuf.RepeatedFieldBuilderV3 componentsBuilder_;
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public java.util.List getComponentsList() {
+                if (componentsBuilder_ == null) {
+                    return java.util.Collections.unmodifiableList(components_);
+                } else {
+                    return componentsBuilder_.getMessageList();
+                }
+            }
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public int getComponentsCount() {
+                if (componentsBuilder_ == null) {
+                    return components_.size();
+                } else {
+                    return componentsBuilder_.getCount();
+                }
+            }
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public ipowdm.Ipowdm.Component getComponents(int index) {
+                if (componentsBuilder_ == null) {
+                    return components_.get(index);
+                } else {
+                    return componentsBuilder_.getMessage(index);
+                }
+            }
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public Builder setComponents(int index, ipowdm.Ipowdm.Component value) {
+                if (componentsBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureComponentsIsMutable();
+                    components_.set(index, value);
+                    onChanged();
+                } else {
+                    componentsBuilder_.setMessage(index, value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public Builder setComponents(int index, ipowdm.Ipowdm.Component.Builder builderForValue) {
+                if (componentsBuilder_ == null) {
+                    ensureComponentsIsMutable();
+                    components_.set(index, builderForValue.build());
+                    onChanged();
+                } else {
+                    componentsBuilder_.setMessage(index, builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public Builder addComponents(ipowdm.Ipowdm.Component value) {
+                if (componentsBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureComponentsIsMutable();
+                    components_.add(value);
+                    onChanged();
+                } else {
+                    componentsBuilder_.addMessage(value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public Builder addComponents(int index, ipowdm.Ipowdm.Component value) {
+                if (componentsBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureComponentsIsMutable();
+                    components_.add(index, value);
+                    onChanged();
+                } else {
+                    componentsBuilder_.addMessage(index, value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public Builder addComponents(ipowdm.Ipowdm.Component.Builder builderForValue) {
+                if (componentsBuilder_ == null) {
+                    ensureComponentsIsMutable();
+                    components_.add(builderForValue.build());
+                    onChanged();
+                } else {
+                    componentsBuilder_.addMessage(builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public Builder addComponents(int index, ipowdm.Ipowdm.Component.Builder builderForValue) {
+                if (componentsBuilder_ == null) {
+                    ensureComponentsIsMutable();
+                    components_.add(index, builderForValue.build());
+                    onChanged();
+                } else {
+                    componentsBuilder_.addMessage(index, builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public Builder addAllComponents(java.lang.Iterable values) {
+                if (componentsBuilder_ == null) {
+                    ensureComponentsIsMutable();
+                    com.google.protobuf.AbstractMessageLite.Builder.addAll(values, components_);
+                    onChanged();
+                } else {
+                    componentsBuilder_.addAllMessages(values);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public Builder clearComponents() {
+                if (componentsBuilder_ == null) {
+                    components_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
+                    onChanged();
+                } else {
+                    componentsBuilder_.clear();
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public Builder removeComponents(int index) {
+                if (componentsBuilder_ == null) {
+                    ensureComponentsIsMutable();
+                    components_.remove(index);
+                    onChanged();
+                } else {
+                    componentsBuilder_.remove(index);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public ipowdm.Ipowdm.Component.Builder getComponentsBuilder(int index) {
+                return getComponentsFieldBuilder().getBuilder(index);
+            }
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public ipowdm.Ipowdm.ComponentOrBuilder getComponentsOrBuilder(int index) {
+                if (componentsBuilder_ == null) {
+                    return components_.get(index);
+                } else {
+                    return componentsBuilder_.getMessageOrBuilder(index);
+                }
+            }
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public java.util.List getComponentsOrBuilderList() {
+                if (componentsBuilder_ != null) {
+                    return componentsBuilder_.getMessageOrBuilderList();
+                } else {
+                    return java.util.Collections.unmodifiableList(components_);
+                }
+            }
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public ipowdm.Ipowdm.Component.Builder addComponentsBuilder() {
+                return getComponentsFieldBuilder().addBuilder(ipowdm.Ipowdm.Component.getDefaultInstance());
+            }
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public ipowdm.Ipowdm.Component.Builder addComponentsBuilder(int index) {
+                return getComponentsFieldBuilder().addBuilder(index, ipowdm.Ipowdm.Component.getDefaultInstance());
+            }
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public java.util.List getComponentsBuilderList() {
+                return getComponentsFieldBuilder().getBuilderList();
+            }
+
+            private com.google.protobuf.RepeatedFieldBuilderV3 getComponentsFieldBuilder() {
+                if (componentsBuilder_ == null) {
+                    componentsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(components_, ((bitField0_ & 0x00000001) != 0), getParentForChildren(), isClean());
+                    components_ = null;
+                }
+                return componentsBuilder_;
+            }
+
+            @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:ipowdm.Transceiver)
+        }
+
+        // @@protoc_insertion_point(class_scope:ipowdm.Transceiver)
+        private static final ipowdm.Ipowdm.Transceiver DEFAULT_INSTANCE;
+
+        static {
+            DEFAULT_INSTANCE = new ipowdm.Ipowdm.Transceiver();
+        }
+
+        public static ipowdm.Ipowdm.Transceiver getDefaultInstance() {
+            return DEFAULT_INSTANCE;
+        }
+
+        private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+
+            @java.lang.Override
+            public Transceiver parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+                Builder builder = newBuilder();
+                try {
+                    builder.mergeFrom(input, extensionRegistry);
+                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    throw e.setUnfinishedMessage(builder.buildPartial());
+                } catch (com.google.protobuf.UninitializedMessageException e) {
+                    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 ipowdm.Ipowdm.Transceiver getDefaultInstanceForType() {
+            return DEFAULT_INSTANCE;
+        }
+    }
+
+    public interface IpowdmRuleSetOrBuilder extends // @@protoc_insertion_point(interface_extends:ipowdm.IpowdmRuleSet)
+    com.google.protobuf.MessageOrBuilder {
+
+        /**
+         * repeated .ipowdm.RuleEndpoint src = 1;
+         */
+        java.util.List getSrcList();
+
+        /**
+         * repeated .ipowdm.RuleEndpoint src = 1;
+         */
+        ipowdm.Ipowdm.RuleEndpoint getSrc(int index);
+
+        /**
+         * repeated .ipowdm.RuleEndpoint src = 1;
+         */
+        int getSrcCount();
+
+        /**
+         * repeated .ipowdm.RuleEndpoint src = 1;
+         */
+        java.util.List getSrcOrBuilderList();
+
+        /**
+         * repeated .ipowdm.RuleEndpoint src = 1;
+         */
+        ipowdm.Ipowdm.RuleEndpointOrBuilder getSrcOrBuilder(int index);
+
+        /**
+         * repeated .ipowdm.RuleEndpoint dst = 2;
+         */
+        java.util.List getDstList();
+
+        /**
+         * repeated .ipowdm.RuleEndpoint dst = 2;
+         */
+        ipowdm.Ipowdm.RuleEndpoint getDst(int index);
+
+        /**
+         * repeated .ipowdm.RuleEndpoint dst = 2;
+         */
+        int getDstCount();
+
+        /**
+         * repeated .ipowdm.RuleEndpoint dst = 2;
+         */
+        java.util.List getDstOrBuilderList();
+
+        /**
+         * repeated .ipowdm.RuleEndpoint dst = 2;
+         */
+        ipowdm.Ipowdm.RuleEndpointOrBuilder getDstOrBuilder(int index);
+
+        /**
+         * int32 bw = 3;
+         * @return The bw.
+         */
+        int getBw();
+
+        /**
+         * string uuid = 4;
+         * @return The uuid.
+         */
+        java.lang.String getUuid();
+
+        /**
+         * string uuid = 4;
+         * @return The bytes for uuid.
+         */
+        com.google.protobuf.ByteString getUuidBytes();
+
+        /**
+         * .ipowdm.Transceiver transceiver = 5;
+         * @return Whether the transceiver field is set.
+         */
+        boolean hasTransceiver();
+
+        /**
+         * .ipowdm.Transceiver transceiver = 5;
+         * @return The transceiver.
+         */
+        ipowdm.Ipowdm.Transceiver getTransceiver();
+
+        /**
+         * .ipowdm.Transceiver transceiver = 5;
+         */
+        ipowdm.Ipowdm.TransceiverOrBuilder getTransceiverOrBuilder();
+    }
+
+    /**
+     * Protobuf type {@code ipowdm.IpowdmRuleSet}
+     */
+    public static final class IpowdmRuleSet extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:ipowdm.IpowdmRuleSet)
+    IpowdmRuleSetOrBuilder {
+
+        private static final long serialVersionUID = 0L;
+
+        // Use IpowdmRuleSet.newBuilder() to construct.
+        private IpowdmRuleSet(com.google.protobuf.GeneratedMessageV3.Builder builder) {
+            super(builder);
+        }
+
+        private IpowdmRuleSet() {
+            src_ = java.util.Collections.emptyList();
+            dst_ = java.util.Collections.emptyList();
+            uuid_ = "";
+        }
+
+        @java.lang.Override
+        @SuppressWarnings({ "unused" })
+        protected java.lang.Object newInstance(UnusedPrivateParameter unused) {
+            return new IpowdmRuleSet();
+        }
+
+        public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+            return ipowdm.Ipowdm.internal_static_ipowdm_IpowdmRuleSet_descriptor;
+        }
+
+        @java.lang.Override
+        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+            return ipowdm.Ipowdm.internal_static_ipowdm_IpowdmRuleSet_fieldAccessorTable.ensureFieldAccessorsInitialized(ipowdm.Ipowdm.IpowdmRuleSet.class, ipowdm.Ipowdm.IpowdmRuleSet.Builder.class);
+        }
+
+        public static final int SRC_FIELD_NUMBER = 1;
+
+        @SuppressWarnings("serial")
+        private java.util.List src_;
+
+        /**
+         * repeated .ipowdm.RuleEndpoint src = 1;
+         */
+        @java.lang.Override
+        public java.util.List getSrcList() {
+            return src_;
+        }
+
+        /**
+         * repeated .ipowdm.RuleEndpoint src = 1;
+         */
+        @java.lang.Override
+        public java.util.List getSrcOrBuilderList() {
+            return src_;
+        }
+
+        /**
+         * repeated .ipowdm.RuleEndpoint src = 1;
+         */
+        @java.lang.Override
+        public int getSrcCount() {
+            return src_.size();
+        }
+
+        /**
+         * repeated .ipowdm.RuleEndpoint src = 1;
+         */
+        @java.lang.Override
+        public ipowdm.Ipowdm.RuleEndpoint getSrc(int index) {
+            return src_.get(index);
+        }
+
+        /**
+         * repeated .ipowdm.RuleEndpoint src = 1;
+         */
+        @java.lang.Override
+        public ipowdm.Ipowdm.RuleEndpointOrBuilder getSrcOrBuilder(int index) {
+            return src_.get(index);
+        }
+
+        public static final int DST_FIELD_NUMBER = 2;
+
+        @SuppressWarnings("serial")
+        private java.util.List dst_;
+
+        /**
+         * repeated .ipowdm.RuleEndpoint dst = 2;
+         */
+        @java.lang.Override
+        public java.util.List getDstList() {
+            return dst_;
+        }
+
+        /**
+         * repeated .ipowdm.RuleEndpoint dst = 2;
+         */
+        @java.lang.Override
+        public java.util.List getDstOrBuilderList() {
+            return dst_;
+        }
+
+        /**
+         * repeated .ipowdm.RuleEndpoint dst = 2;
+         */
+        @java.lang.Override
+        public int getDstCount() {
+            return dst_.size();
+        }
+
+        /**
+         * repeated .ipowdm.RuleEndpoint dst = 2;
+         */
+        @java.lang.Override
+        public ipowdm.Ipowdm.RuleEndpoint getDst(int index) {
+            return dst_.get(index);
+        }
+
+        /**
+         * repeated .ipowdm.RuleEndpoint dst = 2;
+         */
+        @java.lang.Override
+        public ipowdm.Ipowdm.RuleEndpointOrBuilder getDstOrBuilder(int index) {
+            return dst_.get(index);
+        }
+
+        public static final int BW_FIELD_NUMBER = 3;
+
+        private int bw_ = 0;
+
+        /**
+         * int32 bw = 3;
+         * @return The bw.
+         */
+        @java.lang.Override
+        public int getBw() {
+            return bw_;
+        }
+
+        public static final int UUID_FIELD_NUMBER = 4;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object uuid_ = "";
+
+        /**
+         * string uuid = 4;
+         * @return The uuid.
+         */
+        @java.lang.Override
+        public java.lang.String getUuid() {
+            java.lang.Object ref = uuid_;
+            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();
+                uuid_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string uuid = 4;
+         * @return The bytes for uuid.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getUuidBytes() {
+            java.lang.Object ref = uuid_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                uuid_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int TRANSCEIVER_FIELD_NUMBER = 5;
+
+        private ipowdm.Ipowdm.Transceiver transceiver_;
+
+        /**
+         * .ipowdm.Transceiver transceiver = 5;
+         * @return Whether the transceiver field is set.
+         */
+        @java.lang.Override
+        public boolean hasTransceiver() {
+            return transceiver_ != null;
+        }
+
+        /**
+         * .ipowdm.Transceiver transceiver = 5;
+         * @return The transceiver.
+         */
+        @java.lang.Override
+        public ipowdm.Ipowdm.Transceiver getTransceiver() {
+            return transceiver_ == null ? ipowdm.Ipowdm.Transceiver.getDefaultInstance() : transceiver_;
+        }
+
+        /**
+         * .ipowdm.Transceiver transceiver = 5;
+         */
+        @java.lang.Override
+        public ipowdm.Ipowdm.TransceiverOrBuilder getTransceiverOrBuilder() {
+            return transceiver_ == null ? ipowdm.Ipowdm.Transceiver.getDefaultInstance() : transceiver_;
+        }
+
+        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 < src_.size(); i++) {
+                output.writeMessage(1, src_.get(i));
+            }
+            for (int i = 0; i < dst_.size(); i++) {
+                output.writeMessage(2, dst_.get(i));
+            }
+            if (bw_ != 0) {
+                output.writeInt32(3, bw_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(uuid_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 4, uuid_);
+            }
+            if (transceiver_ != null) {
+                output.writeMessage(5, getTransceiver());
+            }
+            getUnknownFields().writeTo(output);
+        }
+
+        @java.lang.Override
+        public int getSerializedSize() {
+            int size = memoizedSize;
+            if (size != -1)
+                return size;
+            size = 0;
+            for (int i = 0; i < src_.size(); i++) {
+                size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, src_.get(i));
+            }
+            for (int i = 0; i < dst_.size(); i++) {
+                size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, dst_.get(i));
+            }
+            if (bw_ != 0) {
+                size += com.google.protobuf.CodedOutputStream.computeInt32Size(3, bw_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(uuid_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, uuid_);
+            }
+            if (transceiver_ != null) {
+                size += com.google.protobuf.CodedOutputStream.computeMessageSize(5, getTransceiver());
+            }
+            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 ipowdm.Ipowdm.IpowdmRuleSet)) {
+                return super.equals(obj);
+            }
+            ipowdm.Ipowdm.IpowdmRuleSet other = (ipowdm.Ipowdm.IpowdmRuleSet) obj;
+            if (!getSrcList().equals(other.getSrcList()))
+                return false;
+            if (!getDstList().equals(other.getDstList()))
+                return false;
+            if (getBw() != other.getBw())
+                return false;
+            if (!getUuid().equals(other.getUuid()))
+                return false;
+            if (hasTransceiver() != other.hasTransceiver())
+                return false;
+            if (hasTransceiver()) {
+                if (!getTransceiver().equals(other.getTransceiver()))
+                    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 (getSrcCount() > 0) {
+                hash = (37 * hash) + SRC_FIELD_NUMBER;
+                hash = (53 * hash) + getSrcList().hashCode();
+            }
+            if (getDstCount() > 0) {
+                hash = (37 * hash) + DST_FIELD_NUMBER;
+                hash = (53 * hash) + getDstList().hashCode();
+            }
+            hash = (37 * hash) + BW_FIELD_NUMBER;
+            hash = (53 * hash) + getBw();
+            hash = (37 * hash) + UUID_FIELD_NUMBER;
+            hash = (53 * hash) + getUuid().hashCode();
+            if (hasTransceiver()) {
+                hash = (37 * hash) + TRANSCEIVER_FIELD_NUMBER;
+                hash = (53 * hash) + getTransceiver().hashCode();
+            }
+            hash = (29 * hash) + getUnknownFields().hashCode();
+            memoizedHashCode = hash;
+            return hash;
+        }
+
+        public static ipowdm.Ipowdm.IpowdmRuleSet parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.IpowdmRuleSet parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.IpowdmRuleSet parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.IpowdmRuleSet parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.IpowdmRuleSet parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.IpowdmRuleSet parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.IpowdmRuleSet parseFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.IpowdmRuleSet 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 ipowdm.Ipowdm.IpowdmRuleSet parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.IpowdmRuleSet 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 ipowdm.Ipowdm.IpowdmRuleSet parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.IpowdmRuleSet 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(ipowdm.Ipowdm.IpowdmRuleSet 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 ipowdm.IpowdmRuleSet}
+         */
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:ipowdm.IpowdmRuleSet)
+        ipowdm.Ipowdm.IpowdmRuleSetOrBuilder {
+
+            public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_IpowdmRuleSet_descriptor;
+            }
+
+            @java.lang.Override
+            protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_IpowdmRuleSet_fieldAccessorTable.ensureFieldAccessorsInitialized(ipowdm.Ipowdm.IpowdmRuleSet.class, ipowdm.Ipowdm.IpowdmRuleSet.Builder.class);
+            }
+
+            // Construct using ipowdm.Ipowdm.IpowdmRuleSet.newBuilder()
+            private Builder() {
+            }
+
+            private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+                super(parent);
+            }
+
+            @java.lang.Override
+            public Builder clear() {
+                super.clear();
+                bitField0_ = 0;
+                if (srcBuilder_ == null) {
+                    src_ = java.util.Collections.emptyList();
+                } else {
+                    src_ = null;
+                    srcBuilder_.clear();
+                }
+                bitField0_ = (bitField0_ & ~0x00000001);
+                if (dstBuilder_ == null) {
+                    dst_ = java.util.Collections.emptyList();
+                } else {
+                    dst_ = null;
+                    dstBuilder_.clear();
+                }
+                bitField0_ = (bitField0_ & ~0x00000002);
+                bw_ = 0;
+                uuid_ = "";
+                transceiver_ = null;
+                if (transceiverBuilder_ != null) {
+                    transceiverBuilder_.dispose();
+                    transceiverBuilder_ = null;
+                }
+                return this;
+            }
+
+            @java.lang.Override
+            public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_IpowdmRuleSet_descriptor;
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.IpowdmRuleSet getDefaultInstanceForType() {
+                return ipowdm.Ipowdm.IpowdmRuleSet.getDefaultInstance();
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.IpowdmRuleSet build() {
+                ipowdm.Ipowdm.IpowdmRuleSet result = buildPartial();
+                if (!result.isInitialized()) {
+                    throw newUninitializedMessageException(result);
+                }
+                return result;
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.IpowdmRuleSet buildPartial() {
+                ipowdm.Ipowdm.IpowdmRuleSet result = new ipowdm.Ipowdm.IpowdmRuleSet(this);
+                buildPartialRepeatedFields(result);
+                if (bitField0_ != 0) {
+                    buildPartial0(result);
+                }
+                onBuilt();
+                return result;
+            }
+
+            private void buildPartialRepeatedFields(ipowdm.Ipowdm.IpowdmRuleSet result) {
+                if (srcBuilder_ == null) {
+                    if (((bitField0_ & 0x00000001) != 0)) {
+                        src_ = java.util.Collections.unmodifiableList(src_);
+                        bitField0_ = (bitField0_ & ~0x00000001);
+                    }
+                    result.src_ = src_;
+                } else {
+                    result.src_ = srcBuilder_.build();
+                }
+                if (dstBuilder_ == null) {
+                    if (((bitField0_ & 0x00000002) != 0)) {
+                        dst_ = java.util.Collections.unmodifiableList(dst_);
+                        bitField0_ = (bitField0_ & ~0x00000002);
+                    }
+                    result.dst_ = dst_;
+                } else {
+                    result.dst_ = dstBuilder_.build();
+                }
+            }
+
+            private void buildPartial0(ipowdm.Ipowdm.IpowdmRuleSet result) {
+                int from_bitField0_ = bitField0_;
+                if (((from_bitField0_ & 0x00000004) != 0)) {
+                    result.bw_ = bw_;
+                }
+                if (((from_bitField0_ & 0x00000008) != 0)) {
+                    result.uuid_ = uuid_;
+                }
+                if (((from_bitField0_ & 0x00000010) != 0)) {
+                    result.transceiver_ = transceiverBuilder_ == null ? transceiver_ : transceiverBuilder_.build();
+                }
+            }
+
+            @java.lang.Override
+            public Builder mergeFrom(com.google.protobuf.Message other) {
+                if (other instanceof ipowdm.Ipowdm.IpowdmRuleSet) {
+                    return mergeFrom((ipowdm.Ipowdm.IpowdmRuleSet) other);
+                } else {
+                    super.mergeFrom(other);
+                    return this;
+                }
+            }
+
+            public Builder mergeFrom(ipowdm.Ipowdm.IpowdmRuleSet other) {
+                if (other == ipowdm.Ipowdm.IpowdmRuleSet.getDefaultInstance())
+                    return this;
+                if (srcBuilder_ == null) {
+                    if (!other.src_.isEmpty()) {
+                        if (src_.isEmpty()) {
+                            src_ = other.src_;
+                            bitField0_ = (bitField0_ & ~0x00000001);
+                        } else {
+                            ensureSrcIsMutable();
+                            src_.addAll(other.src_);
+                        }
+                        onChanged();
+                    }
+                } else {
+                    if (!other.src_.isEmpty()) {
+                        if (srcBuilder_.isEmpty()) {
+                            srcBuilder_.dispose();
+                            srcBuilder_ = null;
+                            src_ = other.src_;
+                            bitField0_ = (bitField0_ & ~0x00000001);
+                            srcBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getSrcFieldBuilder() : null;
+                        } else {
+                            srcBuilder_.addAllMessages(other.src_);
+                        }
+                    }
+                }
+                if (dstBuilder_ == null) {
+                    if (!other.dst_.isEmpty()) {
+                        if (dst_.isEmpty()) {
+                            dst_ = other.dst_;
+                            bitField0_ = (bitField0_ & ~0x00000002);
+                        } else {
+                            ensureDstIsMutable();
+                            dst_.addAll(other.dst_);
+                        }
+                        onChanged();
+                    }
+                } else {
+                    if (!other.dst_.isEmpty()) {
+                        if (dstBuilder_.isEmpty()) {
+                            dstBuilder_.dispose();
+                            dstBuilder_ = null;
+                            dst_ = other.dst_;
+                            bitField0_ = (bitField0_ & ~0x00000002);
+                            dstBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getDstFieldBuilder() : null;
+                        } else {
+                            dstBuilder_.addAllMessages(other.dst_);
+                        }
+                    }
+                }
+                if (other.getBw() != 0) {
+                    setBw(other.getBw());
+                }
+                if (!other.getUuid().isEmpty()) {
+                    uuid_ = other.uuid_;
+                    bitField0_ |= 0x00000008;
+                    onChanged();
+                }
+                if (other.hasTransceiver()) {
+                    mergeTransceiver(other.getTransceiver());
+                }
+                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:
+                                {
+                                    ipowdm.Ipowdm.RuleEndpoint m = input.readMessage(ipowdm.Ipowdm.RuleEndpoint.parser(), extensionRegistry);
+                                    if (srcBuilder_ == null) {
+                                        ensureSrcIsMutable();
+                                        src_.add(m);
+                                    } else {
+                                        srcBuilder_.addMessage(m);
+                                    }
+                                    break;
+                                }
+                            // case 10
+                            case 18:
+                                {
+                                    ipowdm.Ipowdm.RuleEndpoint m = input.readMessage(ipowdm.Ipowdm.RuleEndpoint.parser(), extensionRegistry);
+                                    if (dstBuilder_ == null) {
+                                        ensureDstIsMutable();
+                                        dst_.add(m);
+                                    } else {
+                                        dstBuilder_.addMessage(m);
+                                    }
+                                    break;
+                                }
+                            // case 18
+                            case 24:
+                                {
+                                    bw_ = input.readInt32();
+                                    bitField0_ |= 0x00000004;
+                                    break;
+                                }
+                            // case 24
+                            case 34:
+                                {
+                                    uuid_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00000008;
+                                    break;
+                                }
+                            // case 34
+                            case 42:
+                                {
+                                    input.readMessage(getTransceiverFieldBuilder().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)
+                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    throw e.unwrapIOException();
+                } finally {
+                    onChanged();
+                }
+                // finally
+                return this;
+            }
+
+            private int bitField0_;
+
+            private java.util.List src_ = java.util.Collections.emptyList();
+
+            private void ensureSrcIsMutable() {
+                if (!((bitField0_ & 0x00000001) != 0)) {
+                    src_ = new java.util.ArrayList(src_);
+                    bitField0_ |= 0x00000001;
+                }
+            }
+
+            private com.google.protobuf.RepeatedFieldBuilderV3 srcBuilder_;
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public java.util.List getSrcList() {
+                if (srcBuilder_ == null) {
+                    return java.util.Collections.unmodifiableList(src_);
+                } else {
+                    return srcBuilder_.getMessageList();
+                }
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public int getSrcCount() {
+                if (srcBuilder_ == null) {
+                    return src_.size();
+                } else {
+                    return srcBuilder_.getCount();
+                }
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public ipowdm.Ipowdm.RuleEndpoint getSrc(int index) {
+                if (srcBuilder_ == null) {
+                    return src_.get(index);
+                } else {
+                    return srcBuilder_.getMessage(index);
+                }
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public Builder setSrc(int index, ipowdm.Ipowdm.RuleEndpoint value) {
+                if (srcBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureSrcIsMutable();
+                    src_.set(index, value);
+                    onChanged();
+                } else {
+                    srcBuilder_.setMessage(index, value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public Builder setSrc(int index, ipowdm.Ipowdm.RuleEndpoint.Builder builderForValue) {
+                if (srcBuilder_ == null) {
+                    ensureSrcIsMutable();
+                    src_.set(index, builderForValue.build());
+                    onChanged();
+                } else {
+                    srcBuilder_.setMessage(index, builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public Builder addSrc(ipowdm.Ipowdm.RuleEndpoint value) {
+                if (srcBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureSrcIsMutable();
+                    src_.add(value);
+                    onChanged();
+                } else {
+                    srcBuilder_.addMessage(value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public Builder addSrc(int index, ipowdm.Ipowdm.RuleEndpoint value) {
+                if (srcBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureSrcIsMutable();
+                    src_.add(index, value);
+                    onChanged();
+                } else {
+                    srcBuilder_.addMessage(index, value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public Builder addSrc(ipowdm.Ipowdm.RuleEndpoint.Builder builderForValue) {
+                if (srcBuilder_ == null) {
+                    ensureSrcIsMutable();
+                    src_.add(builderForValue.build());
+                    onChanged();
+                } else {
+                    srcBuilder_.addMessage(builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public Builder addSrc(int index, ipowdm.Ipowdm.RuleEndpoint.Builder builderForValue) {
+                if (srcBuilder_ == null) {
+                    ensureSrcIsMutable();
+                    src_.add(index, builderForValue.build());
+                    onChanged();
+                } else {
+                    srcBuilder_.addMessage(index, builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public Builder addAllSrc(java.lang.Iterable values) {
+                if (srcBuilder_ == null) {
+                    ensureSrcIsMutable();
+                    com.google.protobuf.AbstractMessageLite.Builder.addAll(values, src_);
+                    onChanged();
+                } else {
+                    srcBuilder_.addAllMessages(values);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public Builder clearSrc() {
+                if (srcBuilder_ == null) {
+                    src_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
+                    onChanged();
+                } else {
+                    srcBuilder_.clear();
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public Builder removeSrc(int index) {
+                if (srcBuilder_ == null) {
+                    ensureSrcIsMutable();
+                    src_.remove(index);
+                    onChanged();
+                } else {
+                    srcBuilder_.remove(index);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public ipowdm.Ipowdm.RuleEndpoint.Builder getSrcBuilder(int index) {
+                return getSrcFieldBuilder().getBuilder(index);
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public ipowdm.Ipowdm.RuleEndpointOrBuilder getSrcOrBuilder(int index) {
+                if (srcBuilder_ == null) {
+                    return src_.get(index);
+                } else {
+                    return srcBuilder_.getMessageOrBuilder(index);
+                }
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public java.util.List getSrcOrBuilderList() {
+                if (srcBuilder_ != null) {
+                    return srcBuilder_.getMessageOrBuilderList();
+                } else {
+                    return java.util.Collections.unmodifiableList(src_);
+                }
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public ipowdm.Ipowdm.RuleEndpoint.Builder addSrcBuilder() {
+                return getSrcFieldBuilder().addBuilder(ipowdm.Ipowdm.RuleEndpoint.getDefaultInstance());
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public ipowdm.Ipowdm.RuleEndpoint.Builder addSrcBuilder(int index) {
+                return getSrcFieldBuilder().addBuilder(index, ipowdm.Ipowdm.RuleEndpoint.getDefaultInstance());
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public java.util.List getSrcBuilderList() {
+                return getSrcFieldBuilder().getBuilderList();
+            }
+
+            private com.google.protobuf.RepeatedFieldBuilderV3 getSrcFieldBuilder() {
+                if (srcBuilder_ == null) {
+                    srcBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(src_, ((bitField0_ & 0x00000001) != 0), getParentForChildren(), isClean());
+                    src_ = null;
+                }
+                return srcBuilder_;
+            }
+
+            private java.util.List dst_ = java.util.Collections.emptyList();
+
+            private void ensureDstIsMutable() {
+                if (!((bitField0_ & 0x00000002) != 0)) {
+                    dst_ = new java.util.ArrayList(dst_);
+                    bitField0_ |= 0x00000002;
+                }
+            }
+
+            private com.google.protobuf.RepeatedFieldBuilderV3 dstBuilder_;
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public java.util.List getDstList() {
+                if (dstBuilder_ == null) {
+                    return java.util.Collections.unmodifiableList(dst_);
+                } else {
+                    return dstBuilder_.getMessageList();
+                }
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public int getDstCount() {
+                if (dstBuilder_ == null) {
+                    return dst_.size();
+                } else {
+                    return dstBuilder_.getCount();
+                }
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public ipowdm.Ipowdm.RuleEndpoint getDst(int index) {
+                if (dstBuilder_ == null) {
+                    return dst_.get(index);
+                } else {
+                    return dstBuilder_.getMessage(index);
+                }
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public Builder setDst(int index, ipowdm.Ipowdm.RuleEndpoint value) {
+                if (dstBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureDstIsMutable();
+                    dst_.set(index, value);
+                    onChanged();
+                } else {
+                    dstBuilder_.setMessage(index, value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public Builder setDst(int index, ipowdm.Ipowdm.RuleEndpoint.Builder builderForValue) {
+                if (dstBuilder_ == null) {
+                    ensureDstIsMutable();
+                    dst_.set(index, builderForValue.build());
+                    onChanged();
+                } else {
+                    dstBuilder_.setMessage(index, builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public Builder addDst(ipowdm.Ipowdm.RuleEndpoint value) {
+                if (dstBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureDstIsMutable();
+                    dst_.add(value);
+                    onChanged();
+                } else {
+                    dstBuilder_.addMessage(value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public Builder addDst(int index, ipowdm.Ipowdm.RuleEndpoint value) {
+                if (dstBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureDstIsMutable();
+                    dst_.add(index, value);
+                    onChanged();
+                } else {
+                    dstBuilder_.addMessage(index, value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public Builder addDst(ipowdm.Ipowdm.RuleEndpoint.Builder builderForValue) {
+                if (dstBuilder_ == null) {
+                    ensureDstIsMutable();
+                    dst_.add(builderForValue.build());
+                    onChanged();
+                } else {
+                    dstBuilder_.addMessage(builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public Builder addDst(int index, ipowdm.Ipowdm.RuleEndpoint.Builder builderForValue) {
+                if (dstBuilder_ == null) {
+                    ensureDstIsMutable();
+                    dst_.add(index, builderForValue.build());
+                    onChanged();
+                } else {
+                    dstBuilder_.addMessage(index, builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public Builder addAllDst(java.lang.Iterable values) {
+                if (dstBuilder_ == null) {
+                    ensureDstIsMutable();
+                    com.google.protobuf.AbstractMessageLite.Builder.addAll(values, dst_);
+                    onChanged();
+                } else {
+                    dstBuilder_.addAllMessages(values);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public Builder clearDst() {
+                if (dstBuilder_ == null) {
+                    dst_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000002);
+                    onChanged();
+                } else {
+                    dstBuilder_.clear();
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public Builder removeDst(int index) {
+                if (dstBuilder_ == null) {
+                    ensureDstIsMutable();
+                    dst_.remove(index);
+                    onChanged();
+                } else {
+                    dstBuilder_.remove(index);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public ipowdm.Ipowdm.RuleEndpoint.Builder getDstBuilder(int index) {
+                return getDstFieldBuilder().getBuilder(index);
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public ipowdm.Ipowdm.RuleEndpointOrBuilder getDstOrBuilder(int index) {
+                if (dstBuilder_ == null) {
+                    return dst_.get(index);
+                } else {
+                    return dstBuilder_.getMessageOrBuilder(index);
+                }
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public java.util.List getDstOrBuilderList() {
+                if (dstBuilder_ != null) {
+                    return dstBuilder_.getMessageOrBuilderList();
+                } else {
+                    return java.util.Collections.unmodifiableList(dst_);
+                }
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public ipowdm.Ipowdm.RuleEndpoint.Builder addDstBuilder() {
+                return getDstFieldBuilder().addBuilder(ipowdm.Ipowdm.RuleEndpoint.getDefaultInstance());
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public ipowdm.Ipowdm.RuleEndpoint.Builder addDstBuilder(int index) {
+                return getDstFieldBuilder().addBuilder(index, ipowdm.Ipowdm.RuleEndpoint.getDefaultInstance());
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public java.util.List getDstBuilderList() {
+                return getDstFieldBuilder().getBuilderList();
+            }
+
+            private com.google.protobuf.RepeatedFieldBuilderV3 getDstFieldBuilder() {
+                if (dstBuilder_ == null) {
+                    dstBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(dst_, ((bitField0_ & 0x00000002) != 0), getParentForChildren(), isClean());
+                    dst_ = null;
+                }
+                return dstBuilder_;
+            }
+
+            private int bw_;
+
+            /**
+             * int32 bw = 3;
+             * @return The bw.
+             */
+            @java.lang.Override
+            public int getBw() {
+                return bw_;
+            }
+
+            /**
+             * int32 bw = 3;
+             * @param value The bw to set.
+             * @return This builder for chaining.
+             */
+            public Builder setBw(int value) {
+                bw_ = value;
+                bitField0_ |= 0x00000004;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * int32 bw = 3;
+             * @return This builder for chaining.
+             */
+            public Builder clearBw() {
+                bitField0_ = (bitField0_ & ~0x00000004);
+                bw_ = 0;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object uuid_ = "";
+
+            /**
+             * string uuid = 4;
+             * @return The uuid.
+             */
+            public java.lang.String getUuid() {
+                java.lang.Object ref = uuid_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    uuid_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string uuid = 4;
+             * @return The bytes for uuid.
+             */
+            public com.google.protobuf.ByteString getUuidBytes() {
+                java.lang.Object ref = uuid_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    uuid_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string uuid = 4;
+             * @param value The uuid to set.
+             * @return This builder for chaining.
+             */
+            public Builder setUuid(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                uuid_ = value;
+                bitField0_ |= 0x00000008;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string uuid = 4;
+             * @return This builder for chaining.
+             */
+            public Builder clearUuid() {
+                uuid_ = getDefaultInstance().getUuid();
+                bitField0_ = (bitField0_ & ~0x00000008);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string uuid = 4;
+             * @param value The bytes for uuid to set.
+             * @return This builder for chaining.
+             */
+            public Builder setUuidBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                uuid_ = value;
+                bitField0_ |= 0x00000008;
+                onChanged();
+                return this;
+            }
+
+            private ipowdm.Ipowdm.Transceiver transceiver_;
+
+            private com.google.protobuf.SingleFieldBuilderV3 transceiverBuilder_;
+
+            /**
+             * .ipowdm.Transceiver transceiver = 5;
+             * @return Whether the transceiver field is set.
+             */
+            public boolean hasTransceiver() {
+                return ((bitField0_ & 0x00000010) != 0);
+            }
+
+            /**
+             * .ipowdm.Transceiver transceiver = 5;
+             * @return The transceiver.
+             */
+            public ipowdm.Ipowdm.Transceiver getTransceiver() {
+                if (transceiverBuilder_ == null) {
+                    return transceiver_ == null ? ipowdm.Ipowdm.Transceiver.getDefaultInstance() : transceiver_;
+                } else {
+                    return transceiverBuilder_.getMessage();
+                }
+            }
+
+            /**
+             * .ipowdm.Transceiver transceiver = 5;
+             */
+            public Builder setTransceiver(ipowdm.Ipowdm.Transceiver value) {
+                if (transceiverBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    transceiver_ = value;
+                } else {
+                    transceiverBuilder_.setMessage(value);
+                }
+                bitField0_ |= 0x00000010;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .ipowdm.Transceiver transceiver = 5;
+             */
+            public Builder setTransceiver(ipowdm.Ipowdm.Transceiver.Builder builderForValue) {
+                if (transceiverBuilder_ == null) {
+                    transceiver_ = builderForValue.build();
+                } else {
+                    transceiverBuilder_.setMessage(builderForValue.build());
+                }
+                bitField0_ |= 0x00000010;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .ipowdm.Transceiver transceiver = 5;
+             */
+            public Builder mergeTransceiver(ipowdm.Ipowdm.Transceiver value) {
+                if (transceiverBuilder_ == null) {
+                    if (((bitField0_ & 0x00000010) != 0) && transceiver_ != null && transceiver_ != ipowdm.Ipowdm.Transceiver.getDefaultInstance()) {
+                        getTransceiverBuilder().mergeFrom(value);
+                    } else {
+                        transceiver_ = value;
+                    }
+                } else {
+                    transceiverBuilder_.mergeFrom(value);
+                }
+                bitField0_ |= 0x00000010;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .ipowdm.Transceiver transceiver = 5;
+             */
+            public Builder clearTransceiver() {
+                bitField0_ = (bitField0_ & ~0x00000010);
+                transceiver_ = null;
+                if (transceiverBuilder_ != null) {
+                    transceiverBuilder_.dispose();
+                    transceiverBuilder_ = null;
+                }
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .ipowdm.Transceiver transceiver = 5;
+             */
+            public ipowdm.Ipowdm.Transceiver.Builder getTransceiverBuilder() {
+                bitField0_ |= 0x00000010;
+                onChanged();
+                return getTransceiverFieldBuilder().getBuilder();
+            }
+
+            /**
+             * .ipowdm.Transceiver transceiver = 5;
+             */
+            public ipowdm.Ipowdm.TransceiverOrBuilder getTransceiverOrBuilder() {
+                if (transceiverBuilder_ != null) {
+                    return transceiverBuilder_.getMessageOrBuilder();
+                } else {
+                    return transceiver_ == null ? ipowdm.Ipowdm.Transceiver.getDefaultInstance() : transceiver_;
+                }
+            }
+
+            /**
+             * .ipowdm.Transceiver transceiver = 5;
+             */
+            private com.google.protobuf.SingleFieldBuilderV3 getTransceiverFieldBuilder() {
+                if (transceiverBuilder_ == null) {
+                    transceiverBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(getTransceiver(), getParentForChildren(), isClean());
+                    transceiver_ = null;
+                }
+                return transceiverBuilder_;
+            }
+
+            @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:ipowdm.IpowdmRuleSet)
+        }
+
+        // @@protoc_insertion_point(class_scope:ipowdm.IpowdmRuleSet)
+        private static final ipowdm.Ipowdm.IpowdmRuleSet DEFAULT_INSTANCE;
+
+        static {
+            DEFAULT_INSTANCE = new ipowdm.Ipowdm.IpowdmRuleSet();
+        }
+
+        public static ipowdm.Ipowdm.IpowdmRuleSet getDefaultInstance() {
+            return DEFAULT_INSTANCE;
+        }
+
+        private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+
+            @java.lang.Override
+            public IpowdmRuleSet parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+                Builder builder = newBuilder();
+                try {
+                    builder.mergeFrom(input, extensionRegistry);
+                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    throw e.setUnfinishedMessage(builder.buildPartial());
+                } catch (com.google.protobuf.UninitializedMessageException e) {
+                    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 ipowdm.Ipowdm.IpowdmRuleSet getDefaultInstanceForType() {
+            return DEFAULT_INSTANCE;
+        }
+    }
+
+    private static final com.google.protobuf.Descriptors.Descriptor internal_static_ipowdm_RuleEndpoint_descriptor;
+
+    private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_ipowdm_RuleEndpoint_fieldAccessorTable;
+
+    private static final com.google.protobuf.Descriptors.Descriptor internal_static_ipowdm_DigitalSubCarrierId_descriptor;
+
+    private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_ipowdm_DigitalSubCarrierId_fieldAccessorTable;
+
+    private static final com.google.protobuf.Descriptors.Descriptor internal_static_ipowdm_DigitalSubCarriersGroup_descriptor;
+
+    private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_ipowdm_DigitalSubCarriersGroup_fieldAccessorTable;
+
+    private static final com.google.protobuf.Descriptors.Descriptor internal_static_ipowdm_Component_descriptor;
+
+    private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_ipowdm_Component_fieldAccessorTable;
+
+    private static final com.google.protobuf.Descriptors.Descriptor internal_static_ipowdm_Transceiver_descriptor;
+
+    private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_ipowdm_Transceiver_fieldAccessorTable;
+
+    private static final com.google.protobuf.Descriptors.Descriptor internal_static_ipowdm_IpowdmRuleSet_descriptor;
+
+    private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_ipowdm_IpowdmRuleSet_fieldAccessorTable;
+
+    public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() {
+        return descriptor;
+    }
+
+    private static com.google.protobuf.Descriptors.FileDescriptor descriptor;
+
+    static {
+        java.lang.String[] descriptorData = { "\n\014ipowdm.proto\022\006ipowdm\"R\n\014RuleEndpoint\022\014" + "\n\004uuid\030\001 \001(\t\022\022\n\nip_address\030\002 \001(\t\022\017\n\007ip_m" + "ask\030\003 \001(\t\022\017\n\007vlan_id\030\004 \001(\005\"=\n\023DigitalSub" + "CarrierId\022\026\n\016sub_carrier_id\030\001 \001(\005\022\016\n\006act" + "ive\030\002 \001(\t\"}\n\027DigitalSubCarriersGroup\022%\n\035" + "digital_sub_carriers_group_id\030\001 \001(\005\022;\n\026d" + "igital_sub_carrier_id\030\004 \003(\0132\033.ipowdm.Dig" + "italSubCarrierId\"\273\001\n\tComponent\022\014\n\004name\030\001" + " \001(\t\022\021\n\tfrequency\030\002 \001(\002\022\033\n\023target_output" + "_power\030\003 \001(\002\022\030\n\020operational_mode\030\004 \001(\005\022C" + "\n\032digital_sub_carriers_group\030\005 \003(\0132\037.ipo" + "wdm.DigitalSubCarriersGroup\022\021\n\toperation" + "\030\006 \001(\t\"4\n\013Transceiver\022%\n\ncomponents\030\001 \003(" + "\0132\021.ipowdm.Component\"\231\001\n\rIpowdmRuleSet\022!" + "\n\003src\030\001 \003(\0132\024.ipowdm.RuleEndpoint\022!\n\003dst" + "\030\002 \003(\0132\024.ipowdm.RuleEndpoint\022\n\n\002bw\030\003 \001(\005" + "\022\014\n\004uuid\030\004 \001(\t\022(\n\013transceiver\030\005 \001(\0132\023.ip" + "owdm.Transceiverb\006proto3" };
+        descriptor = com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] {});
+        internal_static_ipowdm_RuleEndpoint_descriptor = getDescriptor().getMessageTypes().get(0);
+        internal_static_ipowdm_RuleEndpoint_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_ipowdm_RuleEndpoint_descriptor, new java.lang.String[] { "Uuid", "IpAddress", "IpMask", "VlanId" });
+        internal_static_ipowdm_DigitalSubCarrierId_descriptor = getDescriptor().getMessageTypes().get(1);
+        internal_static_ipowdm_DigitalSubCarrierId_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_ipowdm_DigitalSubCarrierId_descriptor, new java.lang.String[] { "SubCarrierId", "Active" });
+        internal_static_ipowdm_DigitalSubCarriersGroup_descriptor = getDescriptor().getMessageTypes().get(2);
+        internal_static_ipowdm_DigitalSubCarriersGroup_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_ipowdm_DigitalSubCarriersGroup_descriptor, new java.lang.String[] { "DigitalSubCarriersGroupId", "DigitalSubCarrierId" });
+        internal_static_ipowdm_Component_descriptor = getDescriptor().getMessageTypes().get(3);
+        internal_static_ipowdm_Component_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_ipowdm_Component_descriptor, new java.lang.String[] { "Name", "Frequency", "TargetOutputPower", "OperationalMode", "DigitalSubCarriersGroup", "Operation" });
+        internal_static_ipowdm_Transceiver_descriptor = getDescriptor().getMessageTypes().get(4);
+        internal_static_ipowdm_Transceiver_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_ipowdm_Transceiver_descriptor, new java.lang.String[] { "Components" });
+        internal_static_ipowdm_IpowdmRuleSet_descriptor = getDescriptor().getMessageTypes().get(5);
+        internal_static_ipowdm_IpowdmRuleSet_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_ipowdm_IpowdmRuleSet_descriptor, new java.lang.String[] { "Src", "Dst", "Bw", "Uuid", "Transceiver" });
+    }
+    // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/src/policy/target/generated-sources/grpc/tapi_lsp/TapiLsp.java b/src/policy/target/generated-sources/grpc/tapi_lsp/TapiLsp.java
new file mode 100644
index 000000000..e8f5145bd
--- /dev/null
+++ b/src/policy/target/generated-sources/grpc/tapi_lsp/TapiLsp.java
@@ -0,0 +1,3031 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: tapi_lsp.proto
+package tapi_lsp;
+
+public final class TapiLsp {
+
+    private TapiLsp() {
+    }
+
+    public static void registerAllExtensions(com.google.protobuf.ExtensionRegistryLite registry) {
+    }
+
+    public static void registerAllExtensions(com.google.protobuf.ExtensionRegistry registry) {
+        registerAllExtensions((com.google.protobuf.ExtensionRegistryLite) registry);
+    }
+
+    public interface TapiLspRuleSetOrBuilder extends // @@protoc_insertion_point(interface_extends:tapi_lsp.TapiLspRuleSet)
+    com.google.protobuf.MessageOrBuilder {
+
+        /**
+         * string input_sip = 1;
+         * @return The inputSip.
+         */
+        java.lang.String getInputSip();
+
+        /**
+         * string input_sip = 1;
+         * @return The bytes for inputSip.
+         */
+        com.google.protobuf.ByteString getInputSipBytes();
+
+        /**
+         * string output_sip = 2;
+         * @return The outputSip.
+         */
+        java.lang.String getOutputSip();
+
+        /**
+         * string output_sip = 2;
+         * @return The bytes for outputSip.
+         */
+        com.google.protobuf.ByteString getOutputSipBytes();
+
+        /**
+         * string uuid = 3;
+         * @return The uuid.
+         */
+        java.lang.String getUuid();
+
+        /**
+         * string uuid = 3;
+         * @return The bytes for uuid.
+         */
+        com.google.protobuf.ByteString getUuidBytes();
+
+        /**
+         * string bw = 4;
+         * @return The bw.
+         */
+        java.lang.String getBw();
+
+        /**
+         * string bw = 4;
+         * @return The bytes for bw.
+         */
+        com.google.protobuf.ByteString getBwBytes();
+
+        /**
+         * string tenant_uuid = 5;
+         * @return The tenantUuid.
+         */
+        java.lang.String getTenantUuid();
+
+        /**
+         * string tenant_uuid = 5;
+         * @return The bytes for tenantUuid.
+         */
+        com.google.protobuf.ByteString getTenantUuidBytes();
+
+        /**
+         * string layer_protocol_name = 6;
+         * @return The layerProtocolName.
+         */
+        java.lang.String getLayerProtocolName();
+
+        /**
+         * string layer_protocol_name = 6;
+         * @return The bytes for layerProtocolName.
+         */
+        com.google.protobuf.ByteString getLayerProtocolNameBytes();
+
+        /**
+         * string layer_protocol_qualifier = 7;
+         * @return The layerProtocolQualifier.
+         */
+        java.lang.String getLayerProtocolQualifier();
+
+        /**
+         * string layer_protocol_qualifier = 7;
+         * @return The bytes for layerProtocolQualifier.
+         */
+        com.google.protobuf.ByteString getLayerProtocolQualifierBytes();
+
+        /**
+         * string lower_frequency_mhz = 8;
+         * @return The lowerFrequencyMhz.
+         */
+        java.lang.String getLowerFrequencyMhz();
+
+        /**
+         * string lower_frequency_mhz = 8;
+         * @return The bytes for lowerFrequencyMhz.
+         */
+        com.google.protobuf.ByteString getLowerFrequencyMhzBytes();
+
+        /**
+         * string upper_frequency_mhz = 9;
+         * @return The upperFrequencyMhz.
+         */
+        java.lang.String getUpperFrequencyMhz();
+
+        /**
+         * string upper_frequency_mhz = 9;
+         * @return The bytes for upperFrequencyMhz.
+         */
+        com.google.protobuf.ByteString getUpperFrequencyMhzBytes();
+
+        /**
+         * repeated string link_uuid_path = 10;
+         * @return A list containing the linkUuidPath.
+         */
+        java.util.List getLinkUuidPathList();
+
+        /**
+         * repeated string link_uuid_path = 10;
+         * @return The count of linkUuidPath.
+         */
+        int getLinkUuidPathCount();
+
+        /**
+         * repeated string link_uuid_path = 10;
+         * @param index The index of the element to return.
+         * @return The linkUuidPath at the given index.
+         */
+        java.lang.String getLinkUuidPath(int index);
+
+        /**
+         * repeated string link_uuid_path = 10;
+         * @param index The index of the value to return.
+         * @return The bytes of the linkUuidPath at the given index.
+         */
+        com.google.protobuf.ByteString getLinkUuidPathBytes(int index);
+
+        /**
+         * string granularity = 11;
+         * @return The granularity.
+         */
+        java.lang.String getGranularity();
+
+        /**
+         * string granularity = 11;
+         * @return The bytes for granularity.
+         */
+        com.google.protobuf.ByteString getGranularityBytes();
+
+        /**
+         * string grid_type = 12;
+         * @return The gridType.
+         */
+        java.lang.String getGridType();
+
+        /**
+         * string grid_type = 12;
+         * @return The bytes for gridType.
+         */
+        com.google.protobuf.ByteString getGridTypeBytes();
+
+        /**
+         * string direction = 13;
+         * @return The direction.
+         */
+        java.lang.String getDirection();
+
+        /**
+         * string direction = 13;
+         * @return The bytes for direction.
+         */
+        com.google.protobuf.ByteString getDirectionBytes();
+
+        /**
+         * string capacity_unit = 14;
+         * @return The capacityUnit.
+         */
+        java.lang.String getCapacityUnit();
+
+        /**
+         * string capacity_unit = 14;
+         * @return The bytes for capacityUnit.
+         */
+        com.google.protobuf.ByteString getCapacityUnitBytes();
+
+        /**
+         * string capacity_value = 15;
+         * @return The capacityValue.
+         */
+        java.lang.String getCapacityValue();
+
+        /**
+         * string capacity_value = 15;
+         * @return The bytes for capacityValue.
+         */
+        com.google.protobuf.ByteString getCapacityValueBytes();
+
+        /**
+         * string route_objective_function = 16;
+         * @return The routeObjectiveFunction.
+         */
+        java.lang.String getRouteObjectiveFunction();
+
+        /**
+         * string route_objective_function = 16;
+         * @return The bytes for routeObjectiveFunction.
+         */
+        com.google.protobuf.ByteString getRouteObjectiveFunctionBytes();
+
+        /**
+         * string url = 17;
+         * @return The url.
+         */
+        java.lang.String getUrl();
+
+        /**
+         * string url = 17;
+         * @return The bytes for url.
+         */
+        com.google.protobuf.ByteString getUrlBytes();
+    }
+
+    /**
+     * Protobuf type {@code tapi_lsp.TapiLspRuleSet}
+     */
+    public static final class TapiLspRuleSet extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:tapi_lsp.TapiLspRuleSet)
+    TapiLspRuleSetOrBuilder {
+
+        private static final long serialVersionUID = 0L;
+
+        // Use TapiLspRuleSet.newBuilder() to construct.
+        private TapiLspRuleSet(com.google.protobuf.GeneratedMessageV3.Builder builder) {
+            super(builder);
+        }
+
+        private TapiLspRuleSet() {
+            inputSip_ = "";
+            outputSip_ = "";
+            uuid_ = "";
+            bw_ = "";
+            tenantUuid_ = "";
+            layerProtocolName_ = "";
+            layerProtocolQualifier_ = "";
+            lowerFrequencyMhz_ = "";
+            upperFrequencyMhz_ = "";
+            linkUuidPath_ = com.google.protobuf.LazyStringArrayList.emptyList();
+            granularity_ = "";
+            gridType_ = "";
+            direction_ = "";
+            capacityUnit_ = "";
+            capacityValue_ = "";
+            routeObjectiveFunction_ = "";
+            url_ = "";
+        }
+
+        @java.lang.Override
+        @SuppressWarnings({ "unused" })
+        protected java.lang.Object newInstance(UnusedPrivateParameter unused) {
+            return new TapiLspRuleSet();
+        }
+
+        public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+            return tapi_lsp.TapiLsp.internal_static_tapi_lsp_TapiLspRuleSet_descriptor;
+        }
+
+        @java.lang.Override
+        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+            return tapi_lsp.TapiLsp.internal_static_tapi_lsp_TapiLspRuleSet_fieldAccessorTable.ensureFieldAccessorsInitialized(tapi_lsp.TapiLsp.TapiLspRuleSet.class, tapi_lsp.TapiLsp.TapiLspRuleSet.Builder.class);
+        }
+
+        public static final int INPUT_SIP_FIELD_NUMBER = 1;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object inputSip_ = "";
+
+        /**
+         * string input_sip = 1;
+         * @return The inputSip.
+         */
+        @java.lang.Override
+        public java.lang.String getInputSip() {
+            java.lang.Object ref = inputSip_;
+            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();
+                inputSip_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string input_sip = 1;
+         * @return The bytes for inputSip.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getInputSipBytes() {
+            java.lang.Object ref = inputSip_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                inputSip_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int OUTPUT_SIP_FIELD_NUMBER = 2;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object outputSip_ = "";
+
+        /**
+         * string output_sip = 2;
+         * @return The outputSip.
+         */
+        @java.lang.Override
+        public java.lang.String getOutputSip() {
+            java.lang.Object ref = outputSip_;
+            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();
+                outputSip_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string output_sip = 2;
+         * @return The bytes for outputSip.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getOutputSipBytes() {
+            java.lang.Object ref = outputSip_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                outputSip_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int UUID_FIELD_NUMBER = 3;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object uuid_ = "";
+
+        /**
+         * string uuid = 3;
+         * @return The uuid.
+         */
+        @java.lang.Override
+        public java.lang.String getUuid() {
+            java.lang.Object ref = uuid_;
+            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();
+                uuid_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string uuid = 3;
+         * @return The bytes for uuid.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getUuidBytes() {
+            java.lang.Object ref = uuid_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                uuid_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int BW_FIELD_NUMBER = 4;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object bw_ = "";
+
+        /**
+         * string bw = 4;
+         * @return The bw.
+         */
+        @java.lang.Override
+        public java.lang.String getBw() {
+            java.lang.Object ref = bw_;
+            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();
+                bw_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string bw = 4;
+         * @return The bytes for bw.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getBwBytes() {
+            java.lang.Object ref = bw_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                bw_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int TENANT_UUID_FIELD_NUMBER = 5;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object tenantUuid_ = "";
+
+        /**
+         * string tenant_uuid = 5;
+         * @return The tenantUuid.
+         */
+        @java.lang.Override
+        public java.lang.String getTenantUuid() {
+            java.lang.Object ref = tenantUuid_;
+            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();
+                tenantUuid_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string tenant_uuid = 5;
+         * @return The bytes for tenantUuid.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getTenantUuidBytes() {
+            java.lang.Object ref = tenantUuid_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                tenantUuid_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int LAYER_PROTOCOL_NAME_FIELD_NUMBER = 6;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object layerProtocolName_ = "";
+
+        /**
+         * string layer_protocol_name = 6;
+         * @return The layerProtocolName.
+         */
+        @java.lang.Override
+        public java.lang.String getLayerProtocolName() {
+            java.lang.Object ref = layerProtocolName_;
+            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();
+                layerProtocolName_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string layer_protocol_name = 6;
+         * @return The bytes for layerProtocolName.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getLayerProtocolNameBytes() {
+            java.lang.Object ref = layerProtocolName_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                layerProtocolName_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int LAYER_PROTOCOL_QUALIFIER_FIELD_NUMBER = 7;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object layerProtocolQualifier_ = "";
+
+        /**
+         * string layer_protocol_qualifier = 7;
+         * @return The layerProtocolQualifier.
+         */
+        @java.lang.Override
+        public java.lang.String getLayerProtocolQualifier() {
+            java.lang.Object ref = layerProtocolQualifier_;
+            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();
+                layerProtocolQualifier_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string layer_protocol_qualifier = 7;
+         * @return The bytes for layerProtocolQualifier.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getLayerProtocolQualifierBytes() {
+            java.lang.Object ref = layerProtocolQualifier_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                layerProtocolQualifier_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int LOWER_FREQUENCY_MHZ_FIELD_NUMBER = 8;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object lowerFrequencyMhz_ = "";
+
+        /**
+         * string lower_frequency_mhz = 8;
+         * @return The lowerFrequencyMhz.
+         */
+        @java.lang.Override
+        public java.lang.String getLowerFrequencyMhz() {
+            java.lang.Object ref = lowerFrequencyMhz_;
+            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();
+                lowerFrequencyMhz_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string lower_frequency_mhz = 8;
+         * @return The bytes for lowerFrequencyMhz.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getLowerFrequencyMhzBytes() {
+            java.lang.Object ref = lowerFrequencyMhz_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                lowerFrequencyMhz_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int UPPER_FREQUENCY_MHZ_FIELD_NUMBER = 9;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object upperFrequencyMhz_ = "";
+
+        /**
+         * string upper_frequency_mhz = 9;
+         * @return The upperFrequencyMhz.
+         */
+        @java.lang.Override
+        public java.lang.String getUpperFrequencyMhz() {
+            java.lang.Object ref = upperFrequencyMhz_;
+            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();
+                upperFrequencyMhz_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string upper_frequency_mhz = 9;
+         * @return The bytes for upperFrequencyMhz.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getUpperFrequencyMhzBytes() {
+            java.lang.Object ref = upperFrequencyMhz_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                upperFrequencyMhz_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int LINK_UUID_PATH_FIELD_NUMBER = 10;
+
+        @SuppressWarnings("serial")
+        private com.google.protobuf.LazyStringArrayList linkUuidPath_ = com.google.protobuf.LazyStringArrayList.emptyList();
+
+        /**
+         * repeated string link_uuid_path = 10;
+         * @return A list containing the linkUuidPath.
+         */
+        public com.google.protobuf.ProtocolStringList getLinkUuidPathList() {
+            return linkUuidPath_;
+        }
+
+        /**
+         * repeated string link_uuid_path = 10;
+         * @return The count of linkUuidPath.
+         */
+        public int getLinkUuidPathCount() {
+            return linkUuidPath_.size();
+        }
+
+        /**
+         * repeated string link_uuid_path = 10;
+         * @param index The index of the element to return.
+         * @return The linkUuidPath at the given index.
+         */
+        public java.lang.String getLinkUuidPath(int index) {
+            return linkUuidPath_.get(index);
+        }
+
+        /**
+         * repeated string link_uuid_path = 10;
+         * @param index The index of the value to return.
+         * @return The bytes of the linkUuidPath at the given index.
+         */
+        public com.google.protobuf.ByteString getLinkUuidPathBytes(int index) {
+            return linkUuidPath_.getByteString(index);
+        }
+
+        public static final int GRANULARITY_FIELD_NUMBER = 11;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object granularity_ = "";
+
+        /**
+         * string granularity = 11;
+         * @return The granularity.
+         */
+        @java.lang.Override
+        public java.lang.String getGranularity() {
+            java.lang.Object ref = granularity_;
+            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();
+                granularity_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string granularity = 11;
+         * @return The bytes for granularity.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getGranularityBytes() {
+            java.lang.Object ref = granularity_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                granularity_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int GRID_TYPE_FIELD_NUMBER = 12;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object gridType_ = "";
+
+        /**
+         * string grid_type = 12;
+         * @return The gridType.
+         */
+        @java.lang.Override
+        public java.lang.String getGridType() {
+            java.lang.Object ref = gridType_;
+            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();
+                gridType_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string grid_type = 12;
+         * @return The bytes for gridType.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getGridTypeBytes() {
+            java.lang.Object ref = gridType_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                gridType_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int DIRECTION_FIELD_NUMBER = 13;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object direction_ = "";
+
+        /**
+         * string direction = 13;
+         * @return The direction.
+         */
+        @java.lang.Override
+        public java.lang.String getDirection() {
+            java.lang.Object ref = direction_;
+            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();
+                direction_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string direction = 13;
+         * @return The bytes for direction.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getDirectionBytes() {
+            java.lang.Object ref = direction_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                direction_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int CAPACITY_UNIT_FIELD_NUMBER = 14;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object capacityUnit_ = "";
+
+        /**
+         * string capacity_unit = 14;
+         * @return The capacityUnit.
+         */
+        @java.lang.Override
+        public java.lang.String getCapacityUnit() {
+            java.lang.Object ref = capacityUnit_;
+            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();
+                capacityUnit_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string capacity_unit = 14;
+         * @return The bytes for capacityUnit.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getCapacityUnitBytes() {
+            java.lang.Object ref = capacityUnit_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                capacityUnit_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int CAPACITY_VALUE_FIELD_NUMBER = 15;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object capacityValue_ = "";
+
+        /**
+         * string capacity_value = 15;
+         * @return The capacityValue.
+         */
+        @java.lang.Override
+        public java.lang.String getCapacityValue() {
+            java.lang.Object ref = capacityValue_;
+            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();
+                capacityValue_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string capacity_value = 15;
+         * @return The bytes for capacityValue.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getCapacityValueBytes() {
+            java.lang.Object ref = capacityValue_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                capacityValue_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int ROUTE_OBJECTIVE_FUNCTION_FIELD_NUMBER = 16;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object routeObjectiveFunction_ = "";
+
+        /**
+         * string route_objective_function = 16;
+         * @return The routeObjectiveFunction.
+         */
+        @java.lang.Override
+        public java.lang.String getRouteObjectiveFunction() {
+            java.lang.Object ref = routeObjectiveFunction_;
+            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();
+                routeObjectiveFunction_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string route_objective_function = 16;
+         * @return The bytes for routeObjectiveFunction.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getRouteObjectiveFunctionBytes() {
+            java.lang.Object ref = routeObjectiveFunction_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                routeObjectiveFunction_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int URL_FIELD_NUMBER = 17;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object url_ = "";
+
+        /**
+         * string url = 17;
+         * @return The url.
+         */
+        @java.lang.Override
+        public java.lang.String getUrl() {
+            java.lang.Object ref = url_;
+            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();
+                url_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string url = 17;
+         * @return The bytes for url.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getUrlBytes() {
+            java.lang.Object ref = url_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                url_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        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(inputSip_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 1, inputSip_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(outputSip_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 2, outputSip_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(uuid_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 3, uuid_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(bw_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 4, bw_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(tenantUuid_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 5, tenantUuid_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(layerProtocolName_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 6, layerProtocolName_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(layerProtocolQualifier_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 7, layerProtocolQualifier_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(lowerFrequencyMhz_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 8, lowerFrequencyMhz_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(upperFrequencyMhz_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 9, upperFrequencyMhz_);
+            }
+            for (int i = 0; i < linkUuidPath_.size(); i++) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 10, linkUuidPath_.getRaw(i));
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(granularity_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 11, granularity_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(gridType_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 12, gridType_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(direction_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 13, direction_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(capacityUnit_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 14, capacityUnit_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(capacityValue_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 15, capacityValue_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(routeObjectiveFunction_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 16, routeObjectiveFunction_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(url_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 17, url_);
+            }
+            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(inputSip_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, inputSip_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(outputSip_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, outputSip_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(uuid_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, uuid_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(bw_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, bw_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(tenantUuid_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(5, tenantUuid_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(layerProtocolName_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(6, layerProtocolName_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(layerProtocolQualifier_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(7, layerProtocolQualifier_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(lowerFrequencyMhz_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(8, lowerFrequencyMhz_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(upperFrequencyMhz_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(9, upperFrequencyMhz_);
+            }
+            {
+                int dataSize = 0;
+                for (int i = 0; i < linkUuidPath_.size(); i++) {
+                    dataSize += computeStringSizeNoTag(linkUuidPath_.getRaw(i));
+                }
+                size += dataSize;
+                size += 1 * getLinkUuidPathList().size();
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(granularity_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(11, granularity_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(gridType_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(12, gridType_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(direction_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(13, direction_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(capacityUnit_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(14, capacityUnit_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(capacityValue_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(15, capacityValue_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(routeObjectiveFunction_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(16, routeObjectiveFunction_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(url_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(17, url_);
+            }
+            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 tapi_lsp.TapiLsp.TapiLspRuleSet)) {
+                return super.equals(obj);
+            }
+            tapi_lsp.TapiLsp.TapiLspRuleSet other = (tapi_lsp.TapiLsp.TapiLspRuleSet) obj;
+            if (!getInputSip().equals(other.getInputSip()))
+                return false;
+            if (!getOutputSip().equals(other.getOutputSip()))
+                return false;
+            if (!getUuid().equals(other.getUuid()))
+                return false;
+            if (!getBw().equals(other.getBw()))
+                return false;
+            if (!getTenantUuid().equals(other.getTenantUuid()))
+                return false;
+            if (!getLayerProtocolName().equals(other.getLayerProtocolName()))
+                return false;
+            if (!getLayerProtocolQualifier().equals(other.getLayerProtocolQualifier()))
+                return false;
+            if (!getLowerFrequencyMhz().equals(other.getLowerFrequencyMhz()))
+                return false;
+            if (!getUpperFrequencyMhz().equals(other.getUpperFrequencyMhz()))
+                return false;
+            if (!getLinkUuidPathList().equals(other.getLinkUuidPathList()))
+                return false;
+            if (!getGranularity().equals(other.getGranularity()))
+                return false;
+            if (!getGridType().equals(other.getGridType()))
+                return false;
+            if (!getDirection().equals(other.getDirection()))
+                return false;
+            if (!getCapacityUnit().equals(other.getCapacityUnit()))
+                return false;
+            if (!getCapacityValue().equals(other.getCapacityValue()))
+                return false;
+            if (!getRouteObjectiveFunction().equals(other.getRouteObjectiveFunction()))
+                return false;
+            if (!getUrl().equals(other.getUrl()))
+                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) + INPUT_SIP_FIELD_NUMBER;
+            hash = (53 * hash) + getInputSip().hashCode();
+            hash = (37 * hash) + OUTPUT_SIP_FIELD_NUMBER;
+            hash = (53 * hash) + getOutputSip().hashCode();
+            hash = (37 * hash) + UUID_FIELD_NUMBER;
+            hash = (53 * hash) + getUuid().hashCode();
+            hash = (37 * hash) + BW_FIELD_NUMBER;
+            hash = (53 * hash) + getBw().hashCode();
+            hash = (37 * hash) + TENANT_UUID_FIELD_NUMBER;
+            hash = (53 * hash) + getTenantUuid().hashCode();
+            hash = (37 * hash) + LAYER_PROTOCOL_NAME_FIELD_NUMBER;
+            hash = (53 * hash) + getLayerProtocolName().hashCode();
+            hash = (37 * hash) + LAYER_PROTOCOL_QUALIFIER_FIELD_NUMBER;
+            hash = (53 * hash) + getLayerProtocolQualifier().hashCode();
+            hash = (37 * hash) + LOWER_FREQUENCY_MHZ_FIELD_NUMBER;
+            hash = (53 * hash) + getLowerFrequencyMhz().hashCode();
+            hash = (37 * hash) + UPPER_FREQUENCY_MHZ_FIELD_NUMBER;
+            hash = (53 * hash) + getUpperFrequencyMhz().hashCode();
+            if (getLinkUuidPathCount() > 0) {
+                hash = (37 * hash) + LINK_UUID_PATH_FIELD_NUMBER;
+                hash = (53 * hash) + getLinkUuidPathList().hashCode();
+            }
+            hash = (37 * hash) + GRANULARITY_FIELD_NUMBER;
+            hash = (53 * hash) + getGranularity().hashCode();
+            hash = (37 * hash) + GRID_TYPE_FIELD_NUMBER;
+            hash = (53 * hash) + getGridType().hashCode();
+            hash = (37 * hash) + DIRECTION_FIELD_NUMBER;
+            hash = (53 * hash) + getDirection().hashCode();
+            hash = (37 * hash) + CAPACITY_UNIT_FIELD_NUMBER;
+            hash = (53 * hash) + getCapacityUnit().hashCode();
+            hash = (37 * hash) + CAPACITY_VALUE_FIELD_NUMBER;
+            hash = (53 * hash) + getCapacityValue().hashCode();
+            hash = (37 * hash) + ROUTE_OBJECTIVE_FUNCTION_FIELD_NUMBER;
+            hash = (53 * hash) + getRouteObjectiveFunction().hashCode();
+            hash = (37 * hash) + URL_FIELD_NUMBER;
+            hash = (53 * hash) + getUrl().hashCode();
+            hash = (29 * hash) + getUnknownFields().hashCode();
+            memoizedHashCode = hash;
+            return hash;
+        }
+
+        public static tapi_lsp.TapiLsp.TapiLspRuleSet parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static tapi_lsp.TapiLsp.TapiLspRuleSet parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static tapi_lsp.TapiLsp.TapiLspRuleSet parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static tapi_lsp.TapiLsp.TapiLspRuleSet parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static tapi_lsp.TapiLsp.TapiLspRuleSet parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static tapi_lsp.TapiLsp.TapiLspRuleSet parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static tapi_lsp.TapiLsp.TapiLspRuleSet parseFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static tapi_lsp.TapiLsp.TapiLspRuleSet 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 tapi_lsp.TapiLsp.TapiLspRuleSet parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input);
+        }
+
+        public static tapi_lsp.TapiLsp.TapiLspRuleSet 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 tapi_lsp.TapiLsp.TapiLspRuleSet parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static tapi_lsp.TapiLsp.TapiLspRuleSet 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(tapi_lsp.TapiLsp.TapiLspRuleSet 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 tapi_lsp.TapiLspRuleSet}
+         */
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:tapi_lsp.TapiLspRuleSet)
+        tapi_lsp.TapiLsp.TapiLspRuleSetOrBuilder {
+
+            public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+                return tapi_lsp.TapiLsp.internal_static_tapi_lsp_TapiLspRuleSet_descriptor;
+            }
+
+            @java.lang.Override
+            protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+                return tapi_lsp.TapiLsp.internal_static_tapi_lsp_TapiLspRuleSet_fieldAccessorTable.ensureFieldAccessorsInitialized(tapi_lsp.TapiLsp.TapiLspRuleSet.class, tapi_lsp.TapiLsp.TapiLspRuleSet.Builder.class);
+            }
+
+            // Construct using tapi_lsp.TapiLsp.TapiLspRuleSet.newBuilder()
+            private Builder() {
+            }
+
+            private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+                super(parent);
+            }
+
+            @java.lang.Override
+            public Builder clear() {
+                super.clear();
+                bitField0_ = 0;
+                inputSip_ = "";
+                outputSip_ = "";
+                uuid_ = "";
+                bw_ = "";
+                tenantUuid_ = "";
+                layerProtocolName_ = "";
+                layerProtocolQualifier_ = "";
+                lowerFrequencyMhz_ = "";
+                upperFrequencyMhz_ = "";
+                linkUuidPath_ = com.google.protobuf.LazyStringArrayList.emptyList();
+                granularity_ = "";
+                gridType_ = "";
+                direction_ = "";
+                capacityUnit_ = "";
+                capacityValue_ = "";
+                routeObjectiveFunction_ = "";
+                url_ = "";
+                return this;
+            }
+
+            @java.lang.Override
+            public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+                return tapi_lsp.TapiLsp.internal_static_tapi_lsp_TapiLspRuleSet_descriptor;
+            }
+
+            @java.lang.Override
+            public tapi_lsp.TapiLsp.TapiLspRuleSet getDefaultInstanceForType() {
+                return tapi_lsp.TapiLsp.TapiLspRuleSet.getDefaultInstance();
+            }
+
+            @java.lang.Override
+            public tapi_lsp.TapiLsp.TapiLspRuleSet build() {
+                tapi_lsp.TapiLsp.TapiLspRuleSet result = buildPartial();
+                if (!result.isInitialized()) {
+                    throw newUninitializedMessageException(result);
+                }
+                return result;
+            }
+
+            @java.lang.Override
+            public tapi_lsp.TapiLsp.TapiLspRuleSet buildPartial() {
+                tapi_lsp.TapiLsp.TapiLspRuleSet result = new tapi_lsp.TapiLsp.TapiLspRuleSet(this);
+                if (bitField0_ != 0) {
+                    buildPartial0(result);
+                }
+                onBuilt();
+                return result;
+            }
+
+            private void buildPartial0(tapi_lsp.TapiLsp.TapiLspRuleSet result) {
+                int from_bitField0_ = bitField0_;
+                if (((from_bitField0_ & 0x00000001) != 0)) {
+                    result.inputSip_ = inputSip_;
+                }
+                if (((from_bitField0_ & 0x00000002) != 0)) {
+                    result.outputSip_ = outputSip_;
+                }
+                if (((from_bitField0_ & 0x00000004) != 0)) {
+                    result.uuid_ = uuid_;
+                }
+                if (((from_bitField0_ & 0x00000008) != 0)) {
+                    result.bw_ = bw_;
+                }
+                if (((from_bitField0_ & 0x00000010) != 0)) {
+                    result.tenantUuid_ = tenantUuid_;
+                }
+                if (((from_bitField0_ & 0x00000020) != 0)) {
+                    result.layerProtocolName_ = layerProtocolName_;
+                }
+                if (((from_bitField0_ & 0x00000040) != 0)) {
+                    result.layerProtocolQualifier_ = layerProtocolQualifier_;
+                }
+                if (((from_bitField0_ & 0x00000080) != 0)) {
+                    result.lowerFrequencyMhz_ = lowerFrequencyMhz_;
+                }
+                if (((from_bitField0_ & 0x00000100) != 0)) {
+                    result.upperFrequencyMhz_ = upperFrequencyMhz_;
+                }
+                if (((from_bitField0_ & 0x00000200) != 0)) {
+                    linkUuidPath_.makeImmutable();
+                    result.linkUuidPath_ = linkUuidPath_;
+                }
+                if (((from_bitField0_ & 0x00000400) != 0)) {
+                    result.granularity_ = granularity_;
+                }
+                if (((from_bitField0_ & 0x00000800) != 0)) {
+                    result.gridType_ = gridType_;
+                }
+                if (((from_bitField0_ & 0x00001000) != 0)) {
+                    result.direction_ = direction_;
+                }
+                if (((from_bitField0_ & 0x00002000) != 0)) {
+                    result.capacityUnit_ = capacityUnit_;
+                }
+                if (((from_bitField0_ & 0x00004000) != 0)) {
+                    result.capacityValue_ = capacityValue_;
+                }
+                if (((from_bitField0_ & 0x00008000) != 0)) {
+                    result.routeObjectiveFunction_ = routeObjectiveFunction_;
+                }
+                if (((from_bitField0_ & 0x00010000) != 0)) {
+                    result.url_ = url_;
+                }
+            }
+
+            @java.lang.Override
+            public Builder mergeFrom(com.google.protobuf.Message other) {
+                if (other instanceof tapi_lsp.TapiLsp.TapiLspRuleSet) {
+                    return mergeFrom((tapi_lsp.TapiLsp.TapiLspRuleSet) other);
+                } else {
+                    super.mergeFrom(other);
+                    return this;
+                }
+            }
+
+            public Builder mergeFrom(tapi_lsp.TapiLsp.TapiLspRuleSet other) {
+                if (other == tapi_lsp.TapiLsp.TapiLspRuleSet.getDefaultInstance())
+                    return this;
+                if (!other.getInputSip().isEmpty()) {
+                    inputSip_ = other.inputSip_;
+                    bitField0_ |= 0x00000001;
+                    onChanged();
+                }
+                if (!other.getOutputSip().isEmpty()) {
+                    outputSip_ = other.outputSip_;
+                    bitField0_ |= 0x00000002;
+                    onChanged();
+                }
+                if (!other.getUuid().isEmpty()) {
+                    uuid_ = other.uuid_;
+                    bitField0_ |= 0x00000004;
+                    onChanged();
+                }
+                if (!other.getBw().isEmpty()) {
+                    bw_ = other.bw_;
+                    bitField0_ |= 0x00000008;
+                    onChanged();
+                }
+                if (!other.getTenantUuid().isEmpty()) {
+                    tenantUuid_ = other.tenantUuid_;
+                    bitField0_ |= 0x00000010;
+                    onChanged();
+                }
+                if (!other.getLayerProtocolName().isEmpty()) {
+                    layerProtocolName_ = other.layerProtocolName_;
+                    bitField0_ |= 0x00000020;
+                    onChanged();
+                }
+                if (!other.getLayerProtocolQualifier().isEmpty()) {
+                    layerProtocolQualifier_ = other.layerProtocolQualifier_;
+                    bitField0_ |= 0x00000040;
+                    onChanged();
+                }
+                if (!other.getLowerFrequencyMhz().isEmpty()) {
+                    lowerFrequencyMhz_ = other.lowerFrequencyMhz_;
+                    bitField0_ |= 0x00000080;
+                    onChanged();
+                }
+                if (!other.getUpperFrequencyMhz().isEmpty()) {
+                    upperFrequencyMhz_ = other.upperFrequencyMhz_;
+                    bitField0_ |= 0x00000100;
+                    onChanged();
+                }
+                if (!other.linkUuidPath_.isEmpty()) {
+                    if (linkUuidPath_.isEmpty()) {
+                        linkUuidPath_ = other.linkUuidPath_;
+                        bitField0_ |= 0x00000200;
+                    } else {
+                        ensureLinkUuidPathIsMutable();
+                        linkUuidPath_.addAll(other.linkUuidPath_);
+                    }
+                    onChanged();
+                }
+                if (!other.getGranularity().isEmpty()) {
+                    granularity_ = other.granularity_;
+                    bitField0_ |= 0x00000400;
+                    onChanged();
+                }
+                if (!other.getGridType().isEmpty()) {
+                    gridType_ = other.gridType_;
+                    bitField0_ |= 0x00000800;
+                    onChanged();
+                }
+                if (!other.getDirection().isEmpty()) {
+                    direction_ = other.direction_;
+                    bitField0_ |= 0x00001000;
+                    onChanged();
+                }
+                if (!other.getCapacityUnit().isEmpty()) {
+                    capacityUnit_ = other.capacityUnit_;
+                    bitField0_ |= 0x00002000;
+                    onChanged();
+                }
+                if (!other.getCapacityValue().isEmpty()) {
+                    capacityValue_ = other.capacityValue_;
+                    bitField0_ |= 0x00004000;
+                    onChanged();
+                }
+                if (!other.getRouteObjectiveFunction().isEmpty()) {
+                    routeObjectiveFunction_ = other.routeObjectiveFunction_;
+                    bitField0_ |= 0x00008000;
+                    onChanged();
+                }
+                if (!other.getUrl().isEmpty()) {
+                    url_ = other.url_;
+                    bitField0_ |= 0x00010000;
+                    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:
+                                {
+                                    inputSip_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00000001;
+                                    break;
+                                }
+                            // case 10
+                            case 18:
+                                {
+                                    outputSip_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00000002;
+                                    break;
+                                }
+                            // case 18
+                            case 26:
+                                {
+                                    uuid_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00000004;
+                                    break;
+                                }
+                            // case 26
+                            case 34:
+                                {
+                                    bw_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00000008;
+                                    break;
+                                }
+                            // case 34
+                            case 42:
+                                {
+                                    tenantUuid_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00000010;
+                                    break;
+                                }
+                            // case 42
+                            case 50:
+                                {
+                                    layerProtocolName_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00000020;
+                                    break;
+                                }
+                            // case 50
+                            case 58:
+                                {
+                                    layerProtocolQualifier_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00000040;
+                                    break;
+                                }
+                            // case 58
+                            case 66:
+                                {
+                                    lowerFrequencyMhz_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00000080;
+                                    break;
+                                }
+                            // case 66
+                            case 74:
+                                {
+                                    upperFrequencyMhz_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00000100;
+                                    break;
+                                }
+                            // case 74
+                            case 82:
+                                {
+                                    java.lang.String s = input.readStringRequireUtf8();
+                                    ensureLinkUuidPathIsMutable();
+                                    linkUuidPath_.add(s);
+                                    break;
+                                }
+                            // case 82
+                            case 90:
+                                {
+                                    granularity_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00000400;
+                                    break;
+                                }
+                            // case 90
+                            case 98:
+                                {
+                                    gridType_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00000800;
+                                    break;
+                                }
+                            // case 98
+                            case 106:
+                                {
+                                    direction_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00001000;
+                                    break;
+                                }
+                            // case 106
+                            case 114:
+                                {
+                                    capacityUnit_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00002000;
+                                    break;
+                                }
+                            // case 114
+                            case 122:
+                                {
+                                    capacityValue_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00004000;
+                                    break;
+                                }
+                            // case 122
+                            case 130:
+                                {
+                                    routeObjectiveFunction_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00008000;
+                                    break;
+                                }
+                            // case 130
+                            case 138:
+                                {
+                                    url_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00010000;
+                                    break;
+                                }
+                            // case 138
+                            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 inputSip_ = "";
+
+            /**
+             * string input_sip = 1;
+             * @return The inputSip.
+             */
+            public java.lang.String getInputSip() {
+                java.lang.Object ref = inputSip_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    inputSip_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string input_sip = 1;
+             * @return The bytes for inputSip.
+             */
+            public com.google.protobuf.ByteString getInputSipBytes() {
+                java.lang.Object ref = inputSip_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    inputSip_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string input_sip = 1;
+             * @param value The inputSip to set.
+             * @return This builder for chaining.
+             */
+            public Builder setInputSip(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                inputSip_ = value;
+                bitField0_ |= 0x00000001;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string input_sip = 1;
+             * @return This builder for chaining.
+             */
+            public Builder clearInputSip() {
+                inputSip_ = getDefaultInstance().getInputSip();
+                bitField0_ = (bitField0_ & ~0x00000001);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string input_sip = 1;
+             * @param value The bytes for inputSip to set.
+             * @return This builder for chaining.
+             */
+            public Builder setInputSipBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                inputSip_ = value;
+                bitField0_ |= 0x00000001;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object outputSip_ = "";
+
+            /**
+             * string output_sip = 2;
+             * @return The outputSip.
+             */
+            public java.lang.String getOutputSip() {
+                java.lang.Object ref = outputSip_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    outputSip_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string output_sip = 2;
+             * @return The bytes for outputSip.
+             */
+            public com.google.protobuf.ByteString getOutputSipBytes() {
+                java.lang.Object ref = outputSip_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    outputSip_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string output_sip = 2;
+             * @param value The outputSip to set.
+             * @return This builder for chaining.
+             */
+            public Builder setOutputSip(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                outputSip_ = value;
+                bitField0_ |= 0x00000002;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string output_sip = 2;
+             * @return This builder for chaining.
+             */
+            public Builder clearOutputSip() {
+                outputSip_ = getDefaultInstance().getOutputSip();
+                bitField0_ = (bitField0_ & ~0x00000002);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string output_sip = 2;
+             * @param value The bytes for outputSip to set.
+             * @return This builder for chaining.
+             */
+            public Builder setOutputSipBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                outputSip_ = value;
+                bitField0_ |= 0x00000002;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object uuid_ = "";
+
+            /**
+             * string uuid = 3;
+             * @return The uuid.
+             */
+            public java.lang.String getUuid() {
+                java.lang.Object ref = uuid_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    uuid_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string uuid = 3;
+             * @return The bytes for uuid.
+             */
+            public com.google.protobuf.ByteString getUuidBytes() {
+                java.lang.Object ref = uuid_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    uuid_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string uuid = 3;
+             * @param value The uuid to set.
+             * @return This builder for chaining.
+             */
+            public Builder setUuid(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                uuid_ = value;
+                bitField0_ |= 0x00000004;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string uuid = 3;
+             * @return This builder for chaining.
+             */
+            public Builder clearUuid() {
+                uuid_ = getDefaultInstance().getUuid();
+                bitField0_ = (bitField0_ & ~0x00000004);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string uuid = 3;
+             * @param value The bytes for uuid to set.
+             * @return This builder for chaining.
+             */
+            public Builder setUuidBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                uuid_ = value;
+                bitField0_ |= 0x00000004;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object bw_ = "";
+
+            /**
+             * string bw = 4;
+             * @return The bw.
+             */
+            public java.lang.String getBw() {
+                java.lang.Object ref = bw_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    bw_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string bw = 4;
+             * @return The bytes for bw.
+             */
+            public com.google.protobuf.ByteString getBwBytes() {
+                java.lang.Object ref = bw_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    bw_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string bw = 4;
+             * @param value The bw to set.
+             * @return This builder for chaining.
+             */
+            public Builder setBw(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                bw_ = value;
+                bitField0_ |= 0x00000008;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string bw = 4;
+             * @return This builder for chaining.
+             */
+            public Builder clearBw() {
+                bw_ = getDefaultInstance().getBw();
+                bitField0_ = (bitField0_ & ~0x00000008);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string bw = 4;
+             * @param value The bytes for bw to set.
+             * @return This builder for chaining.
+             */
+            public Builder setBwBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                bw_ = value;
+                bitField0_ |= 0x00000008;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object tenantUuid_ = "";
+
+            /**
+             * string tenant_uuid = 5;
+             * @return The tenantUuid.
+             */
+            public java.lang.String getTenantUuid() {
+                java.lang.Object ref = tenantUuid_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    tenantUuid_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string tenant_uuid = 5;
+             * @return The bytes for tenantUuid.
+             */
+            public com.google.protobuf.ByteString getTenantUuidBytes() {
+                java.lang.Object ref = tenantUuid_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    tenantUuid_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string tenant_uuid = 5;
+             * @param value The tenantUuid to set.
+             * @return This builder for chaining.
+             */
+            public Builder setTenantUuid(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                tenantUuid_ = value;
+                bitField0_ |= 0x00000010;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string tenant_uuid = 5;
+             * @return This builder for chaining.
+             */
+            public Builder clearTenantUuid() {
+                tenantUuid_ = getDefaultInstance().getTenantUuid();
+                bitField0_ = (bitField0_ & ~0x00000010);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string tenant_uuid = 5;
+             * @param value The bytes for tenantUuid to set.
+             * @return This builder for chaining.
+             */
+            public Builder setTenantUuidBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                tenantUuid_ = value;
+                bitField0_ |= 0x00000010;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object layerProtocolName_ = "";
+
+            /**
+             * string layer_protocol_name = 6;
+             * @return The layerProtocolName.
+             */
+            public java.lang.String getLayerProtocolName() {
+                java.lang.Object ref = layerProtocolName_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    layerProtocolName_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string layer_protocol_name = 6;
+             * @return The bytes for layerProtocolName.
+             */
+            public com.google.protobuf.ByteString getLayerProtocolNameBytes() {
+                java.lang.Object ref = layerProtocolName_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    layerProtocolName_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string layer_protocol_name = 6;
+             * @param value The layerProtocolName to set.
+             * @return This builder for chaining.
+             */
+            public Builder setLayerProtocolName(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                layerProtocolName_ = value;
+                bitField0_ |= 0x00000020;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string layer_protocol_name = 6;
+             * @return This builder for chaining.
+             */
+            public Builder clearLayerProtocolName() {
+                layerProtocolName_ = getDefaultInstance().getLayerProtocolName();
+                bitField0_ = (bitField0_ & ~0x00000020);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string layer_protocol_name = 6;
+             * @param value The bytes for layerProtocolName to set.
+             * @return This builder for chaining.
+             */
+            public Builder setLayerProtocolNameBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                layerProtocolName_ = value;
+                bitField0_ |= 0x00000020;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object layerProtocolQualifier_ = "";
+
+            /**
+             * string layer_protocol_qualifier = 7;
+             * @return The layerProtocolQualifier.
+             */
+            public java.lang.String getLayerProtocolQualifier() {
+                java.lang.Object ref = layerProtocolQualifier_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    layerProtocolQualifier_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string layer_protocol_qualifier = 7;
+             * @return The bytes for layerProtocolQualifier.
+             */
+            public com.google.protobuf.ByteString getLayerProtocolQualifierBytes() {
+                java.lang.Object ref = layerProtocolQualifier_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    layerProtocolQualifier_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string layer_protocol_qualifier = 7;
+             * @param value The layerProtocolQualifier to set.
+             * @return This builder for chaining.
+             */
+            public Builder setLayerProtocolQualifier(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                layerProtocolQualifier_ = value;
+                bitField0_ |= 0x00000040;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string layer_protocol_qualifier = 7;
+             * @return This builder for chaining.
+             */
+            public Builder clearLayerProtocolQualifier() {
+                layerProtocolQualifier_ = getDefaultInstance().getLayerProtocolQualifier();
+                bitField0_ = (bitField0_ & ~0x00000040);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string layer_protocol_qualifier = 7;
+             * @param value The bytes for layerProtocolQualifier to set.
+             * @return This builder for chaining.
+             */
+            public Builder setLayerProtocolQualifierBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                layerProtocolQualifier_ = value;
+                bitField0_ |= 0x00000040;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object lowerFrequencyMhz_ = "";
+
+            /**
+             * string lower_frequency_mhz = 8;
+             * @return The lowerFrequencyMhz.
+             */
+            public java.lang.String getLowerFrequencyMhz() {
+                java.lang.Object ref = lowerFrequencyMhz_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    lowerFrequencyMhz_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string lower_frequency_mhz = 8;
+             * @return The bytes for lowerFrequencyMhz.
+             */
+            public com.google.protobuf.ByteString getLowerFrequencyMhzBytes() {
+                java.lang.Object ref = lowerFrequencyMhz_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    lowerFrequencyMhz_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string lower_frequency_mhz = 8;
+             * @param value The lowerFrequencyMhz to set.
+             * @return This builder for chaining.
+             */
+            public Builder setLowerFrequencyMhz(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                lowerFrequencyMhz_ = value;
+                bitField0_ |= 0x00000080;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string lower_frequency_mhz = 8;
+             * @return This builder for chaining.
+             */
+            public Builder clearLowerFrequencyMhz() {
+                lowerFrequencyMhz_ = getDefaultInstance().getLowerFrequencyMhz();
+                bitField0_ = (bitField0_ & ~0x00000080);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string lower_frequency_mhz = 8;
+             * @param value The bytes for lowerFrequencyMhz to set.
+             * @return This builder for chaining.
+             */
+            public Builder setLowerFrequencyMhzBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                lowerFrequencyMhz_ = value;
+                bitField0_ |= 0x00000080;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object upperFrequencyMhz_ = "";
+
+            /**
+             * string upper_frequency_mhz = 9;
+             * @return The upperFrequencyMhz.
+             */
+            public java.lang.String getUpperFrequencyMhz() {
+                java.lang.Object ref = upperFrequencyMhz_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    upperFrequencyMhz_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string upper_frequency_mhz = 9;
+             * @return The bytes for upperFrequencyMhz.
+             */
+            public com.google.protobuf.ByteString getUpperFrequencyMhzBytes() {
+                java.lang.Object ref = upperFrequencyMhz_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    upperFrequencyMhz_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string upper_frequency_mhz = 9;
+             * @param value The upperFrequencyMhz to set.
+             * @return This builder for chaining.
+             */
+            public Builder setUpperFrequencyMhz(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                upperFrequencyMhz_ = value;
+                bitField0_ |= 0x00000100;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string upper_frequency_mhz = 9;
+             * @return This builder for chaining.
+             */
+            public Builder clearUpperFrequencyMhz() {
+                upperFrequencyMhz_ = getDefaultInstance().getUpperFrequencyMhz();
+                bitField0_ = (bitField0_ & ~0x00000100);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string upper_frequency_mhz = 9;
+             * @param value The bytes for upperFrequencyMhz to set.
+             * @return This builder for chaining.
+             */
+            public Builder setUpperFrequencyMhzBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                upperFrequencyMhz_ = value;
+                bitField0_ |= 0x00000100;
+                onChanged();
+                return this;
+            }
+
+            private com.google.protobuf.LazyStringArrayList linkUuidPath_ = com.google.protobuf.LazyStringArrayList.emptyList();
+
+            private void ensureLinkUuidPathIsMutable() {
+                if (!linkUuidPath_.isModifiable()) {
+                    linkUuidPath_ = new com.google.protobuf.LazyStringArrayList(linkUuidPath_);
+                }
+                bitField0_ |= 0x00000200;
+            }
+
+            /**
+             * repeated string link_uuid_path = 10;
+             * @return A list containing the linkUuidPath.
+             */
+            public com.google.protobuf.ProtocolStringList getLinkUuidPathList() {
+                linkUuidPath_.makeImmutable();
+                return linkUuidPath_;
+            }
+
+            /**
+             * repeated string link_uuid_path = 10;
+             * @return The count of linkUuidPath.
+             */
+            public int getLinkUuidPathCount() {
+                return linkUuidPath_.size();
+            }
+
+            /**
+             * repeated string link_uuid_path = 10;
+             * @param index The index of the element to return.
+             * @return The linkUuidPath at the given index.
+             */
+            public java.lang.String getLinkUuidPath(int index) {
+                return linkUuidPath_.get(index);
+            }
+
+            /**
+             * repeated string link_uuid_path = 10;
+             * @param index The index of the value to return.
+             * @return The bytes of the linkUuidPath at the given index.
+             */
+            public com.google.protobuf.ByteString getLinkUuidPathBytes(int index) {
+                return linkUuidPath_.getByteString(index);
+            }
+
+            /**
+             * repeated string link_uuid_path = 10;
+             * @param index The index to set the value at.
+             * @param value The linkUuidPath to set.
+             * @return This builder for chaining.
+             */
+            public Builder setLinkUuidPath(int index, java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                ensureLinkUuidPathIsMutable();
+                linkUuidPath_.set(index, value);
+                bitField0_ |= 0x00000200;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * repeated string link_uuid_path = 10;
+             * @param value The linkUuidPath to add.
+             * @return This builder for chaining.
+             */
+            public Builder addLinkUuidPath(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                ensureLinkUuidPathIsMutable();
+                linkUuidPath_.add(value);
+                bitField0_ |= 0x00000200;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * repeated string link_uuid_path = 10;
+             * @param values The linkUuidPath to add.
+             * @return This builder for chaining.
+             */
+            public Builder addAllLinkUuidPath(java.lang.Iterable values) {
+                ensureLinkUuidPathIsMutable();
+                com.google.protobuf.AbstractMessageLite.Builder.addAll(values, linkUuidPath_);
+                bitField0_ |= 0x00000200;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * repeated string link_uuid_path = 10;
+             * @return This builder for chaining.
+             */
+            public Builder clearLinkUuidPath() {
+                linkUuidPath_ = com.google.protobuf.LazyStringArrayList.emptyList();
+                bitField0_ = (bitField0_ & ~0x00000200);
+                ;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * repeated string link_uuid_path = 10;
+             * @param value The bytes of the linkUuidPath to add.
+             * @return This builder for chaining.
+             */
+            public Builder addLinkUuidPathBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                ensureLinkUuidPathIsMutable();
+                linkUuidPath_.add(value);
+                bitField0_ |= 0x00000200;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object granularity_ = "";
+
+            /**
+             * string granularity = 11;
+             * @return The granularity.
+             */
+            public java.lang.String getGranularity() {
+                java.lang.Object ref = granularity_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    granularity_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string granularity = 11;
+             * @return The bytes for granularity.
+             */
+            public com.google.protobuf.ByteString getGranularityBytes() {
+                java.lang.Object ref = granularity_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    granularity_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string granularity = 11;
+             * @param value The granularity to set.
+             * @return This builder for chaining.
+             */
+            public Builder setGranularity(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                granularity_ = value;
+                bitField0_ |= 0x00000400;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string granularity = 11;
+             * @return This builder for chaining.
+             */
+            public Builder clearGranularity() {
+                granularity_ = getDefaultInstance().getGranularity();
+                bitField0_ = (bitField0_ & ~0x00000400);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string granularity = 11;
+             * @param value The bytes for granularity to set.
+             * @return This builder for chaining.
+             */
+            public Builder setGranularityBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                granularity_ = value;
+                bitField0_ |= 0x00000400;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object gridType_ = "";
+
+            /**
+             * string grid_type = 12;
+             * @return The gridType.
+             */
+            public java.lang.String getGridType() {
+                java.lang.Object ref = gridType_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    gridType_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string grid_type = 12;
+             * @return The bytes for gridType.
+             */
+            public com.google.protobuf.ByteString getGridTypeBytes() {
+                java.lang.Object ref = gridType_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    gridType_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string grid_type = 12;
+             * @param value The gridType to set.
+             * @return This builder for chaining.
+             */
+            public Builder setGridType(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                gridType_ = value;
+                bitField0_ |= 0x00000800;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string grid_type = 12;
+             * @return This builder for chaining.
+             */
+            public Builder clearGridType() {
+                gridType_ = getDefaultInstance().getGridType();
+                bitField0_ = (bitField0_ & ~0x00000800);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string grid_type = 12;
+             * @param value The bytes for gridType to set.
+             * @return This builder for chaining.
+             */
+            public Builder setGridTypeBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                gridType_ = value;
+                bitField0_ |= 0x00000800;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object direction_ = "";
+
+            /**
+             * string direction = 13;
+             * @return The direction.
+             */
+            public java.lang.String getDirection() {
+                java.lang.Object ref = direction_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    direction_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string direction = 13;
+             * @return The bytes for direction.
+             */
+            public com.google.protobuf.ByteString getDirectionBytes() {
+                java.lang.Object ref = direction_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    direction_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string direction = 13;
+             * @param value The direction to set.
+             * @return This builder for chaining.
+             */
+            public Builder setDirection(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                direction_ = value;
+                bitField0_ |= 0x00001000;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string direction = 13;
+             * @return This builder for chaining.
+             */
+            public Builder clearDirection() {
+                direction_ = getDefaultInstance().getDirection();
+                bitField0_ = (bitField0_ & ~0x00001000);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string direction = 13;
+             * @param value The bytes for direction to set.
+             * @return This builder for chaining.
+             */
+            public Builder setDirectionBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                direction_ = value;
+                bitField0_ |= 0x00001000;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object capacityUnit_ = "";
+
+            /**
+             * string capacity_unit = 14;
+             * @return The capacityUnit.
+             */
+            public java.lang.String getCapacityUnit() {
+                java.lang.Object ref = capacityUnit_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    capacityUnit_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string capacity_unit = 14;
+             * @return The bytes for capacityUnit.
+             */
+            public com.google.protobuf.ByteString getCapacityUnitBytes() {
+                java.lang.Object ref = capacityUnit_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    capacityUnit_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string capacity_unit = 14;
+             * @param value The capacityUnit to set.
+             * @return This builder for chaining.
+             */
+            public Builder setCapacityUnit(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                capacityUnit_ = value;
+                bitField0_ |= 0x00002000;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string capacity_unit = 14;
+             * @return This builder for chaining.
+             */
+            public Builder clearCapacityUnit() {
+                capacityUnit_ = getDefaultInstance().getCapacityUnit();
+                bitField0_ = (bitField0_ & ~0x00002000);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string capacity_unit = 14;
+             * @param value The bytes for capacityUnit to set.
+             * @return This builder for chaining.
+             */
+            public Builder setCapacityUnitBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                capacityUnit_ = value;
+                bitField0_ |= 0x00002000;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object capacityValue_ = "";
+
+            /**
+             * string capacity_value = 15;
+             * @return The capacityValue.
+             */
+            public java.lang.String getCapacityValue() {
+                java.lang.Object ref = capacityValue_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    capacityValue_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string capacity_value = 15;
+             * @return The bytes for capacityValue.
+             */
+            public com.google.protobuf.ByteString getCapacityValueBytes() {
+                java.lang.Object ref = capacityValue_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    capacityValue_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string capacity_value = 15;
+             * @param value The capacityValue to set.
+             * @return This builder for chaining.
+             */
+            public Builder setCapacityValue(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                capacityValue_ = value;
+                bitField0_ |= 0x00004000;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string capacity_value = 15;
+             * @return This builder for chaining.
+             */
+            public Builder clearCapacityValue() {
+                capacityValue_ = getDefaultInstance().getCapacityValue();
+                bitField0_ = (bitField0_ & ~0x00004000);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string capacity_value = 15;
+             * @param value The bytes for capacityValue to set.
+             * @return This builder for chaining.
+             */
+            public Builder setCapacityValueBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                capacityValue_ = value;
+                bitField0_ |= 0x00004000;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object routeObjectiveFunction_ = "";
+
+            /**
+             * string route_objective_function = 16;
+             * @return The routeObjectiveFunction.
+             */
+            public java.lang.String getRouteObjectiveFunction() {
+                java.lang.Object ref = routeObjectiveFunction_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    routeObjectiveFunction_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string route_objective_function = 16;
+             * @return The bytes for routeObjectiveFunction.
+             */
+            public com.google.protobuf.ByteString getRouteObjectiveFunctionBytes() {
+                java.lang.Object ref = routeObjectiveFunction_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    routeObjectiveFunction_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string route_objective_function = 16;
+             * @param value The routeObjectiveFunction to set.
+             * @return This builder for chaining.
+             */
+            public Builder setRouteObjectiveFunction(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                routeObjectiveFunction_ = value;
+                bitField0_ |= 0x00008000;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string route_objective_function = 16;
+             * @return This builder for chaining.
+             */
+            public Builder clearRouteObjectiveFunction() {
+                routeObjectiveFunction_ = getDefaultInstance().getRouteObjectiveFunction();
+                bitField0_ = (bitField0_ & ~0x00008000);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string route_objective_function = 16;
+             * @param value The bytes for routeObjectiveFunction to set.
+             * @return This builder for chaining.
+             */
+            public Builder setRouteObjectiveFunctionBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                routeObjectiveFunction_ = value;
+                bitField0_ |= 0x00008000;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object url_ = "";
+
+            /**
+             * string url = 17;
+             * @return The url.
+             */
+            public java.lang.String getUrl() {
+                java.lang.Object ref = url_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    url_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string url = 17;
+             * @return The bytes for url.
+             */
+            public com.google.protobuf.ByteString getUrlBytes() {
+                java.lang.Object ref = url_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    url_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string url = 17;
+             * @param value The url to set.
+             * @return This builder for chaining.
+             */
+            public Builder setUrl(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                url_ = value;
+                bitField0_ |= 0x00010000;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string url = 17;
+             * @return This builder for chaining.
+             */
+            public Builder clearUrl() {
+                url_ = getDefaultInstance().getUrl();
+                bitField0_ = (bitField0_ & ~0x00010000);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string url = 17;
+             * @param value The bytes for url to set.
+             * @return This builder for chaining.
+             */
+            public Builder setUrlBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                url_ = value;
+                bitField0_ |= 0x00010000;
+                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:tapi_lsp.TapiLspRuleSet)
+        }
+
+        // @@protoc_insertion_point(class_scope:tapi_lsp.TapiLspRuleSet)
+        private static final tapi_lsp.TapiLsp.TapiLspRuleSet DEFAULT_INSTANCE;
+
+        static {
+            DEFAULT_INSTANCE = new tapi_lsp.TapiLsp.TapiLspRuleSet();
+        }
+
+        public static tapi_lsp.TapiLsp.TapiLspRuleSet getDefaultInstance() {
+            return DEFAULT_INSTANCE;
+        }
+
+        private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+
+            @java.lang.Override
+            public TapiLspRuleSet parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+                Builder builder = newBuilder();
+                try {
+                    builder.mergeFrom(input, extensionRegistry);
+                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    throw e.setUnfinishedMessage(builder.buildPartial());
+                } catch (com.google.protobuf.UninitializedMessageException e) {
+                    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 tapi_lsp.TapiLsp.TapiLspRuleSet getDefaultInstanceForType() {
+            return DEFAULT_INSTANCE;
+        }
+    }
+
+    private static final com.google.protobuf.Descriptors.Descriptor internal_static_tapi_lsp_TapiLspRuleSet_descriptor;
+
+    private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_tapi_lsp_TapiLspRuleSet_fieldAccessorTable;
+
+    public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() {
+        return descriptor;
+    }
+
+    private static com.google.protobuf.Descriptors.FileDescriptor descriptor;
+
+    static {
+        java.lang.String[] descriptorData = { "\n\016tapi_lsp.proto\022\010tapi_lsp\"\220\003\n\016TapiLspRu" + "leSet\022\021\n\tinput_sip\030\001 \001(\t\022\022\n\noutput_sip\030\002" + " \001(\t\022\014\n\004uuid\030\003 \001(\t\022\n\n\002bw\030\004 \001(\t\022\023\n\013tenant" + "_uuid\030\005 \001(\t\022\033\n\023layer_protocol_name\030\006 \001(\t" + "\022 \n\030layer_protocol_qualifier\030\007 \001(\t\022\033\n\023lo" + "wer_frequency_mhz\030\010 \001(\t\022\033\n\023upper_frequen" + "cy_mhz\030\t \001(\t\022\026\n\016link_uuid_path\030\n \003(\t\022\023\n\013" + "granularity\030\013 \001(\t\022\021\n\tgrid_type\030\014 \001(\t\022\021\n\t" + "direction\030\r \001(\t\022\025\n\rcapacity_unit\030\016 \001(\t\022\026" + "\n\016capacity_value\030\017 \001(\t\022 \n\030route_objectiv" + "e_function\030\020 \001(\t\022\013\n\003url\030\021 \001(\tb\006proto3" };
+        descriptor = com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] {});
+        internal_static_tapi_lsp_TapiLspRuleSet_descriptor = getDescriptor().getMessageTypes().get(0);
+        internal_static_tapi_lsp_TapiLspRuleSet_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_tapi_lsp_TapiLspRuleSet_descriptor, new java.lang.String[] { "InputSip", "OutputSip", "Uuid", "Bw", "TenantUuid", "LayerProtocolName", "LayerProtocolQualifier", "LowerFrequencyMhz", "UpperFrequencyMhz", "LinkUuidPath", "Granularity", "GridType", "Direction", "CapacityUnit", "CapacityValue", "RouteObjectiveFunction", "Url" });
+    }
+    // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/src/policy/target/kubernetes/kubernetes.yml b/src/policy/target/kubernetes/kubernetes.yml
index 8a7aeca63..4b675c774 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: 905a409221c21205aba667ad34f7610681bd09c1
-    app.quarkus.io/build-timestamp: 2025-10-22 - 13:43:53 +0000
+    app.quarkus.io/commit-id: f6ca78538c88e1affff6dd8908e6f14379f5d9ac
+    app.quarkus.io/build-timestamp: 2025-10-27 - 16:25:07 +0000
     prometheus.io/scrape: "true"
     prometheus.io/path: /q/metrics
     prometheus.io/port: "8080"
@@ -17,18 +17,18 @@ metadata:
   name: policyservice
 spec:
   ports:
-    - name: https
-      port: 443
+    - name: grpc
+      port: 6060
       protocol: TCP
-      targetPort: 8443
+      targetPort: 6060
     - name: http
       port: 9192
       protocol: TCP
       targetPort: 8080
-    - name: grpc
-      port: 6060
+    - name: https
+      port: 443
       protocol: TCP
-      targetPort: 6060
+      targetPort: 8443
   selector:
     app.kubernetes.io/name: policyservice
   type: ClusterIP
@@ -37,8 +37,8 @@ apiVersion: apps/v1
 kind: Deployment
 metadata:
   annotations:
-    app.quarkus.io/commit-id: 905a409221c21205aba667ad34f7610681bd09c1
-    app.quarkus.io/build-timestamp: 2025-10-22 - 13:43:53 +0000
+    app.quarkus.io/commit-id: f6ca78538c88e1affff6dd8908e6f14379f5d9ac
+    app.quarkus.io/build-timestamp: 2025-10-27 - 16:25:07 +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: 905a409221c21205aba667ad34f7610681bd09c1
-        app.quarkus.io/build-timestamp: 2025-10-22 - 13:43:53 +0000
+        app.quarkus.io/commit-id: f6ca78538c88e1affff6dd8908e6f14379f5d9ac
+        app.quarkus.io/build-timestamp: 2025-10-27 - 16:25:07 +0000
         prometheus.io/scrape: "true"
         prometheus.io/path: /q/metrics
         prometheus.io/port: "8080"
@@ -75,14 +75,14 @@ spec:
               valueFrom:
                 fieldRef:
                   fieldPath: metadata.namespace
+            - name: MONITORING_SERVICE_HOST
+              value: monitoringservice
             - name: SERVICE_SERVICE_HOST
               value: serviceservice
-            - name: CONTEXT_SERVICE_HOST
-              value: contextservice
             - name: KAFKA_BROKER_HOST
               value: kafka-service.kafka.svc.cluster.local
-            - 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:
@@ -97,14 +97,14 @@ spec:
             timeoutSeconds: 10
           name: policyservice
           ports:
-            - containerPort: 8443
-              name: https
+            - containerPort: 6060
+              name: grpc
               protocol: TCP
             - containerPort: 8080
               name: http
               protocol: TCP
-            - containerPort: 6060
-              name: grpc
+            - containerPort: 8443
+              name: https
               protocol: TCP
           readinessProbe:
             failureThreshold: 3
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 f2f5a614b..27187f254 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
@@ -27,5 +27,15 @@ public enum DeviceDriverEnum {
     IETF_L2VPN,
     GNMI_OPENCONFIG,
     OPTICAL_TFS,
-    IETF_ACTN
+    IETF_ACTN,
+    OC,
+    QKD,
+    IETF_L3VPN,
+    IETF_SLICE,
+    NCE,
+    SMARTNIC,
+    MORPHEUS,
+    RYU,
+    GNMI_NOKIA_SRLINUX,
+    OPENROADM
 }
diff --git a/src/ztp/src/main/proto/ipowdm.proto b/src/ztp/src/main/proto/ipowdm.proto
new file mode 120000
index 000000000..80f42cbd0
--- /dev/null
+++ b/src/ztp/src/main/proto/ipowdm.proto
@@ -0,0 +1 @@
+../../../../../proto/ipowdm.proto
\ No newline at end of file
diff --git a/src/ztp/src/main/proto/tapi_lsp.proto b/src/ztp/src/main/proto/tapi_lsp.proto
new file mode 120000
index 000000000..ff9990db2
--- /dev/null
+++ b/src/ztp/src/main/proto/tapi_lsp.proto
@@ -0,0 +1 @@
+../../../../../proto/tapi_lsp.proto
\ No newline at end of file
diff --git a/src/ztp/target/generated-sources/grpc/context/ContextOuterClass.java b/src/ztp/target/generated-sources/grpc/context/ContextOuterClass.java
index ceec864c6..20a9d9e7a 100644
--- a/src/ztp/target/generated-sources/grpc/context/ContextOuterClass.java
+++ b/src/ztp/target/generated-sources/grpc/context/ContextOuterClass.java
@@ -788,6 +788,14 @@ public final class ContextOuterClass {
          * SERVICETYPE_IP_LINK = 11;
          */
         SERVICETYPE_IP_LINK(11),
+        /**
+         * SERVICETYPE_TAPI_LSP = 12;
+         */
+        SERVICETYPE_TAPI_LSP(12),
+        /**
+         * SERVICETYPE_IPOWDM = 13;
+         */
+        SERVICETYPE_IPOWDM(13),
         UNRECOGNIZED(-1);
 
         /**
@@ -850,6 +858,16 @@ public final class ContextOuterClass {
          */
         public static final int SERVICETYPE_IP_LINK_VALUE = 11;
 
+        /**
+         * SERVICETYPE_TAPI_LSP = 12;
+         */
+        public static final int SERVICETYPE_TAPI_LSP_VALUE = 12;
+
+        /**
+         * SERVICETYPE_IPOWDM = 13;
+         */
+        public static final int SERVICETYPE_IPOWDM_VALUE = 13;
+
         public final int getNumber() {
             if (this == UNRECOGNIZED) {
                 throw new java.lang.IllegalArgumentException("Can't get the number of an unknown enum value.");
@@ -897,6 +915,10 @@ public final class ContextOuterClass {
                     return SERVICETYPE_ACL;
                 case 11:
                     return SERVICETYPE_IP_LINK;
+                case 12:
+                    return SERVICETYPE_TAPI_LSP;
+                case 13:
+                    return SERVICETYPE_IPOWDM;
                 default:
                     return null;
             }
@@ -60473,6 +60495,1659 @@ public final class ContextOuterClass {
         }
     }
 
+    public interface ConfigRule_IPOWDMOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConfigRule_IPOWDM)
+    com.google.protobuf.MessageOrBuilder {
+
+        /**
+         * .context.EndPointId endpoint_id = 1;
+         * @return Whether the endpointId field is set.
+         */
+        boolean hasEndpointId();
+
+        /**
+         * .context.EndPointId endpoint_id = 1;
+         * @return The endpointId.
+         */
+        context.ContextOuterClass.EndPointId getEndpointId();
+
+        /**
+         * .context.EndPointId endpoint_id = 1;
+         */
+        context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder();
+
+        /**
+         * .ipowdm.IpowdmRuleSet rule_set = 2;
+         * @return Whether the ruleSet field is set.
+         */
+        boolean hasRuleSet();
+
+        /**
+         * .ipowdm.IpowdmRuleSet rule_set = 2;
+         * @return The ruleSet.
+         */
+        ipowdm.Ipowdm.IpowdmRuleSet getRuleSet();
+
+        /**
+         * .ipowdm.IpowdmRuleSet rule_set = 2;
+         */
+        ipowdm.Ipowdm.IpowdmRuleSetOrBuilder getRuleSetOrBuilder();
+    }
+
+    /**
+     * Protobuf type {@code context.ConfigRule_IPOWDM}
+     */
+    public static final class ConfigRule_IPOWDM extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConfigRule_IPOWDM)
+    ConfigRule_IPOWDMOrBuilder {
+
+        private static final long serialVersionUID = 0L;
+
+        // Use ConfigRule_IPOWDM.newBuilder() to construct.
+        private ConfigRule_IPOWDM(com.google.protobuf.GeneratedMessageV3.Builder builder) {
+            super(builder);
+        }
+
+        private ConfigRule_IPOWDM() {
+        }
+
+        @java.lang.Override
+        @SuppressWarnings({ "unused" })
+        protected java.lang.Object newInstance(UnusedPrivateParameter unused) {
+            return new ConfigRule_IPOWDM();
+        }
+
+        public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+            return context.ContextOuterClass.internal_static_context_ConfigRule_IPOWDM_descriptor;
+        }
+
+        @java.lang.Override
+        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+            return context.ContextOuterClass.internal_static_context_ConfigRule_IPOWDM_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.ConfigRule_IPOWDM.class, context.ContextOuterClass.ConfigRule_IPOWDM.Builder.class);
+        }
+
+        public static final int ENDPOINT_ID_FIELD_NUMBER = 1;
+
+        private context.ContextOuterClass.EndPointId endpointId_;
+
+        /**
+         * .context.EndPointId endpoint_id = 1;
+         * @return Whether the endpointId field is set.
+         */
+        @java.lang.Override
+        public boolean hasEndpointId() {
+            return endpointId_ != null;
+        }
+
+        /**
+         * .context.EndPointId endpoint_id = 1;
+         * @return The endpointId.
+         */
+        @java.lang.Override
+        public context.ContextOuterClass.EndPointId getEndpointId() {
+            return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
+        }
+
+        /**
+         * .context.EndPointId endpoint_id = 1;
+         */
+        @java.lang.Override
+        public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
+            return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
+        }
+
+        public static final int RULE_SET_FIELD_NUMBER = 2;
+
+        private ipowdm.Ipowdm.IpowdmRuleSet ruleSet_;
+
+        /**
+         * .ipowdm.IpowdmRuleSet rule_set = 2;
+         * @return Whether the ruleSet field is set.
+         */
+        @java.lang.Override
+        public boolean hasRuleSet() {
+            return ruleSet_ != null;
+        }
+
+        /**
+         * .ipowdm.IpowdmRuleSet rule_set = 2;
+         * @return The ruleSet.
+         */
+        @java.lang.Override
+        public ipowdm.Ipowdm.IpowdmRuleSet getRuleSet() {
+            return ruleSet_ == null ? ipowdm.Ipowdm.IpowdmRuleSet.getDefaultInstance() : ruleSet_;
+        }
+
+        /**
+         * .ipowdm.IpowdmRuleSet rule_set = 2;
+         */
+        @java.lang.Override
+        public ipowdm.Ipowdm.IpowdmRuleSetOrBuilder getRuleSetOrBuilder() {
+            return ruleSet_ == null ? ipowdm.Ipowdm.IpowdmRuleSet.getDefaultInstance() : ruleSet_;
+        }
+
+        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 (endpointId_ != null) {
+                output.writeMessage(1, getEndpointId());
+            }
+            if (ruleSet_ != null) {
+                output.writeMessage(2, getRuleSet());
+            }
+            getUnknownFields().writeTo(output);
+        }
+
+        @java.lang.Override
+        public int getSerializedSize() {
+            int size = memoizedSize;
+            if (size != -1)
+                return size;
+            size = 0;
+            if (endpointId_ != null) {
+                size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getEndpointId());
+            }
+            if (ruleSet_ != null) {
+                size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getRuleSet());
+            }
+            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.ConfigRule_IPOWDM)) {
+                return super.equals(obj);
+            }
+            context.ContextOuterClass.ConfigRule_IPOWDM other = (context.ContextOuterClass.ConfigRule_IPOWDM) obj;
+            if (hasEndpointId() != other.hasEndpointId())
+                return false;
+            if (hasEndpointId()) {
+                if (!getEndpointId().equals(other.getEndpointId()))
+                    return false;
+            }
+            if (hasRuleSet() != other.hasRuleSet())
+                return false;
+            if (hasRuleSet()) {
+                if (!getRuleSet().equals(other.getRuleSet()))
+                    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 (hasEndpointId()) {
+                hash = (37 * hash) + ENDPOINT_ID_FIELD_NUMBER;
+                hash = (53 * hash) + getEndpointId().hashCode();
+            }
+            if (hasRuleSet()) {
+                hash = (37 * hash) + RULE_SET_FIELD_NUMBER;
+                hash = (53 * hash) + getRuleSet().hashCode();
+            }
+            hash = (29 * hash) + getUnknownFields().hashCode();
+            memoizedHashCode = hash;
+            return hash;
+        }
+
+        public static context.ContextOuterClass.ConfigRule_IPOWDM parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static context.ContextOuterClass.ConfigRule_IPOWDM parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static context.ContextOuterClass.ConfigRule_IPOWDM parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static context.ContextOuterClass.ConfigRule_IPOWDM 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.ConfigRule_IPOWDM parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static context.ContextOuterClass.ConfigRule_IPOWDM parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static context.ContextOuterClass.ConfigRule_IPOWDM parseFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static context.ContextOuterClass.ConfigRule_IPOWDM 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.ConfigRule_IPOWDM parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input);
+        }
+
+        public static context.ContextOuterClass.ConfigRule_IPOWDM 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.ConfigRule_IPOWDM parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static context.ContextOuterClass.ConfigRule_IPOWDM 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.ConfigRule_IPOWDM 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.ConfigRule_IPOWDM}
+         */
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConfigRule_IPOWDM)
+        context.ContextOuterClass.ConfigRule_IPOWDMOrBuilder {
+
+            public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+                return context.ContextOuterClass.internal_static_context_ConfigRule_IPOWDM_descriptor;
+            }
+
+            @java.lang.Override
+            protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+                return context.ContextOuterClass.internal_static_context_ConfigRule_IPOWDM_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.ConfigRule_IPOWDM.class, context.ContextOuterClass.ConfigRule_IPOWDM.Builder.class);
+            }
+
+            // Construct using context.ContextOuterClass.ConfigRule_IPOWDM.newBuilder()
+            private Builder() {
+            }
+
+            private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+                super(parent);
+            }
+
+            @java.lang.Override
+            public Builder clear() {
+                super.clear();
+                bitField0_ = 0;
+                endpointId_ = null;
+                if (endpointIdBuilder_ != null) {
+                    endpointIdBuilder_.dispose();
+                    endpointIdBuilder_ = null;
+                }
+                ruleSet_ = null;
+                if (ruleSetBuilder_ != null) {
+                    ruleSetBuilder_.dispose();
+                    ruleSetBuilder_ = null;
+                }
+                return this;
+            }
+
+            @java.lang.Override
+            public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+                return context.ContextOuterClass.internal_static_context_ConfigRule_IPOWDM_descriptor;
+            }
+
+            @java.lang.Override
+            public context.ContextOuterClass.ConfigRule_IPOWDM getDefaultInstanceForType() {
+                return context.ContextOuterClass.ConfigRule_IPOWDM.getDefaultInstance();
+            }
+
+            @java.lang.Override
+            public context.ContextOuterClass.ConfigRule_IPOWDM build() {
+                context.ContextOuterClass.ConfigRule_IPOWDM result = buildPartial();
+                if (!result.isInitialized()) {
+                    throw newUninitializedMessageException(result);
+                }
+                return result;
+            }
+
+            @java.lang.Override
+            public context.ContextOuterClass.ConfigRule_IPOWDM buildPartial() {
+                context.ContextOuterClass.ConfigRule_IPOWDM result = new context.ContextOuterClass.ConfigRule_IPOWDM(this);
+                if (bitField0_ != 0) {
+                    buildPartial0(result);
+                }
+                onBuilt();
+                return result;
+            }
+
+            private void buildPartial0(context.ContextOuterClass.ConfigRule_IPOWDM 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 mergeFrom(com.google.protobuf.Message other) {
+                if (other instanceof context.ContextOuterClass.ConfigRule_IPOWDM) {
+                    return mergeFrom((context.ContextOuterClass.ConfigRule_IPOWDM) other);
+                } else {
+                    super.mergeFrom(other);
+                    return this;
+                }
+            }
+
+            public Builder mergeFrom(context.ContextOuterClass.ConfigRule_IPOWDM other) {
+                if (other == context.ContextOuterClass.ConfigRule_IPOWDM.getDefaultInstance())
+                    return this;
+                if (other.hasEndpointId()) {
+                    mergeEndpointId(other.getEndpointId());
+                }
+                if (other.hasRuleSet()) {
+                    mergeRuleSet(other.getRuleSet());
+                }
+                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(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)
+                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    throw e.unwrapIOException();
+                } finally {
+                    onChanged();
+                }
+                // finally
+                return this;
+            }
+
+            private int bitField0_;
+
+            private context.ContextOuterClass.EndPointId endpointId_;
+
+            private com.google.protobuf.SingleFieldBuilderV3 endpointIdBuilder_;
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             * @return Whether the endpointId field is set.
+             */
+            public boolean hasEndpointId() {
+                return ((bitField0_ & 0x00000001) != 0);
+            }
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             * @return The endpointId.
+             */
+            public context.ContextOuterClass.EndPointId getEndpointId() {
+                if (endpointIdBuilder_ == null) {
+                    return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
+                } else {
+                    return endpointIdBuilder_.getMessage();
+                }
+            }
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             */
+            public Builder setEndpointId(context.ContextOuterClass.EndPointId value) {
+                if (endpointIdBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    endpointId_ = value;
+                } else {
+                    endpointIdBuilder_.setMessage(value);
+                }
+                bitField0_ |= 0x00000001;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             */
+            public Builder setEndpointId(context.ContextOuterClass.EndPointId.Builder builderForValue) {
+                if (endpointIdBuilder_ == null) {
+                    endpointId_ = builderForValue.build();
+                } else {
+                    endpointIdBuilder_.setMessage(builderForValue.build());
+                }
+                bitField0_ |= 0x00000001;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             */
+            public Builder mergeEndpointId(context.ContextOuterClass.EndPointId value) {
+                if (endpointIdBuilder_ == null) {
+                    if (((bitField0_ & 0x00000001) != 0) && endpointId_ != null && endpointId_ != context.ContextOuterClass.EndPointId.getDefaultInstance()) {
+                        getEndpointIdBuilder().mergeFrom(value);
+                    } else {
+                        endpointId_ = value;
+                    }
+                } else {
+                    endpointIdBuilder_.mergeFrom(value);
+                }
+                bitField0_ |= 0x00000001;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             */
+            public Builder clearEndpointId() {
+                bitField0_ = (bitField0_ & ~0x00000001);
+                endpointId_ = null;
+                if (endpointIdBuilder_ != null) {
+                    endpointIdBuilder_.dispose();
+                    endpointIdBuilder_ = null;
+                }
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             */
+            public context.ContextOuterClass.EndPointId.Builder getEndpointIdBuilder() {
+                bitField0_ |= 0x00000001;
+                onChanged();
+                return getEndpointIdFieldBuilder().getBuilder();
+            }
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             */
+            public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
+                if (endpointIdBuilder_ != null) {
+                    return endpointIdBuilder_.getMessageOrBuilder();
+                } else {
+                    return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
+                }
+            }
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             */
+            private com.google.protobuf.SingleFieldBuilderV3 getEndpointIdFieldBuilder() {
+                if (endpointIdBuilder_ == null) {
+                    endpointIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(getEndpointId(), getParentForChildren(), isClean());
+                    endpointId_ = null;
+                }
+                return endpointIdBuilder_;
+            }
+
+            private ipowdm.Ipowdm.IpowdmRuleSet ruleSet_;
+
+            private com.google.protobuf.SingleFieldBuilderV3 ruleSetBuilder_;
+
+            /**
+             * .ipowdm.IpowdmRuleSet rule_set = 2;
+             * @return Whether the ruleSet field is set.
+             */
+            public boolean hasRuleSet() {
+                return ((bitField0_ & 0x00000002) != 0);
+            }
+
+            /**
+             * .ipowdm.IpowdmRuleSet rule_set = 2;
+             * @return The ruleSet.
+             */
+            public ipowdm.Ipowdm.IpowdmRuleSet getRuleSet() {
+                if (ruleSetBuilder_ == null) {
+                    return ruleSet_ == null ? ipowdm.Ipowdm.IpowdmRuleSet.getDefaultInstance() : ruleSet_;
+                } else {
+                    return ruleSetBuilder_.getMessage();
+                }
+            }
+
+            /**
+             * .ipowdm.IpowdmRuleSet rule_set = 2;
+             */
+            public Builder setRuleSet(ipowdm.Ipowdm.IpowdmRuleSet value) {
+                if (ruleSetBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ruleSet_ = value;
+                } else {
+                    ruleSetBuilder_.setMessage(value);
+                }
+                bitField0_ |= 0x00000002;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .ipowdm.IpowdmRuleSet rule_set = 2;
+             */
+            public Builder setRuleSet(ipowdm.Ipowdm.IpowdmRuleSet.Builder builderForValue) {
+                if (ruleSetBuilder_ == null) {
+                    ruleSet_ = builderForValue.build();
+                } else {
+                    ruleSetBuilder_.setMessage(builderForValue.build());
+                }
+                bitField0_ |= 0x00000002;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .ipowdm.IpowdmRuleSet rule_set = 2;
+             */
+            public Builder mergeRuleSet(ipowdm.Ipowdm.IpowdmRuleSet value) {
+                if (ruleSetBuilder_ == null) {
+                    if (((bitField0_ & 0x00000002) != 0) && ruleSet_ != null && ruleSet_ != ipowdm.Ipowdm.IpowdmRuleSet.getDefaultInstance()) {
+                        getRuleSetBuilder().mergeFrom(value);
+                    } else {
+                        ruleSet_ = value;
+                    }
+                } else {
+                    ruleSetBuilder_.mergeFrom(value);
+                }
+                bitField0_ |= 0x00000002;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .ipowdm.IpowdmRuleSet rule_set = 2;
+             */
+            public Builder clearRuleSet() {
+                bitField0_ = (bitField0_ & ~0x00000002);
+                ruleSet_ = null;
+                if (ruleSetBuilder_ != null) {
+                    ruleSetBuilder_.dispose();
+                    ruleSetBuilder_ = null;
+                }
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .ipowdm.IpowdmRuleSet rule_set = 2;
+             */
+            public ipowdm.Ipowdm.IpowdmRuleSet.Builder getRuleSetBuilder() {
+                bitField0_ |= 0x00000002;
+                onChanged();
+                return getRuleSetFieldBuilder().getBuilder();
+            }
+
+            /**
+             * .ipowdm.IpowdmRuleSet rule_set = 2;
+             */
+            public ipowdm.Ipowdm.IpowdmRuleSetOrBuilder getRuleSetOrBuilder() {
+                if (ruleSetBuilder_ != null) {
+                    return ruleSetBuilder_.getMessageOrBuilder();
+                } else {
+                    return ruleSet_ == null ? ipowdm.Ipowdm.IpowdmRuleSet.getDefaultInstance() : ruleSet_;
+                }
+            }
+
+            /**
+             * .ipowdm.IpowdmRuleSet rule_set = 2;
+             */
+            private com.google.protobuf.SingleFieldBuilderV3 getRuleSetFieldBuilder() {
+                if (ruleSetBuilder_ == null) {
+                    ruleSetBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(getRuleSet(), getParentForChildren(), isClean());
+                    ruleSet_ = null;
+                }
+                return ruleSetBuilder_;
+            }
+
+            @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.ConfigRule_IPOWDM)
+        }
+
+        // @@protoc_insertion_point(class_scope:context.ConfigRule_IPOWDM)
+        private static final context.ContextOuterClass.ConfigRule_IPOWDM DEFAULT_INSTANCE;
+
+        static {
+            DEFAULT_INSTANCE = new context.ContextOuterClass.ConfigRule_IPOWDM();
+        }
+
+        public static context.ContextOuterClass.ConfigRule_IPOWDM getDefaultInstance() {
+            return DEFAULT_INSTANCE;
+        }
+
+        private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+
+            @java.lang.Override
+            public ConfigRule_IPOWDM parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+                Builder builder = newBuilder();
+                try {
+                    builder.mergeFrom(input, extensionRegistry);
+                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    throw e.setUnfinishedMessage(builder.buildPartial());
+                } catch (com.google.protobuf.UninitializedMessageException e) {
+                    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.ConfigRule_IPOWDM getDefaultInstanceForType() {
+            return DEFAULT_INSTANCE;
+        }
+    }
+
+    public interface ConfigRule_TAPI_LSPOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConfigRule_TAPI_LSP)
+    com.google.protobuf.MessageOrBuilder {
+
+        /**
+         * .context.EndPointId endpoint_id = 1;
+         * @return Whether the endpointId field is set.
+         */
+        boolean hasEndpointId();
+
+        /**
+         * .context.EndPointId endpoint_id = 1;
+         * @return The endpointId.
+         */
+        context.ContextOuterClass.EndPointId getEndpointId();
+
+        /**
+         * .context.EndPointId endpoint_id = 1;
+         */
+        context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder();
+
+        /**
+         * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+         */
+        java.util.List getRuleSetList();
+
+        /**
+         * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+         */
+        tapi_lsp.TapiLsp.TapiLspRuleSet getRuleSet(int index);
+
+        /**
+         * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+         */
+        int getRuleSetCount();
+
+        /**
+         * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+         */
+        java.util.List getRuleSetOrBuilderList();
+
+        /**
+         * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+         */
+        tapi_lsp.TapiLsp.TapiLspRuleSetOrBuilder getRuleSetOrBuilder(int index);
+    }
+
+    /**
+     * Protobuf type {@code context.ConfigRule_TAPI_LSP}
+     */
+    public static final class ConfigRule_TAPI_LSP extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConfigRule_TAPI_LSP)
+    ConfigRule_TAPI_LSPOrBuilder {
+
+        private static final long serialVersionUID = 0L;
+
+        // Use ConfigRule_TAPI_LSP.newBuilder() to construct.
+        private ConfigRule_TAPI_LSP(com.google.protobuf.GeneratedMessageV3.Builder builder) {
+            super(builder);
+        }
+
+        private ConfigRule_TAPI_LSP() {
+            ruleSet_ = java.util.Collections.emptyList();
+        }
+
+        @java.lang.Override
+        @SuppressWarnings({ "unused" })
+        protected java.lang.Object newInstance(UnusedPrivateParameter unused) {
+            return new ConfigRule_TAPI_LSP();
+        }
+
+        public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+            return context.ContextOuterClass.internal_static_context_ConfigRule_TAPI_LSP_descriptor;
+        }
+
+        @java.lang.Override
+        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+            return context.ContextOuterClass.internal_static_context_ConfigRule_TAPI_LSP_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.ConfigRule_TAPI_LSP.class, context.ContextOuterClass.ConfigRule_TAPI_LSP.Builder.class);
+        }
+
+        public static final int ENDPOINT_ID_FIELD_NUMBER = 1;
+
+        private context.ContextOuterClass.EndPointId endpointId_;
+
+        /**
+         * .context.EndPointId endpoint_id = 1;
+         * @return Whether the endpointId field is set.
+         */
+        @java.lang.Override
+        public boolean hasEndpointId() {
+            return endpointId_ != null;
+        }
+
+        /**
+         * .context.EndPointId endpoint_id = 1;
+         * @return The endpointId.
+         */
+        @java.lang.Override
+        public context.ContextOuterClass.EndPointId getEndpointId() {
+            return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
+        }
+
+        /**
+         * .context.EndPointId endpoint_id = 1;
+         */
+        @java.lang.Override
+        public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
+            return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
+        }
+
+        public static final int RULE_SET_FIELD_NUMBER = 2;
+
+        @SuppressWarnings("serial")
+        private java.util.List ruleSet_;
+
+        /**
+         * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+         */
+        @java.lang.Override
+        public java.util.List getRuleSetList() {
+            return ruleSet_;
+        }
+
+        /**
+         * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+         */
+        @java.lang.Override
+        public java.util.List getRuleSetOrBuilderList() {
+            return ruleSet_;
+        }
+
+        /**
+         * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+         */
+        @java.lang.Override
+        public int getRuleSetCount() {
+            return ruleSet_.size();
+        }
+
+        /**
+         * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+         */
+        @java.lang.Override
+        public tapi_lsp.TapiLsp.TapiLspRuleSet getRuleSet(int index) {
+            return ruleSet_.get(index);
+        }
+
+        /**
+         * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+         */
+        @java.lang.Override
+        public tapi_lsp.TapiLsp.TapiLspRuleSetOrBuilder getRuleSetOrBuilder(int index) {
+            return ruleSet_.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 (endpointId_ != null) {
+                output.writeMessage(1, getEndpointId());
+            }
+            for (int i = 0; i < ruleSet_.size(); i++) {
+                output.writeMessage(2, ruleSet_.get(i));
+            }
+            getUnknownFields().writeTo(output);
+        }
+
+        @java.lang.Override
+        public int getSerializedSize() {
+            int size = memoizedSize;
+            if (size != -1)
+                return size;
+            size = 0;
+            if (endpointId_ != null) {
+                size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getEndpointId());
+            }
+            for (int i = 0; i < ruleSet_.size(); i++) {
+                size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, ruleSet_.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.ConfigRule_TAPI_LSP)) {
+                return super.equals(obj);
+            }
+            context.ContextOuterClass.ConfigRule_TAPI_LSP other = (context.ContextOuterClass.ConfigRule_TAPI_LSP) obj;
+            if (hasEndpointId() != other.hasEndpointId())
+                return false;
+            if (hasEndpointId()) {
+                if (!getEndpointId().equals(other.getEndpointId()))
+                    return false;
+            }
+            if (!getRuleSetList().equals(other.getRuleSetList()))
+                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 (hasEndpointId()) {
+                hash = (37 * hash) + ENDPOINT_ID_FIELD_NUMBER;
+                hash = (53 * hash) + getEndpointId().hashCode();
+            }
+            if (getRuleSetCount() > 0) {
+                hash = (37 * hash) + RULE_SET_FIELD_NUMBER;
+                hash = (53 * hash) + getRuleSetList().hashCode();
+            }
+            hash = (29 * hash) + getUnknownFields().hashCode();
+            memoizedHashCode = hash;
+            return hash;
+        }
+
+        public static context.ContextOuterClass.ConfigRule_TAPI_LSP parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static context.ContextOuterClass.ConfigRule_TAPI_LSP parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static context.ContextOuterClass.ConfigRule_TAPI_LSP parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static context.ContextOuterClass.ConfigRule_TAPI_LSP 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.ConfigRule_TAPI_LSP parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static context.ContextOuterClass.ConfigRule_TAPI_LSP parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static context.ContextOuterClass.ConfigRule_TAPI_LSP parseFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static context.ContextOuterClass.ConfigRule_TAPI_LSP 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.ConfigRule_TAPI_LSP parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input);
+        }
+
+        public static context.ContextOuterClass.ConfigRule_TAPI_LSP 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.ConfigRule_TAPI_LSP parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static context.ContextOuterClass.ConfigRule_TAPI_LSP 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.ConfigRule_TAPI_LSP 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.ConfigRule_TAPI_LSP}
+         */
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConfigRule_TAPI_LSP)
+        context.ContextOuterClass.ConfigRule_TAPI_LSPOrBuilder {
+
+            public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+                return context.ContextOuterClass.internal_static_context_ConfigRule_TAPI_LSP_descriptor;
+            }
+
+            @java.lang.Override
+            protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+                return context.ContextOuterClass.internal_static_context_ConfigRule_TAPI_LSP_fieldAccessorTable.ensureFieldAccessorsInitialized(context.ContextOuterClass.ConfigRule_TAPI_LSP.class, context.ContextOuterClass.ConfigRule_TAPI_LSP.Builder.class);
+            }
+
+            // Construct using context.ContextOuterClass.ConfigRule_TAPI_LSP.newBuilder()
+            private Builder() {
+            }
+
+            private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+                super(parent);
+            }
+
+            @java.lang.Override
+            public Builder clear() {
+                super.clear();
+                bitField0_ = 0;
+                endpointId_ = null;
+                if (endpointIdBuilder_ != null) {
+                    endpointIdBuilder_.dispose();
+                    endpointIdBuilder_ = null;
+                }
+                if (ruleSetBuilder_ == null) {
+                    ruleSet_ = java.util.Collections.emptyList();
+                } else {
+                    ruleSet_ = null;
+                    ruleSetBuilder_.clear();
+                }
+                bitField0_ = (bitField0_ & ~0x00000002);
+                return this;
+            }
+
+            @java.lang.Override
+            public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+                return context.ContextOuterClass.internal_static_context_ConfigRule_TAPI_LSP_descriptor;
+            }
+
+            @java.lang.Override
+            public context.ContextOuterClass.ConfigRule_TAPI_LSP getDefaultInstanceForType() {
+                return context.ContextOuterClass.ConfigRule_TAPI_LSP.getDefaultInstance();
+            }
+
+            @java.lang.Override
+            public context.ContextOuterClass.ConfigRule_TAPI_LSP build() {
+                context.ContextOuterClass.ConfigRule_TAPI_LSP result = buildPartial();
+                if (!result.isInitialized()) {
+                    throw newUninitializedMessageException(result);
+                }
+                return result;
+            }
+
+            @java.lang.Override
+            public context.ContextOuterClass.ConfigRule_TAPI_LSP buildPartial() {
+                context.ContextOuterClass.ConfigRule_TAPI_LSP result = new context.ContextOuterClass.ConfigRule_TAPI_LSP(this);
+                buildPartialRepeatedFields(result);
+                if (bitField0_ != 0) {
+                    buildPartial0(result);
+                }
+                onBuilt();
+                return result;
+            }
+
+            private void buildPartialRepeatedFields(context.ContextOuterClass.ConfigRule_TAPI_LSP result) {
+                if (ruleSetBuilder_ == null) {
+                    if (((bitField0_ & 0x00000002) != 0)) {
+                        ruleSet_ = java.util.Collections.unmodifiableList(ruleSet_);
+                        bitField0_ = (bitField0_ & ~0x00000002);
+                    }
+                    result.ruleSet_ = ruleSet_;
+                } else {
+                    result.ruleSet_ = ruleSetBuilder_.build();
+                }
+            }
+
+            private void buildPartial0(context.ContextOuterClass.ConfigRule_TAPI_LSP result) {
+                int from_bitField0_ = bitField0_;
+                if (((from_bitField0_ & 0x00000001) != 0)) {
+                    result.endpointId_ = endpointIdBuilder_ == null ? endpointId_ : endpointIdBuilder_.build();
+                }
+            }
+
+            @java.lang.Override
+            public Builder mergeFrom(com.google.protobuf.Message other) {
+                if (other instanceof context.ContextOuterClass.ConfigRule_TAPI_LSP) {
+                    return mergeFrom((context.ContextOuterClass.ConfigRule_TAPI_LSP) other);
+                } else {
+                    super.mergeFrom(other);
+                    return this;
+                }
+            }
+
+            public Builder mergeFrom(context.ContextOuterClass.ConfigRule_TAPI_LSP other) {
+                if (other == context.ContextOuterClass.ConfigRule_TAPI_LSP.getDefaultInstance())
+                    return this;
+                if (other.hasEndpointId()) {
+                    mergeEndpointId(other.getEndpointId());
+                }
+                if (ruleSetBuilder_ == null) {
+                    if (!other.ruleSet_.isEmpty()) {
+                        if (ruleSet_.isEmpty()) {
+                            ruleSet_ = other.ruleSet_;
+                            bitField0_ = (bitField0_ & ~0x00000002);
+                        } else {
+                            ensureRuleSetIsMutable();
+                            ruleSet_.addAll(other.ruleSet_);
+                        }
+                        onChanged();
+                    }
+                } else {
+                    if (!other.ruleSet_.isEmpty()) {
+                        if (ruleSetBuilder_.isEmpty()) {
+                            ruleSetBuilder_.dispose();
+                            ruleSetBuilder_ = null;
+                            ruleSet_ = other.ruleSet_;
+                            bitField0_ = (bitField0_ & ~0x00000002);
+                            ruleSetBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getRuleSetFieldBuilder() : null;
+                        } else {
+                            ruleSetBuilder_.addAllMessages(other.ruleSet_);
+                        }
+                    }
+                }
+                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(getEndpointIdFieldBuilder().getBuilder(), extensionRegistry);
+                                    bitField0_ |= 0x00000001;
+                                    break;
+                                }
+                            // case 10
+                            case 18:
+                                {
+                                    tapi_lsp.TapiLsp.TapiLspRuleSet m = input.readMessage(tapi_lsp.TapiLsp.TapiLspRuleSet.parser(), extensionRegistry);
+                                    if (ruleSetBuilder_ == null) {
+                                        ensureRuleSetIsMutable();
+                                        ruleSet_.add(m);
+                                    } else {
+                                        ruleSetBuilder_.addMessage(m);
+                                    }
+                                    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.EndPointId endpointId_;
+
+            private com.google.protobuf.SingleFieldBuilderV3 endpointIdBuilder_;
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             * @return Whether the endpointId field is set.
+             */
+            public boolean hasEndpointId() {
+                return ((bitField0_ & 0x00000001) != 0);
+            }
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             * @return The endpointId.
+             */
+            public context.ContextOuterClass.EndPointId getEndpointId() {
+                if (endpointIdBuilder_ == null) {
+                    return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
+                } else {
+                    return endpointIdBuilder_.getMessage();
+                }
+            }
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             */
+            public Builder setEndpointId(context.ContextOuterClass.EndPointId value) {
+                if (endpointIdBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    endpointId_ = value;
+                } else {
+                    endpointIdBuilder_.setMessage(value);
+                }
+                bitField0_ |= 0x00000001;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             */
+            public Builder setEndpointId(context.ContextOuterClass.EndPointId.Builder builderForValue) {
+                if (endpointIdBuilder_ == null) {
+                    endpointId_ = builderForValue.build();
+                } else {
+                    endpointIdBuilder_.setMessage(builderForValue.build());
+                }
+                bitField0_ |= 0x00000001;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             */
+            public Builder mergeEndpointId(context.ContextOuterClass.EndPointId value) {
+                if (endpointIdBuilder_ == null) {
+                    if (((bitField0_ & 0x00000001) != 0) && endpointId_ != null && endpointId_ != context.ContextOuterClass.EndPointId.getDefaultInstance()) {
+                        getEndpointIdBuilder().mergeFrom(value);
+                    } else {
+                        endpointId_ = value;
+                    }
+                } else {
+                    endpointIdBuilder_.mergeFrom(value);
+                }
+                bitField0_ |= 0x00000001;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             */
+            public Builder clearEndpointId() {
+                bitField0_ = (bitField0_ & ~0x00000001);
+                endpointId_ = null;
+                if (endpointIdBuilder_ != null) {
+                    endpointIdBuilder_.dispose();
+                    endpointIdBuilder_ = null;
+                }
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             */
+            public context.ContextOuterClass.EndPointId.Builder getEndpointIdBuilder() {
+                bitField0_ |= 0x00000001;
+                onChanged();
+                return getEndpointIdFieldBuilder().getBuilder();
+            }
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             */
+            public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
+                if (endpointIdBuilder_ != null) {
+                    return endpointIdBuilder_.getMessageOrBuilder();
+                } else {
+                    return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
+                }
+            }
+
+            /**
+             * .context.EndPointId endpoint_id = 1;
+             */
+            private com.google.protobuf.SingleFieldBuilderV3 getEndpointIdFieldBuilder() {
+                if (endpointIdBuilder_ == null) {
+                    endpointIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(getEndpointId(), getParentForChildren(), isClean());
+                    endpointId_ = null;
+                }
+                return endpointIdBuilder_;
+            }
+
+            private java.util.List ruleSet_ = java.util.Collections.emptyList();
+
+            private void ensureRuleSetIsMutable() {
+                if (!((bitField0_ & 0x00000002) != 0)) {
+                    ruleSet_ = new java.util.ArrayList(ruleSet_);
+                    bitField0_ |= 0x00000002;
+                }
+            }
+
+            private com.google.protobuf.RepeatedFieldBuilderV3 ruleSetBuilder_;
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public java.util.List getRuleSetList() {
+                if (ruleSetBuilder_ == null) {
+                    return java.util.Collections.unmodifiableList(ruleSet_);
+                } else {
+                    return ruleSetBuilder_.getMessageList();
+                }
+            }
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public int getRuleSetCount() {
+                if (ruleSetBuilder_ == null) {
+                    return ruleSet_.size();
+                } else {
+                    return ruleSetBuilder_.getCount();
+                }
+            }
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public tapi_lsp.TapiLsp.TapiLspRuleSet getRuleSet(int index) {
+                if (ruleSetBuilder_ == null) {
+                    return ruleSet_.get(index);
+                } else {
+                    return ruleSetBuilder_.getMessage(index);
+                }
+            }
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public Builder setRuleSet(int index, tapi_lsp.TapiLsp.TapiLspRuleSet value) {
+                if (ruleSetBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureRuleSetIsMutable();
+                    ruleSet_.set(index, value);
+                    onChanged();
+                } else {
+                    ruleSetBuilder_.setMessage(index, value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public Builder setRuleSet(int index, tapi_lsp.TapiLsp.TapiLspRuleSet.Builder builderForValue) {
+                if (ruleSetBuilder_ == null) {
+                    ensureRuleSetIsMutable();
+                    ruleSet_.set(index, builderForValue.build());
+                    onChanged();
+                } else {
+                    ruleSetBuilder_.setMessage(index, builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public Builder addRuleSet(tapi_lsp.TapiLsp.TapiLspRuleSet value) {
+                if (ruleSetBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureRuleSetIsMutable();
+                    ruleSet_.add(value);
+                    onChanged();
+                } else {
+                    ruleSetBuilder_.addMessage(value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public Builder addRuleSet(int index, tapi_lsp.TapiLsp.TapiLspRuleSet value) {
+                if (ruleSetBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureRuleSetIsMutable();
+                    ruleSet_.add(index, value);
+                    onChanged();
+                } else {
+                    ruleSetBuilder_.addMessage(index, value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public Builder addRuleSet(tapi_lsp.TapiLsp.TapiLspRuleSet.Builder builderForValue) {
+                if (ruleSetBuilder_ == null) {
+                    ensureRuleSetIsMutable();
+                    ruleSet_.add(builderForValue.build());
+                    onChanged();
+                } else {
+                    ruleSetBuilder_.addMessage(builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public Builder addRuleSet(int index, tapi_lsp.TapiLsp.TapiLspRuleSet.Builder builderForValue) {
+                if (ruleSetBuilder_ == null) {
+                    ensureRuleSetIsMutable();
+                    ruleSet_.add(index, builderForValue.build());
+                    onChanged();
+                } else {
+                    ruleSetBuilder_.addMessage(index, builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public Builder addAllRuleSet(java.lang.Iterable values) {
+                if (ruleSetBuilder_ == null) {
+                    ensureRuleSetIsMutable();
+                    com.google.protobuf.AbstractMessageLite.Builder.addAll(values, ruleSet_);
+                    onChanged();
+                } else {
+                    ruleSetBuilder_.addAllMessages(values);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public Builder clearRuleSet() {
+                if (ruleSetBuilder_ == null) {
+                    ruleSet_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000002);
+                    onChanged();
+                } else {
+                    ruleSetBuilder_.clear();
+                }
+                return this;
+            }
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public Builder removeRuleSet(int index) {
+                if (ruleSetBuilder_ == null) {
+                    ensureRuleSetIsMutable();
+                    ruleSet_.remove(index);
+                    onChanged();
+                } else {
+                    ruleSetBuilder_.remove(index);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public tapi_lsp.TapiLsp.TapiLspRuleSet.Builder getRuleSetBuilder(int index) {
+                return getRuleSetFieldBuilder().getBuilder(index);
+            }
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public tapi_lsp.TapiLsp.TapiLspRuleSetOrBuilder getRuleSetOrBuilder(int index) {
+                if (ruleSetBuilder_ == null) {
+                    return ruleSet_.get(index);
+                } else {
+                    return ruleSetBuilder_.getMessageOrBuilder(index);
+                }
+            }
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public java.util.List getRuleSetOrBuilderList() {
+                if (ruleSetBuilder_ != null) {
+                    return ruleSetBuilder_.getMessageOrBuilderList();
+                } else {
+                    return java.util.Collections.unmodifiableList(ruleSet_);
+                }
+            }
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public tapi_lsp.TapiLsp.TapiLspRuleSet.Builder addRuleSetBuilder() {
+                return getRuleSetFieldBuilder().addBuilder(tapi_lsp.TapiLsp.TapiLspRuleSet.getDefaultInstance());
+            }
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public tapi_lsp.TapiLsp.TapiLspRuleSet.Builder addRuleSetBuilder(int index) {
+                return getRuleSetFieldBuilder().addBuilder(index, tapi_lsp.TapiLsp.TapiLspRuleSet.getDefaultInstance());
+            }
+
+            /**
+             * repeated .tapi_lsp.TapiLspRuleSet rule_set = 2;
+             */
+            public java.util.List getRuleSetBuilderList() {
+                return getRuleSetFieldBuilder().getBuilderList();
+            }
+
+            private com.google.protobuf.RepeatedFieldBuilderV3 getRuleSetFieldBuilder() {
+                if (ruleSetBuilder_ == null) {
+                    ruleSetBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(ruleSet_, ((bitField0_ & 0x00000002) != 0), getParentForChildren(), isClean());
+                    ruleSet_ = null;
+                }
+                return ruleSetBuilder_;
+            }
+
+            @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.ConfigRule_TAPI_LSP)
+        }
+
+        // @@protoc_insertion_point(class_scope:context.ConfigRule_TAPI_LSP)
+        private static final context.ContextOuterClass.ConfigRule_TAPI_LSP DEFAULT_INSTANCE;
+
+        static {
+            DEFAULT_INSTANCE = new context.ContextOuterClass.ConfigRule_TAPI_LSP();
+        }
+
+        public static context.ContextOuterClass.ConfigRule_TAPI_LSP getDefaultInstance() {
+            return DEFAULT_INSTANCE;
+        }
+
+        private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+
+            @java.lang.Override
+            public ConfigRule_TAPI_LSP parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+                Builder builder = newBuilder();
+                try {
+                    builder.mergeFrom(input, extensionRegistry);
+                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    throw e.setUnfinishedMessage(builder.buildPartial());
+                } catch (com.google.protobuf.UninitializedMessageException e) {
+                    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.ConfigRule_TAPI_LSP getDefaultInstanceForType() {
+            return DEFAULT_INSTANCE;
+        }
+    }
+
     public interface ConfigRule_IP_LINKOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConfigRule_IP_LINK)
     com.google.protobuf.MessageOrBuilder {
 
@@ -61277,6 +62952,40 @@ public final class ContextOuterClass {
          */
         context.ContextOuterClass.ConfigRule_IP_LINKOrBuilder getIpLinkOrBuilder();
 
+        /**
+         * .context.ConfigRule_TAPI_LSP tapi_lsp = 5;
+         * @return Whether the tapiLsp field is set.
+         */
+        boolean hasTapiLsp();
+
+        /**
+         * .context.ConfigRule_TAPI_LSP tapi_lsp = 5;
+         * @return The tapiLsp.
+         */
+        context.ContextOuterClass.ConfigRule_TAPI_LSP getTapiLsp();
+
+        /**
+         * .context.ConfigRule_TAPI_LSP tapi_lsp = 5;
+         */
+        context.ContextOuterClass.ConfigRule_TAPI_LSPOrBuilder getTapiLspOrBuilder();
+
+        /**
+         * .context.ConfigRule_IPOWDM ipowdm = 6;
+         * @return Whether the ipowdm field is set.
+         */
+        boolean hasIpowdm();
+
+        /**
+         * .context.ConfigRule_IPOWDM ipowdm = 6;
+         * @return The ipowdm.
+         */
+        context.ContextOuterClass.ConfigRule_IPOWDM getIpowdm();
+
+        /**
+         * .context.ConfigRule_IPOWDM ipowdm = 6;
+         */
+        context.ContextOuterClass.ConfigRule_IPOWDMOrBuilder getIpowdmOrBuilder();
+
         context.ContextOuterClass.ConfigRule.ConfigRuleCase getConfigRuleCase();
     }
 
@@ -61319,7 +63028,12 @@ public final class ContextOuterClass {
 
         public enum ConfigRuleCase implements com.google.protobuf.Internal.EnumLite, com.google.protobuf.AbstractMessage.InternalOneOfEnum {
 
-            CUSTOM(2), ACL(3), IP_LINK(4), CONFIGRULE_NOT_SET(0);
+            CUSTOM(2),
+            ACL(3),
+            IP_LINK(4),
+            TAPI_LSP(5),
+            IPOWDM(6),
+            CONFIGRULE_NOT_SET(0);
 
             private final int value;
 
@@ -61345,6 +63059,10 @@ public final class ContextOuterClass {
                         return ACL;
                     case 4:
                         return IP_LINK;
+                    case 5:
+                        return TAPI_LSP;
+                    case 6:
+                        return IPOWDM;
                     case 0:
                         return CONFIGRULE_NOT_SET;
                     default:
@@ -61486,6 +63204,74 @@ public final class ContextOuterClass {
             return context.ContextOuterClass.ConfigRule_IP_LINK.getDefaultInstance();
         }
 
+        public static final int TAPI_LSP_FIELD_NUMBER = 5;
+
+        /**
+         * .context.ConfigRule_TAPI_LSP tapi_lsp = 5;
+         * @return Whether the tapiLsp field is set.
+         */
+        @java.lang.Override
+        public boolean hasTapiLsp() {
+            return configRuleCase_ == 5;
+        }
+
+        /**
+         * .context.ConfigRule_TAPI_LSP tapi_lsp = 5;
+         * @return The tapiLsp.
+         */
+        @java.lang.Override
+        public context.ContextOuterClass.ConfigRule_TAPI_LSP getTapiLsp() {
+            if (configRuleCase_ == 5) {
+                return (context.ContextOuterClass.ConfigRule_TAPI_LSP) configRule_;
+            }
+            return context.ContextOuterClass.ConfigRule_TAPI_LSP.getDefaultInstance();
+        }
+
+        /**
+         * .context.ConfigRule_TAPI_LSP tapi_lsp = 5;
+         */
+        @java.lang.Override
+        public context.ContextOuterClass.ConfigRule_TAPI_LSPOrBuilder getTapiLspOrBuilder() {
+            if (configRuleCase_ == 5) {
+                return (context.ContextOuterClass.ConfigRule_TAPI_LSP) configRule_;
+            }
+            return context.ContextOuterClass.ConfigRule_TAPI_LSP.getDefaultInstance();
+        }
+
+        public static final int IPOWDM_FIELD_NUMBER = 6;
+
+        /**
+         * .context.ConfigRule_IPOWDM ipowdm = 6;
+         * @return Whether the ipowdm field is set.
+         */
+        @java.lang.Override
+        public boolean hasIpowdm() {
+            return configRuleCase_ == 6;
+        }
+
+        /**
+         * .context.ConfigRule_IPOWDM ipowdm = 6;
+         * @return The ipowdm.
+         */
+        @java.lang.Override
+        public context.ContextOuterClass.ConfigRule_IPOWDM getIpowdm() {
+            if (configRuleCase_ == 6) {
+                return (context.ContextOuterClass.ConfigRule_IPOWDM) configRule_;
+            }
+            return context.ContextOuterClass.ConfigRule_IPOWDM.getDefaultInstance();
+        }
+
+        /**
+         * .context.ConfigRule_IPOWDM ipowdm = 6;
+         */
+        @java.lang.Override
+        public context.ContextOuterClass.ConfigRule_IPOWDMOrBuilder getIpowdmOrBuilder() {
+            if (configRuleCase_ == 6) {
+                return (context.ContextOuterClass.ConfigRule_IPOWDM) configRule_;
+            }
+            return context.ContextOuterClass.ConfigRule_IPOWDM.getDefaultInstance();
+        }
+
         private byte memoizedIsInitialized = -1;
 
         @java.lang.Override
@@ -61513,6 +63299,12 @@ public final class ContextOuterClass {
             if (configRuleCase_ == 4) {
                 output.writeMessage(4, (context.ContextOuterClass.ConfigRule_IP_LINK) configRule_);
             }
+            if (configRuleCase_ == 5) {
+                output.writeMessage(5, (context.ContextOuterClass.ConfigRule_TAPI_LSP) configRule_);
+            }
+            if (configRuleCase_ == 6) {
+                output.writeMessage(6, (context.ContextOuterClass.ConfigRule_IPOWDM) configRule_);
+            }
             getUnknownFields().writeTo(output);
         }
 
@@ -61534,6 +63326,12 @@ public final class ContextOuterClass {
             if (configRuleCase_ == 4) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(4, (context.ContextOuterClass.ConfigRule_IP_LINK) configRule_);
             }
+            if (configRuleCase_ == 5) {
+                size += com.google.protobuf.CodedOutputStream.computeMessageSize(5, (context.ContextOuterClass.ConfigRule_TAPI_LSP) configRule_);
+            }
+            if (configRuleCase_ == 6) {
+                size += com.google.protobuf.CodedOutputStream.computeMessageSize(6, (context.ContextOuterClass.ConfigRule_IPOWDM) configRule_);
+            }
             size += getUnknownFields().getSerializedSize();
             memoizedSize = size;
             return size;
@@ -61565,6 +63363,14 @@ public final class ContextOuterClass {
                     if (!getIpLink().equals(other.getIpLink()))
                         return false;
                     break;
+                case 5:
+                    if (!getTapiLsp().equals(other.getTapiLsp()))
+                        return false;
+                    break;
+                case 6:
+                    if (!getIpowdm().equals(other.getIpowdm()))
+                        return false;
+                    break;
                 case 0:
                 default:
             }
@@ -61595,6 +63401,14 @@ public final class ContextOuterClass {
                     hash = (37 * hash) + IP_LINK_FIELD_NUMBER;
                     hash = (53 * hash) + getIpLink().hashCode();
                     break;
+                case 5:
+                    hash = (37 * hash) + TAPI_LSP_FIELD_NUMBER;
+                    hash = (53 * hash) + getTapiLsp().hashCode();
+                    break;
+                case 6:
+                    hash = (37 * hash) + IPOWDM_FIELD_NUMBER;
+                    hash = (53 * hash) + getIpowdm().hashCode();
+                    break;
                 case 0:
                 default:
             }
@@ -61712,6 +63526,12 @@ public final class ContextOuterClass {
                 if (ipLinkBuilder_ != null) {
                     ipLinkBuilder_.clear();
                 }
+                if (tapiLspBuilder_ != null) {
+                    tapiLspBuilder_.clear();
+                }
+                if (ipowdmBuilder_ != null) {
+                    ipowdmBuilder_.clear();
+                }
                 configRuleCase_ = 0;
                 configRule_ = null;
                 return this;
@@ -61766,6 +63586,12 @@ public final class ContextOuterClass {
                 if (configRuleCase_ == 4 && ipLinkBuilder_ != null) {
                     result.configRule_ = ipLinkBuilder_.build();
                 }
+                if (configRuleCase_ == 5 && tapiLspBuilder_ != null) {
+                    result.configRule_ = tapiLspBuilder_.build();
+                }
+                if (configRuleCase_ == 6 && ipowdmBuilder_ != null) {
+                    result.configRule_ = ipowdmBuilder_.build();
+                }
             }
 
             @java.lang.Override
@@ -61800,6 +63626,16 @@ public final class ContextOuterClass {
                             mergeIpLink(other.getIpLink());
                             break;
                         }
+                    case TAPI_LSP:
+                        {
+                            mergeTapiLsp(other.getTapiLsp());
+                            break;
+                        }
+                    case IPOWDM:
+                        {
+                            mergeIpowdm(other.getIpowdm());
+                            break;
+                        }
                     case CONFIGRULE_NOT_SET:
                         {
                             break;
@@ -61856,6 +63692,20 @@ public final class ContextOuterClass {
                                     break;
                                 }
                             // case 34
+                            case 42:
+                                {
+                                    input.readMessage(getTapiLspFieldBuilder().getBuilder(), extensionRegistry);
+                                    configRuleCase_ = 5;
+                                    break;
+                                }
+                            // case 42
+                            case 50:
+                                {
+                                    input.readMessage(getIpowdmFieldBuilder().getBuilder(), extensionRegistry);
+                                    configRuleCase_ = 6;
+                                    break;
+                                }
+                            // case 50
                             default:
                                 {
                                     if (!super.parseUnknownField(input, extensionRegistry, tag)) {
@@ -62376,6 +64226,288 @@ public final class ContextOuterClass {
                 return ipLinkBuilder_;
             }
 
+            private com.google.protobuf.SingleFieldBuilderV3 tapiLspBuilder_;
+
+            /**
+             * .context.ConfigRule_TAPI_LSP tapi_lsp = 5;
+             * @return Whether the tapiLsp field is set.
+             */
+            @java.lang.Override
+            public boolean hasTapiLsp() {
+                return configRuleCase_ == 5;
+            }
+
+            /**
+             * .context.ConfigRule_TAPI_LSP tapi_lsp = 5;
+             * @return The tapiLsp.
+             */
+            @java.lang.Override
+            public context.ContextOuterClass.ConfigRule_TAPI_LSP getTapiLsp() {
+                if (tapiLspBuilder_ == null) {
+                    if (configRuleCase_ == 5) {
+                        return (context.ContextOuterClass.ConfigRule_TAPI_LSP) configRule_;
+                    }
+                    return context.ContextOuterClass.ConfigRule_TAPI_LSP.getDefaultInstance();
+                } else {
+                    if (configRuleCase_ == 5) {
+                        return tapiLspBuilder_.getMessage();
+                    }
+                    return context.ContextOuterClass.ConfigRule_TAPI_LSP.getDefaultInstance();
+                }
+            }
+
+            /**
+             * .context.ConfigRule_TAPI_LSP tapi_lsp = 5;
+             */
+            public Builder setTapiLsp(context.ContextOuterClass.ConfigRule_TAPI_LSP value) {
+                if (tapiLspBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    configRule_ = value;
+                    onChanged();
+                } else {
+                    tapiLspBuilder_.setMessage(value);
+                }
+                configRuleCase_ = 5;
+                return this;
+            }
+
+            /**
+             * .context.ConfigRule_TAPI_LSP tapi_lsp = 5;
+             */
+            public Builder setTapiLsp(context.ContextOuterClass.ConfigRule_TAPI_LSP.Builder builderForValue) {
+                if (tapiLspBuilder_ == null) {
+                    configRule_ = builderForValue.build();
+                    onChanged();
+                } else {
+                    tapiLspBuilder_.setMessage(builderForValue.build());
+                }
+                configRuleCase_ = 5;
+                return this;
+            }
+
+            /**
+             * .context.ConfigRule_TAPI_LSP tapi_lsp = 5;
+             */
+            public Builder mergeTapiLsp(context.ContextOuterClass.ConfigRule_TAPI_LSP value) {
+                if (tapiLspBuilder_ == null) {
+                    if (configRuleCase_ == 5 && configRule_ != context.ContextOuterClass.ConfigRule_TAPI_LSP.getDefaultInstance()) {
+                        configRule_ = context.ContextOuterClass.ConfigRule_TAPI_LSP.newBuilder((context.ContextOuterClass.ConfigRule_TAPI_LSP) configRule_).mergeFrom(value).buildPartial();
+                    } else {
+                        configRule_ = value;
+                    }
+                    onChanged();
+                } else {
+                    if (configRuleCase_ == 5) {
+                        tapiLspBuilder_.mergeFrom(value);
+                    } else {
+                        tapiLspBuilder_.setMessage(value);
+                    }
+                }
+                configRuleCase_ = 5;
+                return this;
+            }
+
+            /**
+             * .context.ConfigRule_TAPI_LSP tapi_lsp = 5;
+             */
+            public Builder clearTapiLsp() {
+                if (tapiLspBuilder_ == null) {
+                    if (configRuleCase_ == 5) {
+                        configRuleCase_ = 0;
+                        configRule_ = null;
+                        onChanged();
+                    }
+                } else {
+                    if (configRuleCase_ == 5) {
+                        configRuleCase_ = 0;
+                        configRule_ = null;
+                    }
+                    tapiLspBuilder_.clear();
+                }
+                return this;
+            }
+
+            /**
+             * .context.ConfigRule_TAPI_LSP tapi_lsp = 5;
+             */
+            public context.ContextOuterClass.ConfigRule_TAPI_LSP.Builder getTapiLspBuilder() {
+                return getTapiLspFieldBuilder().getBuilder();
+            }
+
+            /**
+             * .context.ConfigRule_TAPI_LSP tapi_lsp = 5;
+             */
+            @java.lang.Override
+            public context.ContextOuterClass.ConfigRule_TAPI_LSPOrBuilder getTapiLspOrBuilder() {
+                if ((configRuleCase_ == 5) && (tapiLspBuilder_ != null)) {
+                    return tapiLspBuilder_.getMessageOrBuilder();
+                } else {
+                    if (configRuleCase_ == 5) {
+                        return (context.ContextOuterClass.ConfigRule_TAPI_LSP) configRule_;
+                    }
+                    return context.ContextOuterClass.ConfigRule_TAPI_LSP.getDefaultInstance();
+                }
+            }
+
+            /**
+             * .context.ConfigRule_TAPI_LSP tapi_lsp = 5;
+             */
+            private com.google.protobuf.SingleFieldBuilderV3 getTapiLspFieldBuilder() {
+                if (tapiLspBuilder_ == null) {
+                    if (!(configRuleCase_ == 5)) {
+                        configRule_ = context.ContextOuterClass.ConfigRule_TAPI_LSP.getDefaultInstance();
+                    }
+                    tapiLspBuilder_ = new com.google.protobuf.SingleFieldBuilderV3((context.ContextOuterClass.ConfigRule_TAPI_LSP) configRule_, getParentForChildren(), isClean());
+                    configRule_ = null;
+                }
+                configRuleCase_ = 5;
+                onChanged();
+                return tapiLspBuilder_;
+            }
+
+            private com.google.protobuf.SingleFieldBuilderV3 ipowdmBuilder_;
+
+            /**
+             * .context.ConfigRule_IPOWDM ipowdm = 6;
+             * @return Whether the ipowdm field is set.
+             */
+            @java.lang.Override
+            public boolean hasIpowdm() {
+                return configRuleCase_ == 6;
+            }
+
+            /**
+             * .context.ConfigRule_IPOWDM ipowdm = 6;
+             * @return The ipowdm.
+             */
+            @java.lang.Override
+            public context.ContextOuterClass.ConfigRule_IPOWDM getIpowdm() {
+                if (ipowdmBuilder_ == null) {
+                    if (configRuleCase_ == 6) {
+                        return (context.ContextOuterClass.ConfigRule_IPOWDM) configRule_;
+                    }
+                    return context.ContextOuterClass.ConfigRule_IPOWDM.getDefaultInstance();
+                } else {
+                    if (configRuleCase_ == 6) {
+                        return ipowdmBuilder_.getMessage();
+                    }
+                    return context.ContextOuterClass.ConfigRule_IPOWDM.getDefaultInstance();
+                }
+            }
+
+            /**
+             * .context.ConfigRule_IPOWDM ipowdm = 6;
+             */
+            public Builder setIpowdm(context.ContextOuterClass.ConfigRule_IPOWDM value) {
+                if (ipowdmBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    configRule_ = value;
+                    onChanged();
+                } else {
+                    ipowdmBuilder_.setMessage(value);
+                }
+                configRuleCase_ = 6;
+                return this;
+            }
+
+            /**
+             * .context.ConfigRule_IPOWDM ipowdm = 6;
+             */
+            public Builder setIpowdm(context.ContextOuterClass.ConfigRule_IPOWDM.Builder builderForValue) {
+                if (ipowdmBuilder_ == null) {
+                    configRule_ = builderForValue.build();
+                    onChanged();
+                } else {
+                    ipowdmBuilder_.setMessage(builderForValue.build());
+                }
+                configRuleCase_ = 6;
+                return this;
+            }
+
+            /**
+             * .context.ConfigRule_IPOWDM ipowdm = 6;
+             */
+            public Builder mergeIpowdm(context.ContextOuterClass.ConfigRule_IPOWDM value) {
+                if (ipowdmBuilder_ == null) {
+                    if (configRuleCase_ == 6 && configRule_ != context.ContextOuterClass.ConfigRule_IPOWDM.getDefaultInstance()) {
+                        configRule_ = context.ContextOuterClass.ConfigRule_IPOWDM.newBuilder((context.ContextOuterClass.ConfigRule_IPOWDM) configRule_).mergeFrom(value).buildPartial();
+                    } else {
+                        configRule_ = value;
+                    }
+                    onChanged();
+                } else {
+                    if (configRuleCase_ == 6) {
+                        ipowdmBuilder_.mergeFrom(value);
+                    } else {
+                        ipowdmBuilder_.setMessage(value);
+                    }
+                }
+                configRuleCase_ = 6;
+                return this;
+            }
+
+            /**
+             * .context.ConfigRule_IPOWDM ipowdm = 6;
+             */
+            public Builder clearIpowdm() {
+                if (ipowdmBuilder_ == null) {
+                    if (configRuleCase_ == 6) {
+                        configRuleCase_ = 0;
+                        configRule_ = null;
+                        onChanged();
+                    }
+                } else {
+                    if (configRuleCase_ == 6) {
+                        configRuleCase_ = 0;
+                        configRule_ = null;
+                    }
+                    ipowdmBuilder_.clear();
+                }
+                return this;
+            }
+
+            /**
+             * .context.ConfigRule_IPOWDM ipowdm = 6;
+             */
+            public context.ContextOuterClass.ConfigRule_IPOWDM.Builder getIpowdmBuilder() {
+                return getIpowdmFieldBuilder().getBuilder();
+            }
+
+            /**
+             * .context.ConfigRule_IPOWDM ipowdm = 6;
+             */
+            @java.lang.Override
+            public context.ContextOuterClass.ConfigRule_IPOWDMOrBuilder getIpowdmOrBuilder() {
+                if ((configRuleCase_ == 6) && (ipowdmBuilder_ != null)) {
+                    return ipowdmBuilder_.getMessageOrBuilder();
+                } else {
+                    if (configRuleCase_ == 6) {
+                        return (context.ContextOuterClass.ConfigRule_IPOWDM) configRule_;
+                    }
+                    return context.ContextOuterClass.ConfigRule_IPOWDM.getDefaultInstance();
+                }
+            }
+
+            /**
+             * .context.ConfigRule_IPOWDM ipowdm = 6;
+             */
+            private com.google.protobuf.SingleFieldBuilderV3 getIpowdmFieldBuilder() {
+                if (ipowdmBuilder_ == null) {
+                    if (!(configRuleCase_ == 6)) {
+                        configRule_ = context.ContextOuterClass.ConfigRule_IPOWDM.getDefaultInstance();
+                    }
+                    ipowdmBuilder_ = new com.google.protobuf.SingleFieldBuilderV3((context.ContextOuterClass.ConfigRule_IPOWDM) configRule_, getParentForChildren(), isClean());
+                    configRule_ = null;
+                }
+                configRuleCase_ = 6;
+                onChanged();
+                return ipowdmBuilder_;
+            }
+
             @java.lang.Override
             public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) {
                 return super.setUnknownFields(unknownFields);
@@ -87855,6 +89987,14 @@ public final class ContextOuterClass {
 
     private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ConfigRule_ACL_fieldAccessorTable;
 
+    private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ConfigRule_IPOWDM_descriptor;
+
+    private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ConfigRule_IPOWDM_fieldAccessorTable;
+
+    private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ConfigRule_TAPI_LSP_descriptor;
+
+    private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ConfigRule_TAPI_LSP_fieldAccessorTable;
+
     private static final com.google.protobuf.Descriptors.Descriptor internal_static_context_ConfigRule_IP_LINK_descriptor;
 
     private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_context_ConfigRule_IP_LINK_fieldAccessorTable;
@@ -87998,8 +90138,8 @@ public final class ContextOuterClass {
     private static com.google.protobuf.Descriptors.FileDescriptor descriptor;
 
     static {
-        java.lang.String[] descriptorData = { "\n\rcontext.proto\022\007context\032\031google/protobu" + "f/any.proto\032\tacl.proto\032\rip_link.proto\032\026k" + "pi_sample_types.proto\"\007\n\005Empty\"\024\n\004Uuid\022\014" + "\n\004uuid\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.conte" + "xt.Timestamp\022*\n\nevent_type\030\002 \001(\0162\026.conte" + "xt.EventTypeEnum\"\265\002\n\010AnyEvent\022(\n\007context" + "\030\001 \001(\0132\025.context.ContextEventH\000\022*\n\010topol" + "ogy\030\002 \001(\0132\026.context.TopologyEventH\000\022&\n\006d" + "evice\030\003 \001(\0132\024.context.DeviceEventH\000\022\"\n\004l" + "ink\030\004 \001(\0132\022.context.LinkEventH\000\022(\n\007servi" + "ce\030\005 \001(\0132\025.context.ServiceEventH\000\022$\n\005sli" + "ce\030\006 \001(\0132\023.context.SliceEventH\000\022.\n\nconne" + "ction\030\007 \001(\0132\030.context.ConnectionEventH\000B" + "\007\n\005event\"0\n\tContextId\022#\n\014context_uuid\030\001 " + "\001(\0132\r.context.Uuid\"\351\001\n\007Context\022&\n\ncontex" + "t_id\030\001 \001(\0132\022.context.ContextId\022\014\n\004name\030\002" + " \001(\t\022)\n\014topology_ids\030\003 \003(\0132\023.context.Top" + "ologyId\022\'\n\013service_ids\030\004 \003(\0132\022.context.S" + "erviceId\022#\n\tslice_ids\030\005 \003(\0132\020.context.Sl" + "iceId\022/\n\ncontroller\030\006 \001(\0132\033.context.Tera" + "FlowController\"8\n\rContextIdList\022\'\n\013conte" + "xt_ids\030\001 \003(\0132\022.context.ContextId\"1\n\013Cont" + "extList\022\"\n\010contexts\030\001 \003(\0132\020.context.Cont" + "ext\"U\n\014ContextEvent\022\035\n\005event\030\001 \001(\0132\016.con" + "text.Event\022&\n\ncontext_id\030\002 \001(\0132\022.context" + ".ContextId\"Z\n\nTopologyId\022&\n\ncontext_id\030\001" + " \001(\0132\022.context.ContextId\022$\n\rtopology_uui" + "d\030\002 \001(\0132\r.context.Uuid\"\267\001\n\010Topology\022(\n\013t" + "opology_id\030\001 \001(\0132\023.context.TopologyId\022\014\n" + "\004name\030\002 \001(\t\022%\n\ndevice_ids\030\003 \003(\0132\021.contex" + "t.DeviceId\022!\n\010link_ids\030\004 \003(\0132\017.context.L" + "inkId\022)\n\020optical_link_ids\030\005 \003(\0132\017.contex" + "t.LinkId\"\266\001\n\017TopologyDetails\022(\n\013topology" + "_id\030\001 \001(\0132\023.context.TopologyId\022\014\n\004name\030\002" + " \001(\t\022 \n\007devices\030\003 \003(\0132\017.context.Device\022\034" + "\n\005links\030\004 \003(\0132\r.context.Link\022+\n\roptical_" + "links\030\005 \003(\0132\024.context.OpticalLink\";\n\016Top" + "ologyIdList\022)\n\014topology_ids\030\001 \003(\0132\023.cont" + "ext.TopologyId\"5\n\014TopologyList\022%\n\ntopolo" + "gies\030\001 \003(\0132\021.context.Topology\"X\n\rTopolog" + "yEvent\022\035\n\005event\030\001 \001(\0132\016.context.Event\022(\n" + "\013topology_id\030\002 \001(\0132\023.context.TopologyId\"" + ".\n\010DeviceId\022\"\n\013device_uuid\030\001 \001(\0132\r.conte" + "xt.Uuid\"\372\002\n\006Device\022$\n\tdevice_id\030\001 \001(\0132\021." + "context.DeviceId\022\014\n\004name\030\002 \001(\t\022\023\n\013device" + "_type\030\003 \001(\t\022,\n\rdevice_config\030\004 \001(\0132\025.con" + "text.DeviceConfig\022G\n\031device_operational_" + "status\030\005 \001(\0162$.context.DeviceOperational" + "StatusEnum\0221\n\016device_drivers\030\006 \003(\0162\031.con" + "text.DeviceDriverEnum\022+\n\020device_endpoint" + "s\030\007 \003(\0132\021.context.EndPoint\022&\n\ncomponents" + "\030\010 \003(\0132\022.context.Component\022(\n\rcontroller" + "_id\030\t \001(\0132\021.context.DeviceId\"\311\001\n\tCompone" + "nt\022%\n\016component_uuid\030\001 \001(\0132\r.context.Uui" + "d\022\014\n\004name\030\002 \001(\t\022\014\n\004type\030\003 \001(\t\0226\n\nattribu" + "tes\030\004 \003(\0132\".context.Component.Attributes" + "Entry\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\014Devi" + "ceConfig\022)\n\014config_rules\030\001 \003(\0132\023.context" + ".ConfigRule\"5\n\014DeviceIdList\022%\n\ndevice_id" + "s\030\001 \003(\0132\021.context.DeviceId\".\n\nDeviceList" + "\022 \n\007devices\030\001 \003(\0132\017.context.Device\"\216\001\n\014D" + "eviceFilter\022)\n\ndevice_ids\030\001 \001(\0132\025.contex" + "t.DeviceIdList\022\031\n\021include_endpoints\030\002 \001(" + "\010\022\034\n\024include_config_rules\030\003 \001(\010\022\032\n\022inclu" + "de_components\030\004 \001(\010\"\200\001\n\013DeviceEvent\022\035\n\005e" + "vent\030\001 \001(\0132\016.context.Event\022$\n\tdevice_id\030" + "\002 \001(\0132\021.context.DeviceId\022,\n\rdevice_confi" + "g\030\003 \001(\0132\025.context.DeviceConfig\"*\n\006LinkId" + "\022 \n\tlink_uuid\030\001 \001(\0132\r.context.Uuid\"c\n\016Li" + "nkAttributes\022\030\n\020is_bidirectional\030\001 \001(\010\022\033" + "\n\023total_capacity_gbps\030\002 \001(\002\022\032\n\022used_capa" + "city_gbps\030\003 \001(\002\"\275\001\n\004Link\022 \n\007link_id\030\001 \001(" + "\0132\017.context.LinkId\022\014\n\004name\030\002 \001(\t\022(\n\tlink" + "_type\030\003 \001(\0162\025.context.LinkTypeEnum\022.\n\021li" + "nk_endpoint_ids\030\004 \003(\0132\023.context.EndPoint" + "Id\022+\n\nattributes\030\005 \001(\0132\027.context.LinkAtt" + "ributes\"/\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\tLinkEvent\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.ServiceId\022\014" + "\n\004name\030\002 \001(\t\022.\n\014service_type\030\003 \001(\0162\030.con" + "text.ServiceTypeEnum\0221\n\024service_endpoint" + "_ids\030\004 \003(\0132\023.context.EndPointId\0220\n\023servi" + "ce_constraints\030\005 \003(\0132\023.context.Constrain" + "t\022.\n\016service_status\030\006 \001(\0132\026.context.Serv" + "iceStatus\022.\n\016service_config\030\007 \001(\0132\026.cont" + "ext.ServiceConfig\022%\n\ttimestamp\030\010 \001(\0132\022.c" + "ontext.Timestamp\"C\n\rServiceStatus\0222\n\016ser" + "vice_status\030\001 \001(\0162\032.context.ServiceStatu" + "sEnum\":\n\rServiceConfig\022)\n\014config_rules\030\001" + " \003(\0132\023.context.ConfigRule\"8\n\rServiceIdLi" + "st\022\'\n\013service_ids\030\001 \003(\0132\022.context.Servic" + "eId\"1\n\013ServiceList\022\"\n\010services\030\001 \003(\0132\020.c" + "ontext.Service\"\225\001\n\rServiceFilter\022+\n\013serv" + "ice_ids\030\001 \001(\0132\026.context.ServiceIdList\022\034\n" + "\024include_endpoint_ids\030\002 \001(\010\022\033\n\023include_c" + "onstraints\030\003 \001(\010\022\034\n\024include_config_rules" + "\030\004 \001(\010\"U\n\014ServiceEvent\022\035\n\005event\030\001 \001(\0132\016." + "context.Event\022&\n\nservice_id\030\002 \001(\0132\022.cont" + "ext.ServiceId\"T\n\007SliceId\022&\n\ncontext_id\030\001" + " \001(\0132\022.context.ContextId\022!\n\nslice_uuid\030\002" + " \001(\0132\r.context.Uuid\"\240\003\n\005Slice\022\"\n\010slice_i" + "d\030\001 \001(\0132\020.context.SliceId\022\014\n\004name\030\002 \001(\t\022" + "/\n\022slice_endpoint_ids\030\003 \003(\0132\023.context.En" + "dPointId\022.\n\021slice_constraints\030\004 \003(\0132\023.co" + "ntext.Constraint\022-\n\021slice_service_ids\030\005 " + "\003(\0132\022.context.ServiceId\022,\n\022slice_subslic" + "e_ids\030\006 \003(\0132\020.context.SliceId\022*\n\014slice_s" + "tatus\030\007 \001(\0132\024.context.SliceStatus\022*\n\014sli" + "ce_config\030\010 \001(\0132\024.context.SliceConfig\022(\n" + "\013slice_owner\030\t \001(\0132\023.context.SliceOwner\022" + "%\n\ttimestamp\030\n \001(\0132\022.context.Timestamp\"E" + "\n\nSliceOwner\022!\n\nowner_uuid\030\001 \001(\0132\r.conte" + "xt.Uuid\022\024\n\014owner_string\030\002 \001(\t\"=\n\013SliceSt" + "atus\022.\n\014slice_status\030\001 \001(\0162\030.context.Sli" + "ceStatusEnum\"8\n\013SliceConfig\022)\n\014config_ru" + "les\030\001 \003(\0132\023.context.ConfigRule\"2\n\013SliceI" + "dList\022#\n\tslice_ids\030\001 \003(\0132\020.context.Slice" + "Id\"+\n\tSliceList\022\036\n\006slices\030\001 \003(\0132\016.contex" + "t.Slice\"\312\001\n\013SliceFilter\022\'\n\tslice_ids\030\001 \001" + "(\0132\024.context.SliceIdList\022\034\n\024include_endp" + "oint_ids\030\002 \001(\010\022\033\n\023include_constraints\030\003 " + "\001(\010\022\033\n\023include_service_ids\030\004 \001(\010\022\034\n\024incl" + "ude_subslice_ids\030\005 \001(\010\022\034\n\024include_config" + "_rules\030\006 \001(\010\"O\n\nSliceEvent\022\035\n\005event\030\001 \001(" + "\0132\016.context.Event\022\"\n\010slice_id\030\002 \001(\0132\020.co" + "ntext.SliceId\"6\n\014ConnectionId\022&\n\017connect" + "ion_uuid\030\001 \001(\0132\r.context.Uuid\"2\n\025Connect" + "ionSettings_L0\022\031\n\021lsp_symbolic_name\030\001 \001(" + "\t\"\236\001\n\025ConnectionSettings_L2\022\027\n\017src_mac_a" + "ddress\030\001 \001(\t\022\027\n\017dst_mac_address\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\nmp" + "ls_label\030\005 \001(\r\022\032\n\022mpls_traffic_class\030\006 \001" + "(\r\"t\n\025ConnectionSettings_L3\022\026\n\016src_ip_ad" + "dress\030\001 \001(\t\022\026\n\016dst_ip_address\030\002 \001(\t\022\014\n\004d" + "scp\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\010src_port\030\001 " + "\001(\r\022\020\n\010dst_port\030\002 \001(\r\022\021\n\ttcp_flags\030\003 \001(\r" + "\022\013\n\003ttl\030\004 \001(\r\"\304\001\n\022ConnectionSettings\022*\n\002" + "l0\030\001 \001(\0132\036.context.ConnectionSettings_L0" + "\022*\n\002l2\030\002 \001(\0132\036.context.ConnectionSetting" + "s_L2\022*\n\002l3\030\003 \001(\0132\036.context.ConnectionSet" + "tings_L3\022*\n\002l4\030\004 \001(\0132\036.context.Connectio" + "nSettings_L4\"\363\001\n\nConnection\022,\n\rconnectio" + "n_id\030\001 \001(\0132\025.context.ConnectionId\022&\n\nser" + "vice_id\030\002 \001(\0132\022.context.ServiceId\0223\n\026pat" + "h_hops_endpoint_ids\030\003 \003(\0132\023.context.EndP" + "ointId\022+\n\017sub_service_ids\030\004 \003(\0132\022.contex" + "t.ServiceId\022-\n\010settings\030\005 \001(\0132\033.context." + "ConnectionSettings\"A\n\020ConnectionIdList\022-" + "\n\016connection_ids\030\001 \003(\0132\025.context.Connect" + "ionId\":\n\016ConnectionList\022(\n\013connections\030\001" + " \003(\0132\023.context.Connection\"^\n\017ConnectionE" + "vent\022\035\n\005event\030\001 \001(\0132\016.context.Event\022,\n\rc" + "onnection_id\030\002 \001(\0132\025.context.ConnectionI" + "d\"\202\001\n\nEndPointId\022(\n\013topology_id\030\001 \001(\0132\023." + "context.TopologyId\022$\n\tdevice_id\030\002 \001(\0132\021." + "context.DeviceId\022$\n\rendpoint_uuid\030\003 \001(\0132" + "\r.context.Uuid\"\310\002\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\020kpi_sample" + "_types\030\004 \003(\0162\037.kpi_sample_types.KpiSampl" + "eType\022,\n\021endpoint_location\030\005 \001(\0132\021.conte" + "xt.Location\0229\n\014capabilities\030\006 \003(\0132#.cont" + "ext.EndPoint.CapabilitiesEntry\032I\n\021Capabi" + "litiesEntry\022\013\n\003key\030\001 \001(\t\022#\n\005value\030\002 \001(\0132" + "\024.google.protobuf.Any:\0028\001\"{\n\014EndPointNam" + "e\022(\n\013endpoint_id\030\001 \001(\0132\023.context.EndPoin" + "tId\022\023\n\013device_name\030\002 \001(\t\022\025\n\rendpoint_nam" + "e\030\003 \001(\t\022\025\n\rendpoint_type\030\004 \001(\t\";\n\016EndPoi" + "ntIdList\022)\n\014endpoint_ids\030\001 \003(\0132\023.context" + ".EndPointId\"A\n\020EndPointNameList\022-\n\016endpo" + "int_names\030\001 \003(\0132\025.context.EndPointName\"A" + "\n\021ConfigRule_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.EndPo" + "intId\022!\n\010rule_set\030\002 \001(\0132\017.acl.AclRuleSet" + "\"h\n\022ConfigRule_IP_LINK\022(\n\013endpoint_id\030\001 " + "\001(\0132\023.context.EndPointId\022(\n\010rule_set\030\002 \001" + "(\0132\026.ip_link.IpLinkRuleSet\"\314\001\n\nConfigRul" + "e\022)\n\006action\030\001 \001(\0162\031.context.ConfigAction" + "Enum\022,\n\006custom\030\002 \001(\0132\032.context.ConfigRul" + "e_CustomH\000\022&\n\003acl\030\003 \001(\0132\027.context.Config" + "Rule_ACLH\000\022.\n\007ip_link\030\004 \001(\0132\033.context.Co" + "nfigRule_IP_LINKH\000B\r\n\013config_rule\"F\n\021Con" + "straint_Custom\022\027\n\017constraint_type\030\001 \001(\t\022" + "\030\n\020constraint_value\030\002 \001(\t\"E\n\023Constraint_" + "Schedule\022\027\n\017start_timestamp\030\001 \001(\001\022\025\n\rdur" + "ation_days\030\002 \001(\002\"3\n\014GPS_Position\022\020\n\010lati" + "tude\030\001 \001(\002\022\021\n\tlongitude\030\002 \001(\002\"\204\001\n\010Locati" + "on\022\020\n\006region\030\001 \001(\tH\000\022-\n\014gps_position\030\002 \001" + "(\0132\025.context.GPS_PositionH\000\022\023\n\tinterface" + "\030\003 \001(\tH\000\022\026\n\014circuit_pack\030\004 \001(\tH\000B\n\n\010loca" + "tion\"l\n\033Constraint_EndPointLocation\022(\n\013e" + "ndpoint_id\030\001 \001(\0132\023.context.EndPointId\022#\n" + "\010location\030\002 \001(\0132\021.context.Location\"Y\n\033Co" + "nstraint_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_l" + "atency_ms\030\001 \001(\002\"0\n\027Constraint_SLA_Capaci" + "ty\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\017isolation_level\030\001 \003(\0162\033.context.Isol" + "ationLevelEnum\"\242\001\n\025Constraint_Exclusions" + "\022\024\n\014is_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\"5\n\014QoSProfileId\022%\n\016q" + "os_profile_id\030\001 \001(\0132\r.context.Uuid\"`\n\025Co" + "nstraint_QoSProfile\022-\n\016qos_profile_id\030\001 " + "\001(\0132\025.context.QoSProfileId\022\030\n\020qos_profil" + "e_name\030\002 \001(\t\"\222\005\n\nConstraint\022-\n\006action\030\001 " + "\001(\0162\035.context.ConstraintActionEnum\022,\n\006cu" + "stom\030\002 \001(\0132\032.context.Constraint_CustomH\000" + "\0220\n\010schedule\030\003 \001(\0132\034.context.Constraint_" + "ScheduleH\000\022A\n\021endpoint_location\030\004 \001(\0132$." + "context.Constraint_EndPointLocationH\000\022A\n" + "\021endpoint_priority\030\005 \001(\0132$.context.Const" + "raint_EndPointPriorityH\000\0228\n\014sla_capacity" + "\030\006 \001(\0132 .context.Constraint_SLA_Capacity" + "H\000\0226\n\013sla_latency\030\007 \001(\0132\037.context.Constr" + "aint_SLA_LatencyH\000\022@\n\020sla_availability\030\010" + " \001(\0132$.context.Constraint_SLA_Availabili" + "tyH\000\022@\n\rsla_isolation\030\t \001(\0132\'.context.Co" + "nstraint_SLA_Isolation_levelH\000\0224\n\nexclus" + "ions\030\n \001(\0132\036.context.Constraint_Exclusio" + "nsH\000\0225\n\013qos_profile\030\013 \001(\0132\036.context.Cons" + "traint_QoSProfileH\000B\014\n\nconstraint\"^\n\022Ter" + "aFlowController\022&\n\ncontext_id\030\001 \001(\0132\022.co" + "ntext.ContextId\022\022\n\nip_address\030\002 \001(\t\022\014\n\004p" + "ort\030\003 \001(\r\"U\n\024AuthenticationResult\022&\n\ncon" + "text_id\030\001 \001(\0132\022.context.ContextId\022\025\n\raut" + "henticated\030\002 \001(\010\"-\n\017OpticalConfigId\022\032\n\022o" + "pticalconfig_uuid\030\001 \001(\t\"y\n\rOpticalConfig" + "\0222\n\020opticalconfig_id\030\001 \001(\0132\030.context.Opt" + "icalConfigId\022\016\n\006config\030\002 \001(\t\022$\n\tdevice_i" + "d\030\003 \001(\0132\021.context.DeviceId\"C\n\021OpticalCon" + "figList\022.\n\016opticalconfigs\030\001 \003(\0132\026.contex" + "t.OpticalConfig\"g\n\022OpticalConfigEvent\022\035\n" + "\005event\030\001 \001(\0132\016.context.Event\0222\n\020opticalc" + "onfig_id\030\002 \001(\0132\030.context.OpticalConfigId" + "\"_\n\021OpticalEndPointId\022$\n\tdevice_id\030\002 \001(\013" + "2\021.context.DeviceId\022$\n\rendpoint_uuid\030\003 \001" + "(\0132\r.context.Uuid\">\n\017OpticalLinkList\022+\n\r" + "optical_links\030\001 \003(\0132\024.context.OpticalLin" + "k\"\304\003\n\022OpticalLinkDetails\022\016\n\006length\030\001 \001(\002" + "\022\020\n\010src_port\030\002 \001(\t\022\020\n\010dst_port\030\003 \001(\t\022\027\n\017" + "local_peer_port\030\004 \001(\t\022\030\n\020remote_peer_por" + "t\030\005 \001(\t\022\014\n\004used\030\006 \001(\010\0228\n\007c_slots\030\007 \003(\0132\'" + ".context.OpticalLinkDetails.CSlotsEntry\022" + "8\n\007l_slots\030\010 \003(\0132\'.context.OpticalLinkDe" + "tails.LSlotsEntry\0228\n\007s_slots\030\t \003(\0132\'.con" + "text.OpticalLinkDetails.SSlotsEntry\032-\n\013C" + "SlotsEntry\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\002" + "8\001\032-\n\013LSlotsEntry\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030" + "\002 \001(\005:\0028\001\032-\n\013SSlotsEntry\022\013\n\003key\030\001 \001(\t\022\r\n" + "\005value\030\002 \001(\005:\0028\001\"\243\001\n\013OpticalLink\022\014\n\004name" + "\030\001 \001(\t\0224\n\017optical_details\030\002 \001(\0132\033.contex" + "t.OpticalLinkDetails\022 \n\007link_id\030\003 \001(\0132\017." + "context.LinkId\022.\n\021link_endpoint_ids\030\004 \003(" + "\0132\023.context.EndPointId\"0\n\tChannelId\022#\n\014c" + "hannel_uuid\030\001 \001(\0132\r.context.Uuid\"8\n\rOpti" + "calBandId\022\'\n\020opticalband_uuid\030\001 \001(\0132\r.co" + "ntext.Uuid\"\247\002\n\013OpticalBand\022.\n\016opticalban" + "d_id\030\001 \001(\0132\026.context.OpticalBandId\022,\n\rco" + "nnection_id\030\002 \001(\0132\025.context.ConnectionId" + "\022&\n\nchannel_id\030\003 \001(\0132\022.context.ChannelId" + "\022&\n\nservice_id\030\004 \001(\0132\022.context.ServiceId" + "\022#\n\007service\030\005 \001(\0132\020.context.ServiceH\000\022)\n" + "\nconnection\030\006 \001(\0132\023.context.ConnectionH\000" + "\022\021\n\007channel\030\007 \001(\tH\000B\007\n\005field\"=\n\017OpticalB" + "andList\022*\n\014opticalbands\030\001 \003(\0132\024.context." + "OpticalBand\"r\n\021ServiceConfigRule\022&\n\nserv" + "ice_id\030\001 \001(\0132\022.context.ServiceId\0225\n\021conf" + "igrule_custom\030\002 \001(\0132\032.context.ConfigRule" + "_Custom*j\n\rEventTypeEnum\022\027\n\023EVENTTYPE_UN" + "DEFINED\020\000\022\024\n\020EVENTTYPE_CREATE\020\001\022\024\n\020EVENT" + "TYPE_UPDATE\020\002\022\024\n\020EVENTTYPE_REMOVE\020\003*\333\004\n\020" + "DeviceDriverEnum\022\032\n\026DEVICEDRIVER_UNDEFIN" + "ED\020\000\022\033\n\027DEVICEDRIVER_OPENCONFIG\020\001\022\036\n\032DEV" + "ICEDRIVER_TRANSPORT_API\020\002\022\023\n\017DEVICEDRIVE" + "R_P4\020\003\022&\n\"DEVICEDRIVER_IETF_NETWORK_TOPO" + "LOGY\020\004\022\033\n\027DEVICEDRIVER_ONF_TR_532\020\005\022\023\n\017D" + "EVICEDRIVER_XR\020\006\022\033\n\027DEVICEDRIVER_IETF_L2" + "VPN\020\007\022 \n\034DEVICEDRIVER_GNMI_OPENCONFIG\020\010\022" + "\034\n\030DEVICEDRIVER_OPTICAL_TFS\020\t\022\032\n\026DEVICED" + "RIVER_IETF_ACTN\020\n\022\023\n\017DEVICEDRIVER_OC\020\013\022\024" + "\n\020DEVICEDRIVER_QKD\020\014\022\033\n\027DEVICEDRIVER_IET" + "F_L3VPN\020\r\022\033\n\027DEVICEDRIVER_IETF_SLICE\020\016\022\024" + "\n\020DEVICEDRIVER_NCE\020\017\022\031\n\025DEVICEDRIVER_SMA" + "RTNIC\020\020\022\031\n\025DEVICEDRIVER_MORPHEUS\020\021\022\024\n\020DE" + "VICEDRIVER_RYU\020\022\022#\n\037DEVICEDRIVER_GNMI_NO" + "KIA_SRLINUX\020\023\022\032\n\026DEVICEDRIVER_OPENROADM\020" + "\024*\217\001\n\033DeviceOperationalStatusEnum\022%\n!DEV" + "ICEOPERATIONALSTATUS_UNDEFINED\020\000\022$\n DEVI" + "CEOPERATIONALSTATUS_DISABLED\020\001\022#\n\037DEVICE" + "OPERATIONALSTATUS_ENABLED\020\002*\245\001\n\014LinkType" + "Enum\022\024\n\020LINKTYPE_UNKNOWN\020\000\022\023\n\017LINKTYPE_C" + "OPPER\020\001\022\022\n\016LINKTYPE_FIBER\020\002\022\022\n\016LINKTYPE_" + "RADIO\020\003\022\024\n\020LINKTYPE_VIRTUAL\020\004\022\027\n\023LINKTYP" + "E_MANAGEMENT\020\005\022\023\n\017LINKTYPE_REMOTE\020\006*\276\002\n\017" + "ServiceTypeEnum\022\027\n\023SERVICETYPE_UNKNOWN\020\000" + "\022\024\n\020SERVICETYPE_L3NM\020\001\022\024\n\020SERVICETYPE_L2" + "NM\020\002\022)\n%SERVICETYPE_TAPI_CONNECTIVITY_SE" + "RVICE\020\003\022\022\n\016SERVICETYPE_TE\020\004\022\023\n\017SERVICETY" + "PE_E2E\020\005\022$\n SERVICETYPE_OPTICAL_CONNECTI" + "VITY\020\006\022\023\n\017SERVICETYPE_QKD\020\007\022\024\n\020SERVICETY" + "PE_L1NM\020\010\022\023\n\017SERVICETYPE_INT\020\t\022\023\n\017SERVIC" + "ETYPE_ACL\020\n\022\027\n\023SERVICETYPE_IP_LINK\020\013*\304\001\n" + "\021ServiceStatusEnum\022\033\n\027SERVICESTATUS_UNDE" + "FINED\020\000\022\031\n\025SERVICESTATUS_PLANNED\020\001\022\030\n\024SE" + "RVICESTATUS_ACTIVE\020\002\022\032\n\026SERVICESTATUS_UP" + "DATING\020\003\022!\n\035SERVICESTATUS_PENDING_REMOVA" + "L\020\004\022\036\n\032SERVICESTATUS_SLA_VIOLATED\020\005*\251\001\n\017" + "SliceStatusEnum\022\031\n\025SLICESTATUS_UNDEFINED" + "\020\000\022\027\n\023SLICESTATUS_PLANNED\020\001\022\024\n\020SLICESTAT" + "US_INIT\020\002\022\026\n\022SLICESTATUS_ACTIVE\020\003\022\026\n\022SLI" + "CESTATUS_DEINIT\020\004\022\034\n\030SLICESTATUS_SLA_VIO" + "LATED\020\005*]\n\020ConfigActionEnum\022\032\n\026CONFIGACT" + "ION_UNDEFINED\020\000\022\024\n\020CONFIGACTION_SET\020\001\022\027\n" + "\023CONFIGACTION_DELETE\020\002*m\n\024ConstraintActi" + "onEnum\022\036\n\032CONSTRAINTACTION_UNDEFINED\020\000\022\030" + "\n\024CONSTRAINTACTION_SET\020\001\022\033\n\027CONSTRAINTAC" + "TION_DELETE\020\002*\203\002\n\022IsolationLevelEnum\022\020\n\014" + "NO_ISOLATION\020\000\022\026\n\022PHYSICAL_ISOLATION\020\001\022\025" + "\n\021LOGICAL_ISOLATION\020\002\022\025\n\021PROCESS_ISOLATI" + "ON\020\003\022\035\n\031PHYSICAL_MEMORY_ISOLATION\020\004\022\036\n\032P" + "HYSICAL_NETWORK_ISOLATION\020\005\022\036\n\032VIRTUAL_R" + "ESOURCE_ISOLATION\020\006\022\037\n\033NETWORK_FUNCTIONS" + "_ISOLATION\020\007\022\025\n\021SERVICE_ISOLATION\020\0102\274\035\n\016" + "ContextService\022:\n\016ListContextIds\022\016.conte" + "xt.Empty\032\026.context.ContextIdList\"\000\0226\n\014Li" + "stContexts\022\016.context.Empty\032\024.context.Con" + "textList\"\000\0224\n\nGetContext\022\022.context.Conte" + "xtId\032\020.context.Context\"\000\0224\n\nSetContext\022\020" + ".context.Context\032\022.context.ContextId\"\000\0225" + "\n\rRemoveContext\022\022.context.ContextId\032\016.co" + "ntext.Empty\"\000\022=\n\020GetContextEvents\022\016.cont" + "ext.Empty\032\025.context.ContextEvent\"\0000\001\022@\n\017" + "ListTopologyIds\022\022.context.ContextId\032\027.co" + "ntext.TopologyIdList\"\000\022=\n\016ListTopologies" + "\022\022.context.ContextId\032\025.context.TopologyL" + "ist\"\000\0227\n\013GetTopology\022\023.context.TopologyI" + "d\032\021.context.Topology\"\000\022E\n\022GetTopologyDet" + "ails\022\023.context.TopologyId\032\030.context.Topo" + "logyDetails\"\000\0227\n\013SetTopology\022\021.context.T" + "opology\032\023.context.TopologyId\"\000\0227\n\016Remove" + "Topology\022\023.context.TopologyId\032\016.context." + "Empty\"\000\022?\n\021GetTopologyEvents\022\016.context.E" + "mpty\032\026.context.TopologyEvent\"\0000\001\0228\n\rList" + "DeviceIds\022\016.context.Empty\032\025.context.Devi" + "ceIdList\"\000\0224\n\013ListDevices\022\016.context.Empt" + "y\032\023.context.DeviceList\"\000\0221\n\tGetDevice\022\021." + "context.DeviceId\032\017.context.Device\"\000\0221\n\tS" + "etDevice\022\017.context.Device\032\021.context.Devi" + "ceId\"\000\0223\n\014RemoveDevice\022\021.context.DeviceI" + "d\032\016.context.Empty\"\000\022;\n\017GetDeviceEvents\022\016" + ".context.Empty\032\024.context.DeviceEvent\"\0000\001" + "\022<\n\014SelectDevice\022\025.context.DeviceFilter\032" + "\023.context.DeviceList\"\000\022I\n\021ListEndPointNa" + "mes\022\027.context.EndPointIdList\032\031.context.E" + "ndPointNameList\"\000\0224\n\013ListLinkIds\022\016.conte" + "xt.Empty\032\023.context.LinkIdList\"\000\0220\n\tListL" + "inks\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.conte" + "xt.LinkId\"\000\022/\n\nRemoveLink\022\017.context.Link" + "Id\032\016.context.Empty\"\000\0227\n\rGetLinkEvents\022\016." + "context.Empty\032\022.context.LinkEvent\"\0000\001\022>\n" + "\016ListServiceIds\022\022.context.ContextId\032\026.co" + "ntext.ServiceIdList\"\000\022:\n\014ListServices\022\022." + "context.ContextId\032\024.context.ServiceList\"" + "\000\0224\n\nGetService\022\022.context.ServiceId\032\020.co" + "ntext.Service\"\000\0224\n\nSetService\022\020.context." + "Service\032\022.context.ServiceId\"\000\0226\n\014UnsetSe" + "rvice\022\020.context.Service\032\022.context.Servic" + "eId\"\000\0225\n\rRemoveService\022\022.context.Service" + "Id\032\016.context.Empty\"\000\022=\n\020GetServiceEvents" + "\022\016.context.Empty\032\025.context.ServiceEvent\"" + "\0000\001\022?\n\rSelectService\022\026.context.ServiceFi" + "lter\032\024.context.ServiceList\"\000\022:\n\014ListSlic" + "eIds\022\022.context.ContextId\032\024.context.Slice" + "IdList\"\000\0226\n\nListSlices\022\022.context.Context" + "Id\032\022.context.SliceList\"\000\022.\n\010GetSlice\022\020.c" + "ontext.SliceId\032\016.context.Slice\"\000\022.\n\010SetS" + "lice\022\016.context.Slice\032\020.context.SliceId\"\000" + "\0220\n\nUnsetSlice\022\016.context.Slice\032\020.context" + ".SliceId\"\000\0221\n\013RemoveSlice\022\020.context.Slic" + "eId\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." + "context.SliceList\"\000\022D\n\021ListConnectionIds", "\022\022.context.ServiceId\032\031.context.Connectio" + "nIdList\"\000\022@\n\017ListConnections\022\022.context.S" + "erviceId\032\027.context.ConnectionList\"\000\022=\n\rG" + "etConnection\022\025.context.ConnectionId\032\023.co" + "ntext.Connection\"\000\022=\n\rSetConnection\022\023.co" + "ntext.Connection\032\025.context.ConnectionId\"" + "\000\022;\n\020RemoveConnection\022\025.context.Connecti" + "onId\032\016.context.Empty\"\000\022C\n\023GetConnectionE" + "vents\022\016.context.Empty\032\030.context.Connecti" + "onEvent\"\0000\001\0225\n\014GetAllEvents\022\016.context.Em" + "pty\032\021.context.AnyEvent\"\0000\001\022@\n\020GetOptical" + "Config\022\016.context.Empty\032\032.context.Optical" + "ConfigList\"\000\022F\n\020SetOpticalConfig\022\026.conte" + "xt.OpticalConfig\032\030.context.OpticalConfig" + "Id\"\000\022I\n\023UpdateOpticalConfig\022\026.context.Op" + "ticalConfig\032\030.context.OpticalConfigId\"\000\022" + "I\n\023SelectOpticalConfig\022\030.context.Optical" + "ConfigId\032\026.context.OpticalConfig\"\000\022A\n\023De" + "leteOpticalConfig\022\030.context.OpticalConfi" + "gId\032\016.context.Empty\"\000\022@\n\024DeleteOpticalCh" + "annel\022\026.context.OpticalConfig\032\016.context." + "Empty\"\000\0228\n\016SetOpticalLink\022\024.context.Opti" + "calLink\032\016.context.Empty\"\000\0229\n\016GetOpticalL" + "ink\022\017.context.LinkId\032\024.context.OpticalLi" + "nk\"\000\0226\n\021DeleteOpticalLink\022\017.context.Link" + "Id\032\016.context.Empty\"\000\022@\n\022GetOpticalLinkLi" + "st\022\016.context.Empty\032\030.context.OpticalLink" + "List\"\000\022<\n\016GetOpticalBand\022\016.context.Empty" + "\032\030.context.OpticalBandList\"\000\022C\n\021SelectOp" + "ticalBand\022\026.context.OpticalBandId\032\024.cont" + "ext.OpticalBand\"\000\022G\n\027DeleteServiceConfig" + "Rule\022\032.context.ServiceConfigRule\032\016.conte" + "xt.Empty\"\000b\006proto3" };
-        descriptor = com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] { com.google.protobuf.AnyProto.getDescriptor(), acl.Acl.getDescriptor(), ip_link.IpLink.getDescriptor(), kpi_sample_types.KpiSampleTypes.getDescriptor() });
+        java.lang.String[] descriptorData = { "\n\rcontext.proto\022\007context\032\031google/protobu" + "f/any.proto\032\tacl.proto\032\014ipowdm.proto\032\rip" + "_link.proto\032\026kpi_sample_types.proto\032\016tap" + "i_lsp.proto\"\007\n\005Empty\"\024\n\004Uuid\022\014\n\004uuid\030\001 \001" + "(\t\"\036\n\tTimestamp\022\021\n\ttimestamp\030\001 \001(\001\"Z\n\005Ev" + "ent\022%\n\ttimestamp\030\001 \001(\0132\022.context.Timesta" + "mp\022*\n\nevent_type\030\002 \001(\0162\026.context.EventTy" + "peEnum\"\265\002\n\010AnyEvent\022(\n\007context\030\001 \001(\0132\025.c" + "ontext.ContextEventH\000\022*\n\010topology\030\002 \001(\0132" + "\026.context.TopologyEventH\000\022&\n\006device\030\003 \001(" + "\0132\024.context.DeviceEventH\000\022\"\n\004link\030\004 \001(\0132" + "\022.context.LinkEventH\000\022(\n\007service\030\005 \001(\0132\025" + ".context.ServiceEventH\000\022$\n\005slice\030\006 \001(\0132\023" + ".context.SliceEventH\000\022.\n\nconnection\030\007 \001(" + "\0132\030.context.ConnectionEventH\000B\007\n\005event\"0" + "\n\tContextId\022#\n\014context_uuid\030\001 \001(\0132\r.cont" + "ext.Uuid\"\351\001\n\007Context\022&\n\ncontext_id\030\001 \001(\013" + "2\022.context.ContextId\022\014\n\004name\030\002 \001(\t\022)\n\014to" + "pology_ids\030\003 \003(\0132\023.context.TopologyId\022\'\n" + "\013service_ids\030\004 \003(\0132\022.context.ServiceId\022#" + "\n\tslice_ids\030\005 \003(\0132\020.context.SliceId\022/\n\nc" + "ontroller\030\006 \001(\0132\033.context.TeraFlowContro" + "ller\"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.context.Context\"U\n\014Con" + "textEvent\022\035\n\005event\030\001 \001(\0132\016.context.Event" + "\022&\n\ncontext_id\030\002 \001(\0132\022.context.ContextId" + "\"Z\n\nTopologyId\022&\n\ncontext_id\030\001 \001(\0132\022.con" + "text.ContextId\022$\n\rtopology_uuid\030\002 \001(\0132\r." + "context.Uuid\"\267\001\n\010Topology\022(\n\013topology_id" + "\030\001 \001(\0132\023.context.TopologyId\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.context.LinkId\022)\n\020o" + "ptical_link_ids\030\005 \003(\0132\017.context.LinkId\"\266" + "\001\n\017TopologyDetails\022(\n\013topology_id\030\001 \001(\0132" + "\023.context.TopologyId\022\014\n\004name\030\002 \001(\t\022 \n\007de" + "vices\030\003 \003(\0132\017.context.Device\022\034\n\005links\030\004 " + "\003(\0132\r.context.Link\022+\n\roptical_links\030\005 \003(" + "\0132\024.context.OpticalLink\";\n\016TopologyIdLis" + "t\022)\n\014topology_ids\030\001 \003(\0132\023.context.Topolo" + "gyId\"5\n\014TopologyList\022%\n\ntopologies\030\001 \003(\013" + "2\021.context.Topology\"X\n\rTopologyEvent\022\035\n\005" + "event\030\001 \001(\0132\016.context.Event\022(\n\013topology_" + "id\030\002 \001(\0132\023.context.TopologyId\".\n\010DeviceI" + "d\022\"\n\013device_uuid\030\001 \001(\0132\r.context.Uuid\"\372\002" + "\n\006Device\022$\n\tdevice_id\030\001 \001(\0132\021.context.De" + "viceId\022\014\n\004name\030\002 \001(\t\022\023\n\013device_type\030\003 \001(" + "\t\022,\n\rdevice_config\030\004 \001(\0132\025.context.Devic" + "eConfig\022G\n\031device_operational_status\030\005 \001" + "(\0162$.context.DeviceOperationalStatusEnum" + "\0221\n\016device_drivers\030\006 \003(\0162\031.context.Devic" + "eDriverEnum\022+\n\020device_endpoints\030\007 \003(\0132\021." + "context.EndPoint\022&\n\ncomponents\030\010 \003(\0132\022.c" + "ontext.Component\022(\n\rcontroller_id\030\t \001(\0132" + "\021.context.DeviceId\"\311\001\n\tComponent\022%\n\016comp" + "onent_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\nattributes\030\004 \003(\0132" + "\".context.Component.AttributesEntry\022\016\n\006p" + "arent\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\014DeviceConfig\022)" + "\n\014config_rules\030\001 \003(\0132\023.context.ConfigRul" + "e\"5\n\014DeviceIdList\022%\n\ndevice_ids\030\001 \003(\0132\021." + "context.DeviceId\".\n\nDeviceList\022 \n\007device" + "s\030\001 \003(\0132\017.context.Device\"\216\001\n\014DeviceFilte" + "r\022)\n\ndevice_ids\030\001 \001(\0132\025.context.DeviceId" + "List\022\031\n\021include_endpoints\030\002 \001(\010\022\034\n\024inclu" + "de_config_rules\030\003 \001(\010\022\032\n\022include_compone" + "nts\030\004 \001(\010\"\200\001\n\013DeviceEvent\022\035\n\005event\030\001 \001(\013" + "2\016.context.Event\022$\n\tdevice_id\030\002 \001(\0132\021.co" + "ntext.DeviceId\022,\n\rdevice_config\030\003 \001(\0132\025." + "context.DeviceConfig\"*\n\006LinkId\022 \n\tlink_u" + "uid\030\001 \001(\0132\r.context.Uuid\"c\n\016LinkAttribut" + "es\022\030\n\020is_bidirectional\030\001 \001(\010\022\033\n\023total_ca" + "pacity_gbps\030\002 \001(\002\022\032\n\022used_capacity_gbps\030" + "\003 \001(\002\"\275\001\n\004Link\022 \n\007link_id\030\001 \001(\0132\017.contex" + "t.LinkId\022\014\n\004name\030\002 \001(\t\022(\n\tlink_type\030\003 \001(" + "\0162\025.context.LinkTypeEnum\022.\n\021link_endpoin" + "t_ids\030\004 \003(\0132\023.context.EndPointId\022+\n\nattr" + "ibutes\030\005 \001(\0132\027.context.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.cont" + "ext.Link\"L\n\tLinkEvent\022\035\n\005event\030\001 \001(\0132\016.c" + "ontext.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.ServiceId\022\014\n\004name\030\002 \001" + "(\t\022.\n\014service_type\030\003 \001(\0162\030.context.Servi" + "ceTypeEnum\0221\n\024service_endpoint_ids\030\004 \003(\013" + "2\023.context.EndPointId\0220\n\023service_constra" + "ints\030\005 \003(\0132\023.context.Constraint\022.\n\016servi" + "ce_status\030\006 \001(\0132\026.context.ServiceStatus\022" + ".\n\016service_config\030\007 \001(\0132\026.context.Servic" + "eConfig\022%\n\ttimestamp\030\010 \001(\0132\022.context.Tim" + "estamp\"C\n\rServiceStatus\0222\n\016service_statu" + "s\030\001 \001(\0162\032.context.ServiceStatusEnum\":\n\rS" + "erviceConfig\022)\n\014config_rules\030\001 \003(\0132\023.con" + "text.ConfigRule\"8\n\rServiceIdList\022\'\n\013serv" + "ice_ids\030\001 \003(\0132\022.context.ServiceId\"1\n\013Ser" + "viceList\022\"\n\010services\030\001 \003(\0132\020.context.Ser" + "vice\"\225\001\n\rServiceFilter\022+\n\013service_ids\030\001 " + "\001(\0132\026.context.ServiceIdList\022\034\n\024include_e" + "ndpoint_ids\030\002 \001(\010\022\033\n\023include_constraints" + "\030\003 \001(\010\022\034\n\024include_config_rules\030\004 \001(\010\"U\n\014" + "ServiceEvent\022\035\n\005event\030\001 \001(\0132\016.context.Ev" + "ent\022&\n\nservice_id\030\002 \001(\0132\022.context.Servic" + "eId\"T\n\007SliceId\022&\n\ncontext_id\030\001 \001(\0132\022.con" + "text.ContextId\022!\n\nslice_uuid\030\002 \001(\0132\r.con" + "text.Uuid\"\240\003\n\005Slice\022\"\n\010slice_id\030\001 \001(\0132\020." + "context.SliceId\022\014\n\004name\030\002 \001(\t\022/\n\022slice_e" + "ndpoint_ids\030\003 \003(\0132\023.context.EndPointId\022." + "\n\021slice_constraints\030\004 \003(\0132\023.context.Cons" + "traint\022-\n\021slice_service_ids\030\005 \003(\0132\022.cont" + "ext.ServiceId\022,\n\022slice_subslice_ids\030\006 \003(" + "\0132\020.context.SliceId\022*\n\014slice_status\030\007 \001(" + "\0132\024.context.SliceStatus\022*\n\014slice_config\030" + "\010 \001(\0132\024.context.SliceConfig\022(\n\013slice_own" + "er\030\t \001(\0132\023.context.SliceOwner\022%\n\ttimesta" + "mp\030\n \001(\0132\022.context.Timestamp\"E\n\nSliceOwn" + "er\022!\n\nowner_uuid\030\001 \001(\0132\r.context.Uuid\022\024\n" + "\014owner_string\030\002 \001(\t\"=\n\013SliceStatus\022.\n\014sl" + "ice_status\030\001 \001(\0162\030.context.SliceStatusEn" + "um\"8\n\013SliceConfig\022)\n\014config_rules\030\001 \003(\0132" + "\023.context.ConfigRule\"2\n\013SliceIdList\022#\n\ts" + "lice_ids\030\001 \003(\0132\020.context.SliceId\"+\n\tSlic" + "eList\022\036\n\006slices\030\001 \003(\0132\016.context.Slice\"\312\001" + "\n\013SliceFilter\022\'\n\tslice_ids\030\001 \001(\0132\024.conte" + "xt.SliceIdList\022\034\n\024include_endpoint_ids\030\002" + " \001(\010\022\033\n\023include_constraints\030\003 \001(\010\022\033\n\023inc" + "lude_service_ids\030\004 \001(\010\022\034\n\024include_subsli" + "ce_ids\030\005 \001(\010\022\034\n\024include_config_rules\030\006 \001" + "(\010\"O\n\nSliceEvent\022\035\n\005event\030\001 \001(\0132\016.contex" + "t.Event\022\"\n\010slice_id\030\002 \001(\0132\020.context.Slic" + "eId\"6\n\014ConnectionId\022&\n\017connection_uuid\030\001" + " \001(\0132\r.context.Uuid\"2\n\025ConnectionSetting" + "s_L0\022\031\n\021lsp_symbolic_name\030\001 \001(\t\"\236\001\n\025Conn" + "ectionSettings_L2\022\027\n\017src_mac_address\030\001 \001" + "(\t\022\027\n\017dst_mac_address\030\002 \001(\t\022\022\n\nether_typ" + "e\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\025Conn" + "ectionSettings_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\025Connec" + "tionSettings_L4\022\020\n\010src_port\030\001 \001(\r\022\020\n\010dst" + "_port\030\002 \001(\r\022\021\n\ttcp_flags\030\003 \001(\r\022\013\n\003ttl\030\004 " + "\001(\r\"\304\001\n\022ConnectionSettings\022*\n\002l0\030\001 \001(\0132\036" + ".context.ConnectionSettings_L0\022*\n\002l2\030\002 \001" + "(\0132\036.context.ConnectionSettings_L2\022*\n\002l3" + "\030\003 \001(\0132\036.context.ConnectionSettings_L3\022*" + "\n\002l4\030\004 \001(\0132\036.context.ConnectionSettings_" + "L4\"\363\001\n\nConnection\022,\n\rconnection_id\030\001 \001(\013" + "2\025.context.ConnectionId\022&\n\nservice_id\030\002 " + "\001(\0132\022.context.ServiceId\0223\n\026path_hops_end" + "point_ids\030\003 \003(\0132\023.context.EndPointId\022+\n\017" + "sub_service_ids\030\004 \003(\0132\022.context.ServiceI" + "d\022-\n\010settings\030\005 \001(\0132\033.context.Connection" + "Settings\"A\n\020ConnectionIdList\022-\n\016connecti" + "on_ids\030\001 \003(\0132\025.context.ConnectionId\":\n\016C" + "onnectionList\022(\n\013connections\030\001 \003(\0132\023.con" + "text.Connection\"^\n\017ConnectionEvent\022\035\n\005ev" + "ent\030\001 \001(\0132\016.context.Event\022,\n\rconnection_" + "id\030\002 \001(\0132\025.context.ConnectionId\"\202\001\n\nEndP" + "ointId\022(\n\013topology_id\030\001 \001(\0132\023.context.To" + "pologyId\022$\n\tdevice_id\030\002 \001(\0132\021.context.De" + "viceId\022$\n\rendpoint_uuid\030\003 \001(\0132\r.context." + "Uuid\"\310\002\n\010EndPoint\022(\n\013endpoint_id\030\001 \001(\0132\023" + ".context.EndPointId\022\014\n\004name\030\002 \001(\t\022\025\n\rend" + "point_type\030\003 \001(\t\0229\n\020kpi_sample_types\030\004 \003" + "(\0162\037.kpi_sample_types.KpiSampleType\022,\n\021e" + "ndpoint_location\030\005 \001(\0132\021.context.Locatio" + "n\0229\n\014capabilities\030\006 \003(\0132#.context.EndPoi" + "nt.CapabilitiesEntry\032I\n\021CapabilitiesEntr" + "y\022\013\n\003key\030\001 \001(\t\022#\n\005value\030\002 \001(\0132\024.google.p" + "rotobuf.Any:\0028\001\"{\n\014EndPointName\022(\n\013endpo" + "int_id\030\001 \001(\0132\023.context.EndPointId\022\023\n\013dev" + "ice_name\030\002 \001(\t\022\025\n\rendpoint_name\030\003 \001(\t\022\025\n" + "\rendpoint_type\030\004 \001(\t\";\n\016EndPointIdList\022)" + "\n\014endpoint_ids\030\001 \003(\0132\023.context.EndPointI" + "d\"A\n\020EndPointNameList\022-\n\016endpoint_names\030" + "\001 \003(\0132\025.context.EndPointName\"A\n\021ConfigRu" + "le_Custom\022\024\n\014resource_key\030\001 \001(\t\022\026\n\016resou" + "rce_value\030\002 \001(\t\"]\n\016ConfigRule_ACL\022(\n\013end" + "point_id\030\001 \001(\0132\023.context.EndPointId\022!\n\010r" + "ule_set\030\002 \001(\0132\017.acl.AclRuleSet\"f\n\021Config" + "Rule_IPOWDM\022(\n\013endpoint_id\030\001 \001(\0132\023.conte" + "xt.EndPointId\022\'\n\010rule_set\030\002 \001(\0132\025.ipowdm" + ".IpowdmRuleSet\"k\n\023ConfigRule_TAPI_LSP\022(\n" + "\013endpoint_id\030\001 \001(\0132\023.context.EndPointId\022" + "*\n\010rule_set\030\002 \003(\0132\030.tapi_lsp.TapiLspRule" + "Set\"h\n\022ConfigRule_IP_LINK\022(\n\013endpoint_id" + "\030\001 \001(\0132\023.context.EndPointId\022(\n\010rule_set\030" + "\002 \001(\0132\026.ip_link.IpLinkRuleSet\"\254\002\n\nConfig" + "Rule\022)\n\006action\030\001 \001(\0162\031.context.ConfigAct" + "ionEnum\022,\n\006custom\030\002 \001(\0132\032.context.Config" + "Rule_CustomH\000\022&\n\003acl\030\003 \001(\0132\027.context.Con" + "figRule_ACLH\000\022.\n\007ip_link\030\004 \001(\0132\033.context" + ".ConfigRule_IP_LINKH\000\0220\n\010tapi_lsp\030\005 \001(\0132" + "\034.context.ConfigRule_TAPI_LSPH\000\022,\n\006ipowd" + "m\030\006 \001(\0132\032.context.ConfigRule_IPOWDMH\000B\r\n" + "\013config_rule\"F\n\021Constraint_Custom\022\027\n\017con" + "straint_type\030\001 \001(\t\022\030\n\020constraint_value\030\002" + " \001(\t\"E\n\023Constraint_Schedule\022\027\n\017start_tim" + "estamp\030\001 \001(\001\022\025\n\rduration_days\030\002 \001(\002\"3\n\014G" + "PS_Position\022\020\n\010latitude\030\001 \001(\002\022\021\n\tlongitu" + "de\030\002 \001(\002\"\204\001\n\010Location\022\020\n\006region\030\001 \001(\tH\000\022" + "-\n\014gps_position\030\002 \001(\0132\025.context.GPS_Posi" + "tionH\000\022\023\n\tinterface\030\003 \001(\tH\000\022\026\n\014circuit_p" + "ack\030\004 \001(\tH\000B\n\n\010location\"l\n\033Constraint_En" + "dPointLocation\022(\n\013endpoint_id\030\001 \001(\0132\023.co" + "ntext.EndPointId\022#\n\010location\030\002 \001(\0132\021.con" + "text.Location\"Y\n\033Constraint_EndPointPrio" + "rity\022(\n\013endpoint_id\030\001 \001(\0132\023.context.EndP" + "ointId\022\020\n\010priority\030\002 \001(\r\"0\n\026Constraint_S" + "LA_Latency\022\026\n\016e2e_latency_ms\030\001 \001(\002\"0\n\027Co" + "nstraint_SLA_Capacity\022\025\n\rcapacity_gbps\030\001" + " \001(\002\"c\n\033Constraint_SLA_Availability\022\032\n\022n" + "um_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\017isolation_level\030\001" + " \003(\0162\033.context.IsolationLevelEnum\"\242\001\n\025Co" + "nstraint_Exclusions\022\024\n\014is_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.EndPoin" + "tId\022!\n\010link_ids\030\004 \003(\0132\017.context.LinkId\"5" + "\n\014QoSProfileId\022%\n\016qos_profile_id\030\001 \001(\0132\r" + ".context.Uuid\"`\n\025Constraint_QoSProfile\022-" + "\n\016qos_profile_id\030\001 \001(\0132\025.context.QoSProf" + "ileId\022\030\n\020qos_profile_name\030\002 \001(\t\"\222\005\n\nCons" + "traint\022-\n\006action\030\001 \001(\0162\035.context.Constra" + "intActionEnum\022,\n\006custom\030\002 \001(\0132\032.context." + "Constraint_CustomH\000\0220\n\010schedule\030\003 \001(\0132\034." + "context.Constraint_ScheduleH\000\022A\n\021endpoin" + "t_location\030\004 \001(\0132$.context.Constraint_En" + "dPointLocationH\000\022A\n\021endpoint_priority\030\005 " + "\001(\0132$.context.Constraint_EndPointPriorit" + "yH\000\0228\n\014sla_capacity\030\006 \001(\0132 .context.Cons" + "traint_SLA_CapacityH\000\0226\n\013sla_latency\030\007 \001" + "(\0132\037.context.Constraint_SLA_LatencyH\000\022@\n" + "\020sla_availability\030\010 \001(\0132$.context.Constr" + "aint_SLA_AvailabilityH\000\022@\n\rsla_isolation" + "\030\t \001(\0132\'.context.Constraint_SLA_Isolatio" + "n_levelH\000\0224\n\nexclusions\030\n \001(\0132\036.context." + "Constraint_ExclusionsH\000\0225\n\013qos_profile\030\013" + " \001(\0132\036.context.Constraint_QoSProfileH\000B\014" + "\n\nconstraint\"^\n\022TeraFlowController\022&\n\nco" + "ntext_id\030\001 \001(\0132\022.context.ContextId\022\022\n\nip" + "_address\030\002 \001(\t\022\014\n\004port\030\003 \001(\r\"U\n\024Authenti" + "cationResult\022&\n\ncontext_id\030\001 \001(\0132\022.conte" + "xt.ContextId\022\025\n\rauthenticated\030\002 \001(\010\"-\n\017O" + "pticalConfigId\022\032\n\022opticalconfig_uuid\030\001 \001" + "(\t\"y\n\rOpticalConfig\0222\n\020opticalconfig_id\030" + "\001 \001(\0132\030.context.OpticalConfigId\022\016\n\006confi" + "g\030\002 \001(\t\022$\n\tdevice_id\030\003 \001(\0132\021.context.Dev" + "iceId\"C\n\021OpticalConfigList\022.\n\016opticalcon" + "figs\030\001 \003(\0132\026.context.OpticalConfig\"g\n\022Op" + "ticalConfigEvent\022\035\n\005event\030\001 \001(\0132\016.contex" + "t.Event\0222\n\020opticalconfig_id\030\002 \001(\0132\030.cont" + "ext.OpticalConfigId\"_\n\021OpticalEndPointId" + "\022$\n\tdevice_id\030\002 \001(\0132\021.context.DeviceId\022$" + "\n\rendpoint_uuid\030\003 \001(\0132\r.context.Uuid\">\n\017" + "OpticalLinkList\022+\n\roptical_links\030\001 \003(\0132\024" + ".context.OpticalLink\"\304\003\n\022OpticalLinkDeta" + "ils\022\016\n\006length\030\001 \001(\002\022\020\n\010src_port\030\002 \001(\t\022\020\n" + "\010dst_port\030\003 \001(\t\022\027\n\017local_peer_port\030\004 \001(\t" + "\022\030\n\020remote_peer_port\030\005 \001(\t\022\014\n\004used\030\006 \001(\010" + "\0228\n\007c_slots\030\007 \003(\0132\'.context.OpticalLinkD" + "etails.CSlotsEntry\0228\n\007l_slots\030\010 \003(\0132\'.co" + "ntext.OpticalLinkDetails.LSlotsEntry\0228\n\007" + "s_slots\030\t \003(\0132\'.context.OpticalLinkDetai" + "ls.SSlotsEntry\032-\n\013CSlotsEntry\022\013\n\003key\030\001 \001" + "(\t\022\r\n\005value\030\002 \001(\005:\0028\001\032-\n\013LSlotsEntry\022\013\n\003" + "key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\0028\001\032-\n\013SSlotsEn" + "try\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\0028\001\"\243\001\n\013" + "OpticalLink\022\014\n\004name\030\001 \001(\t\0224\n\017optical_det" + "ails\030\002 \001(\0132\033.context.OpticalLinkDetails\022" + " \n\007link_id\030\003 \001(\0132\017.context.LinkId\022.\n\021lin" + "k_endpoint_ids\030\004 \003(\0132\023.context.EndPointI" + "d\"0\n\tChannelId\022#\n\014channel_uuid\030\001 \001(\0132\r.c" + "ontext.Uuid\"8\n\rOpticalBandId\022\'\n\020opticalb" + "and_uuid\030\001 \001(\0132\r.context.Uuid\"\247\002\n\013Optica" + "lBand\022.\n\016opticalband_id\030\001 \001(\0132\026.context." + "OpticalBandId\022,\n\rconnection_id\030\002 \001(\0132\025.c" + "ontext.ConnectionId\022&\n\nchannel_id\030\003 \001(\0132" + "\022.context.ChannelId\022&\n\nservice_id\030\004 \001(\0132" + "\022.context.ServiceId\022#\n\007service\030\005 \001(\0132\020.c" + "ontext.ServiceH\000\022)\n\nconnection\030\006 \001(\0132\023.c" + "ontext.ConnectionH\000\022\021\n\007channel\030\007 \001(\tH\000B\007" + "\n\005field\"=\n\017OpticalBandList\022*\n\014opticalban" + "ds\030\001 \003(\0132\024.context.OpticalBand\"r\n\021Servic" + "eConfigRule\022&\n\nservice_id\030\001 \001(\0132\022.contex" + "t.ServiceId\0225\n\021configrule_custom\030\002 \001(\0132\032" + ".context.ConfigRule_Custom*j\n\rEventTypeE" + "num\022\027\n\023EVENTTYPE_UNDEFINED\020\000\022\024\n\020EVENTTYP" + "E_CREATE\020\001\022\024\n\020EVENTTYPE_UPDATE\020\002\022\024\n\020EVEN" + "TTYPE_REMOVE\020\003*\333\004\n\020DeviceDriverEnum\022\032\n\026D" + "EVICEDRIVER_UNDEFINED\020\000\022\033\n\027DEVICEDRIVER_" + "OPENCONFIG\020\001\022\036\n\032DEVICEDRIVER_TRANSPORT_A" + "PI\020\002\022\023\n\017DEVICEDRIVER_P4\020\003\022&\n\"DEVICEDRIVE" + "R_IETF_NETWORK_TOPOLOGY\020\004\022\033\n\027DEVICEDRIVE" + "R_ONF_TR_532\020\005\022\023\n\017DEVICEDRIVER_XR\020\006\022\033\n\027D" + "EVICEDRIVER_IETF_L2VPN\020\007\022 \n\034DEVICEDRIVER" + "_GNMI_OPENCONFIG\020\010\022\034\n\030DEVICEDRIVER_OPTIC" + "AL_TFS\020\t\022\032\n\026DEVICEDRIVER_IETF_ACTN\020\n\022\023\n\017" + "DEVICEDRIVER_OC\020\013\022\024\n\020DEVICEDRIVER_QKD\020\014\022" + "\033\n\027DEVICEDRIVER_IETF_L3VPN\020\r\022\033\n\027DEVICEDR" + "IVER_IETF_SLICE\020\016\022\024\n\020DEVICEDRIVER_NCE\020\017\022" + "\031\n\025DEVICEDRIVER_SMARTNIC\020\020\022\031\n\025DEVICEDRIV" + "ER_MORPHEUS\020\021\022\024\n\020DEVICEDRIVER_RYU\020\022\022#\n\037D" + "EVICEDRIVER_GNMI_NOKIA_SRLINUX\020\023\022\032\n\026DEVI" + "CEDRIVER_OPENROADM\020\024*\217\001\n\033DeviceOperation" + "alStatusEnum\022%\n!DEVICEOPERATIONALSTATUS_" + "UNDEFINED\020\000\022$\n DEVICEOPERATIONALSTATUS_D" + "ISABLED\020\001\022#\n\037DEVICEOPERATIONALSTATUS_ENA" + "BLED\020\002*\245\001\n\014LinkTypeEnum\022\024\n\020LINKTYPE_UNKN" + "OWN\020\000\022\023\n\017LINKTYPE_COPPER\020\001\022\022\n\016LINKTYPE_F" + "IBER\020\002\022\022\n\016LINKTYPE_RADIO\020\003\022\024\n\020LINKTYPE_V" + "IRTUAL\020\004\022\027\n\023LINKTYPE_MANAGEMENT\020\005\022\023\n\017LIN" + "KTYPE_REMOTE\020\006*\360\002\n\017ServiceTypeEnum\022\027\n\023SE" + "RVICETYPE_UNKNOWN\020\000\022\024\n\020SERVICETYPE_L3NM\020" + "\001\022\024\n\020SERVICETYPE_L2NM\020\002\022)\n%SERVICETYPE_T" + "API_CONNECTIVITY_SERVICE\020\003\022\022\n\016SERVICETYP" + "E_TE\020\004\022\023\n\017SERVICETYPE_E2E\020\005\022$\n SERVICETY" + "PE_OPTICAL_CONNECTIVITY\020\006\022\023\n\017SERVICETYPE" + "_QKD\020\007\022\024\n\020SERVICETYPE_L1NM\020\010\022\023\n\017SERVICET" + "YPE_INT\020\t\022\023\n\017SERVICETYPE_ACL\020\n\022\027\n\023SERVIC" + "ETYPE_IP_LINK\020\013\022\030\n\024SERVICETYPE_TAPI_LSP\020" + "\014\022\026\n\022SERVICETYPE_IPOWDM\020\r*\304\001\n\021ServiceSta" + "tusEnum\022\033\n\027SERVICESTATUS_UNDEFINED\020\000\022\031\n\025" + "SERVICESTATUS_PLANNED\020\001\022\030\n\024SERVICESTATUS" + "_ACTIVE\020\002\022\032\n\026SERVICESTATUS_UPDATING\020\003\022!\n" + "\035SERVICESTATUS_PENDING_REMOVAL\020\004\022\036\n\032SERV" + "ICESTATUS_SLA_VIOLATED\020\005*\251\001\n\017SliceStatus" + "Enum\022\031\n\025SLICESTATUS_UNDEFINED\020\000\022\027\n\023SLICE" + "STATUS_PLANNED\020\001\022\024\n\020SLICESTATUS_INIT\020\002\022\026" + "\n\022SLICESTATUS_ACTIVE\020\003\022\026\n\022SLICESTATUS_DE" + "INIT\020\004\022\034\n\030SLICESTATUS_SLA_VIOLATED\020\005*]\n\020" + "ConfigActionEnum\022\032\n\026CONFIGACTION_UNDEFIN" + "ED\020\000\022\024\n\020CONFIGACTION_SET\020\001\022\027\n\023CONFIGACTI" + "ON_DELETE\020\002*m\n\024ConstraintActionEnum\022\036\n\032C" + "ONSTRAINTACTION_UNDEFINED\020\000\022\030\n\024CONSTRAIN" + "TACTION_SET\020\001\022\033\n\027CONSTRAINTACTION_DELETE" + "\020\002*\203\002\n\022IsolationLevelEnum\022\020\n\014NO_ISOLATIO" + "N\020\000\022\026\n\022PHYSICAL_ISOLATION\020\001\022\025\n\021LOGICAL_I" + "SOLATION\020\002\022\025\n\021PROCESS_ISOLATION\020\003\022\035\n\031PHY" + "SICAL_MEMORY_ISOLATION\020\004\022\036\n\032PHYSICAL_NET" + "WORK_ISOLATION\020\005\022\036\n\032VIRTUAL_RESOURCE_ISO" + "LATION\020\006\022\037\n\033NETWORK_FUNCTIONS_ISOLATION\020" + "\007\022\025\n\021SERVICE_ISOLATION\020\0102\274\035\n\016ContextServ" + "ice\022:\n\016ListContextIds\022\016.context.Empty\032\026." + "context.ContextIdList\"\000\0226\n\014ListContexts\022" + "\016.context.Empty\032\024.context.ContextList\"\000\022" + "4\n\nGetContext\022\022.context.ContextId\032\020.cont" + "ext.Context\"\000\0224\n\nSetContext\022\020.context.Co" + "ntext\032\022.context.ContextId\"\000\0225\n\rRemoveCon" + "text\022\022.context.ContextId\032\016.context.Empty" + "\"\000\022=\n\020GetContextEvents\022\016.context.Empty\032\025" + ".context.ContextEvent\"\0000\001\022@\n\017ListTopolog" + "yIds\022\022.context.ContextId\032\027.context.Topol" + "ogyIdList\"\000\022=\n\016ListTopologies\022\022.context." + "ContextId\032\025.context.TopologyList\"\000\0227\n\013Ge" + "tTopology\022\023.context.TopologyId\032\021.context" + ".Topology\"\000\022E\n\022GetTopologyDetails\022\023.cont" + "ext.TopologyId\032\030.context.TopologyDetails" + "\"\000\0227\n\013SetTopology\022\021.context.Topology\032\023.c" + "ontext.TopologyId\"\000\0227\n\016RemoveTopology\022\023." + "context.TopologyId\032\016.context.Empty\"\000\022?\n\021" + "GetTopologyEvents\022\016.context.Empty\032\026.cont" + "ext.TopologyEvent\"\0000\001\0228\n\rListDeviceIds\022\016" + ".context.Empty\032\025.context.DeviceIdList\"\000\022" + "4\n\013ListDevices\022\016.context.Empty\032\023.context" + ".DeviceList\"\000\0221\n\tGetDevice\022\021.context.Dev" + "iceId\032\017.context.Device\"\000\0221\n\tSetDevice\022\017." + "context.Device\032\021.context.DeviceId\"\000\0223\n\014R" + "emoveDevice\022\021.context.DeviceId\032\016.context" + ".Empty\"\000\022;\n\017GetDeviceEvents\022\016.context.Em" + "pty\032\024.context.DeviceEvent\"\0000\001\022<\n\014SelectD" + "evice\022\025.context.DeviceFilter\032\023.context.D" + "eviceList\"\000\022I\n\021ListEndPointNames\022\027.conte" + "xt.EndPointIdList\032\031.context.EndPointName" + "List\"\000\0224\n\013ListLinkIds\022\016.context.Empty\032\023." + "context.LinkIdList\"\000\0220\n\tListLinks\022\016.cont" + "ext.Empty\032\021.context.LinkList\"\000\022+\n\007GetLin" + "k\022\017.context.LinkId\032\r.context.Link\"\000\022+\n\007S" + "etLink\022\r.context.Link\032\017.context.LinkId\"\000" + "\022/\n\nRemoveLink\022\017.context.LinkId\032\016.contex" + "t.Empty\"\000\0227\n\rGetLinkEvents\022\016.context.Emp" + "ty\032\022.context.LinkEvent\"\0000\001\022>\n\016ListServic" + "eIds\022\022.context.ContextId\032\026.context.Servi" + "ceIdList\"\000\022:\n\014ListServices\022\022.context.Con" + "textId\032\024.context.ServiceList\"\000\0224\n\nGetSer" + "vice\022\022.context.ServiceId\032\020.context.Servi" + "ce\"\000\0224\n\nSetService\022\020.context.Service\032\022.c" + "ontext.ServiceId\"\000\0226\n\014UnsetService\022\020.con" + "text.Service\032\022.context.ServiceId\"\000\0225\n\rRe" + "moveService\022\022.context.ServiceId\032\016.contex" + "t.Empty\"\000\022=\n\020GetServiceEvents\022\016.context." + "Empty\032\025.context.ServiceEvent\"\0000\001\022?\n\rSele" + "ctService\022\026.context.ServiceFilter\032\024.cont" + "ext.ServiceList\"\000\022:\n\014ListSliceIds\022\022.cont" + "ext.ContextId\032\024.context.SliceIdList\"\000\0226\n", "\nListSlices\022\022.context.ContextId\032\022.contex" + "t.SliceList\"\000\022.\n\010GetSlice\022\020.context.Slic" + "eId\032\016.context.Slice\"\000\022.\n\010SetSlice\022\016.cont" + "ext.Slice\032\020.context.SliceId\"\000\0220\n\nUnsetSl" + "ice\022\016.context.Slice\032\020.context.SliceId\"\000\022" + "1\n\013RemoveSlice\022\020.context.SliceId\032\016.conte" + "xt.Empty\"\000\0229\n\016GetSliceEvents\022\016.context.E" + "mpty\032\023.context.SliceEvent\"\0000\001\0229\n\013SelectS" + "lice\022\024.context.SliceFilter\032\022.context.Sli" + "ceList\"\000\022D\n\021ListConnectionIds\022\022.context." + "ServiceId\032\031.context.ConnectionIdList\"\000\022@" + "\n\017ListConnections\022\022.context.ServiceId\032\027." + "context.ConnectionList\"\000\022=\n\rGetConnectio" + "n\022\025.context.ConnectionId\032\023.context.Conne" + "ction\"\000\022=\n\rSetConnection\022\023.context.Conne" + "ction\032\025.context.ConnectionId\"\000\022;\n\020Remove" + "Connection\022\025.context.ConnectionId\032\016.cont" + "ext.Empty\"\000\022C\n\023GetConnectionEvents\022\016.con" + "text.Empty\032\030.context.ConnectionEvent\"\0000\001" + "\0225\n\014GetAllEvents\022\016.context.Empty\032\021.conte" + "xt.AnyEvent\"\0000\001\022@\n\020GetOpticalConfig\022\016.co" + "ntext.Empty\032\032.context.OpticalConfigList\"" + "\000\022F\n\020SetOpticalConfig\022\026.context.OpticalC" + "onfig\032\030.context.OpticalConfigId\"\000\022I\n\023Upd" + "ateOpticalConfig\022\026.context.OpticalConfig" + "\032\030.context.OpticalConfigId\"\000\022I\n\023SelectOp" + "ticalConfig\022\030.context.OpticalConfigId\032\026." + "context.OpticalConfig\"\000\022A\n\023DeleteOptical" + "Config\022\030.context.OpticalConfigId\032\016.conte" + "xt.Empty\"\000\022@\n\024DeleteOpticalChannel\022\026.con" + "text.OpticalConfig\032\016.context.Empty\"\000\0228\n\016" + "SetOpticalLink\022\024.context.OpticalLink\032\016.c" + "ontext.Empty\"\000\0229\n\016GetOpticalLink\022\017.conte" + "xt.LinkId\032\024.context.OpticalLink\"\000\0226\n\021Del" + "eteOpticalLink\022\017.context.LinkId\032\016.contex" + "t.Empty\"\000\022@\n\022GetOpticalLinkList\022\016.contex" + "t.Empty\032\030.context.OpticalLinkList\"\000\022<\n\016G" + "etOpticalBand\022\016.context.Empty\032\030.context." + "OpticalBandList\"\000\022C\n\021SelectOpticalBand\022\026" + ".context.OpticalBandId\032\024.context.Optical" + "Band\"\000\022G\n\027DeleteServiceConfigRule\022\032.cont" + "ext.ServiceConfigRule\032\016.context.Empty\"\000b" + "\006proto3" };
+        descriptor = com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] { com.google.protobuf.AnyProto.getDescriptor(), acl.Acl.getDescriptor(), ipowdm.Ipowdm.getDescriptor(), ip_link.IpLink.getDescriptor(), kpi_sample_types.KpiSampleTypes.getDescriptor(), tapi_lsp.TapiLsp.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[] {});
         internal_static_context_Uuid_descriptor = getDescriptor().getMessageTypes().get(1);
@@ -88132,55 +90272,59 @@ public final class ContextOuterClass {
         internal_static_context_ConfigRule_Custom_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_ConfigRule_Custom_descriptor, new java.lang.String[] { "ResourceKey", "ResourceValue" });
         internal_static_context_ConfigRule_ACL_descriptor = getDescriptor().getMessageTypes().get(63);
         internal_static_context_ConfigRule_ACL_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_ConfigRule_ACL_descriptor, new java.lang.String[] { "EndpointId", "RuleSet" });
-        internal_static_context_ConfigRule_IP_LINK_descriptor = getDescriptor().getMessageTypes().get(64);
+        internal_static_context_ConfigRule_IPOWDM_descriptor = getDescriptor().getMessageTypes().get(64);
+        internal_static_context_ConfigRule_IPOWDM_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_ConfigRule_IPOWDM_descriptor, new java.lang.String[] { "EndpointId", "RuleSet" });
+        internal_static_context_ConfigRule_TAPI_LSP_descriptor = getDescriptor().getMessageTypes().get(65);
+        internal_static_context_ConfigRule_TAPI_LSP_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_ConfigRule_TAPI_LSP_descriptor, new java.lang.String[] { "EndpointId", "RuleSet" });
+        internal_static_context_ConfigRule_IP_LINK_descriptor = getDescriptor().getMessageTypes().get(66);
         internal_static_context_ConfigRule_IP_LINK_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_ConfigRule_IP_LINK_descriptor, new java.lang.String[] { "EndpointId", "RuleSet" });
-        internal_static_context_ConfigRule_descriptor = getDescriptor().getMessageTypes().get(65);
-        internal_static_context_ConfigRule_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_ConfigRule_descriptor, new java.lang.String[] { "Action", "Custom", "Acl", "IpLink", "ConfigRule" });
-        internal_static_context_Constraint_Custom_descriptor = getDescriptor().getMessageTypes().get(66);
+        internal_static_context_ConfigRule_descriptor = getDescriptor().getMessageTypes().get(67);
+        internal_static_context_ConfigRule_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_ConfigRule_descriptor, new java.lang.String[] { "Action", "Custom", "Acl", "IpLink", "TapiLsp", "Ipowdm", "ConfigRule" });
+        internal_static_context_Constraint_Custom_descriptor = getDescriptor().getMessageTypes().get(68);
         internal_static_context_Constraint_Custom_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_Constraint_Custom_descriptor, new java.lang.String[] { "ConstraintType", "ConstraintValue" });
-        internal_static_context_Constraint_Schedule_descriptor = getDescriptor().getMessageTypes().get(67);
+        internal_static_context_Constraint_Schedule_descriptor = getDescriptor().getMessageTypes().get(69);
         internal_static_context_Constraint_Schedule_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_Constraint_Schedule_descriptor, new java.lang.String[] { "StartTimestamp", "DurationDays" });
-        internal_static_context_GPS_Position_descriptor = getDescriptor().getMessageTypes().get(68);
+        internal_static_context_GPS_Position_descriptor = getDescriptor().getMessageTypes().get(70);
         internal_static_context_GPS_Position_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_GPS_Position_descriptor, new java.lang.String[] { "Latitude", "Longitude" });
-        internal_static_context_Location_descriptor = getDescriptor().getMessageTypes().get(69);
+        internal_static_context_Location_descriptor = getDescriptor().getMessageTypes().get(71);
         internal_static_context_Location_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_Location_descriptor, new java.lang.String[] { "Region", "GpsPosition", "Interface", "CircuitPack", "Location" });
-        internal_static_context_Constraint_EndPointLocation_descriptor = getDescriptor().getMessageTypes().get(70);
+        internal_static_context_Constraint_EndPointLocation_descriptor = getDescriptor().getMessageTypes().get(72);
         internal_static_context_Constraint_EndPointLocation_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_Constraint_EndPointLocation_descriptor, new java.lang.String[] { "EndpointId", "Location" });
-        internal_static_context_Constraint_EndPointPriority_descriptor = getDescriptor().getMessageTypes().get(71);
+        internal_static_context_Constraint_EndPointPriority_descriptor = getDescriptor().getMessageTypes().get(73);
         internal_static_context_Constraint_EndPointPriority_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_Constraint_EndPointPriority_descriptor, new java.lang.String[] { "EndpointId", "Priority" });
-        internal_static_context_Constraint_SLA_Latency_descriptor = getDescriptor().getMessageTypes().get(72);
+        internal_static_context_Constraint_SLA_Latency_descriptor = getDescriptor().getMessageTypes().get(74);
         internal_static_context_Constraint_SLA_Latency_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_Constraint_SLA_Latency_descriptor, new java.lang.String[] { "E2ELatencyMs" });
-        internal_static_context_Constraint_SLA_Capacity_descriptor = getDescriptor().getMessageTypes().get(73);
+        internal_static_context_Constraint_SLA_Capacity_descriptor = getDescriptor().getMessageTypes().get(75);
         internal_static_context_Constraint_SLA_Capacity_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_Constraint_SLA_Capacity_descriptor, new java.lang.String[] { "CapacityGbps" });
-        internal_static_context_Constraint_SLA_Availability_descriptor = getDescriptor().getMessageTypes().get(74);
+        internal_static_context_Constraint_SLA_Availability_descriptor = getDescriptor().getMessageTypes().get(76);
         internal_static_context_Constraint_SLA_Availability_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_Constraint_SLA_Availability_descriptor, new java.lang.String[] { "NumDisjointPaths", "AllActive", "Availability" });
-        internal_static_context_Constraint_SLA_Isolation_level_descriptor = getDescriptor().getMessageTypes().get(75);
+        internal_static_context_Constraint_SLA_Isolation_level_descriptor = getDescriptor().getMessageTypes().get(77);
         internal_static_context_Constraint_SLA_Isolation_level_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_Constraint_SLA_Isolation_level_descriptor, new java.lang.String[] { "IsolationLevel" });
-        internal_static_context_Constraint_Exclusions_descriptor = getDescriptor().getMessageTypes().get(76);
+        internal_static_context_Constraint_Exclusions_descriptor = getDescriptor().getMessageTypes().get(78);
         internal_static_context_Constraint_Exclusions_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_Constraint_Exclusions_descriptor, new java.lang.String[] { "IsPermanent", "DeviceIds", "EndpointIds", "LinkIds" });
-        internal_static_context_QoSProfileId_descriptor = getDescriptor().getMessageTypes().get(77);
+        internal_static_context_QoSProfileId_descriptor = getDescriptor().getMessageTypes().get(79);
         internal_static_context_QoSProfileId_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_QoSProfileId_descriptor, new java.lang.String[] { "QosProfileId" });
-        internal_static_context_Constraint_QoSProfile_descriptor = getDescriptor().getMessageTypes().get(78);
+        internal_static_context_Constraint_QoSProfile_descriptor = getDescriptor().getMessageTypes().get(80);
         internal_static_context_Constraint_QoSProfile_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_Constraint_QoSProfile_descriptor, new java.lang.String[] { "QosProfileId", "QosProfileName" });
-        internal_static_context_Constraint_descriptor = getDescriptor().getMessageTypes().get(79);
+        internal_static_context_Constraint_descriptor = getDescriptor().getMessageTypes().get(81);
         internal_static_context_Constraint_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_Constraint_descriptor, new java.lang.String[] { "Action", "Custom", "Schedule", "EndpointLocation", "EndpointPriority", "SlaCapacity", "SlaLatency", "SlaAvailability", "SlaIsolation", "Exclusions", "QosProfile", "Constraint" });
-        internal_static_context_TeraFlowController_descriptor = getDescriptor().getMessageTypes().get(80);
+        internal_static_context_TeraFlowController_descriptor = getDescriptor().getMessageTypes().get(82);
         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(81);
+        internal_static_context_AuthenticationResult_descriptor = getDescriptor().getMessageTypes().get(83);
         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(82);
+        internal_static_context_OpticalConfigId_descriptor = getDescriptor().getMessageTypes().get(84);
         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(83);
+        internal_static_context_OpticalConfig_descriptor = getDescriptor().getMessageTypes().get(85);
         internal_static_context_OpticalConfig_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalConfig_descriptor, new java.lang.String[] { "OpticalconfigId", "Config", "DeviceId" });
-        internal_static_context_OpticalConfigList_descriptor = getDescriptor().getMessageTypes().get(84);
+        internal_static_context_OpticalConfigList_descriptor = getDescriptor().getMessageTypes().get(86);
         internal_static_context_OpticalConfigList_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalConfigList_descriptor, new java.lang.String[] { "Opticalconfigs" });
-        internal_static_context_OpticalConfigEvent_descriptor = getDescriptor().getMessageTypes().get(85);
+        internal_static_context_OpticalConfigEvent_descriptor = getDescriptor().getMessageTypes().get(87);
         internal_static_context_OpticalConfigEvent_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalConfigEvent_descriptor, new java.lang.String[] { "Event", "OpticalconfigId" });
-        internal_static_context_OpticalEndPointId_descriptor = getDescriptor().getMessageTypes().get(86);
+        internal_static_context_OpticalEndPointId_descriptor = getDescriptor().getMessageTypes().get(88);
         internal_static_context_OpticalEndPointId_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalEndPointId_descriptor, new java.lang.String[] { "DeviceId", "EndpointUuid" });
-        internal_static_context_OpticalLinkList_descriptor = getDescriptor().getMessageTypes().get(87);
+        internal_static_context_OpticalLinkList_descriptor = getDescriptor().getMessageTypes().get(89);
         internal_static_context_OpticalLinkList_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalLinkList_descriptor, new java.lang.String[] { "OpticalLinks" });
-        internal_static_context_OpticalLinkDetails_descriptor = getDescriptor().getMessageTypes().get(88);
+        internal_static_context_OpticalLinkDetails_descriptor = getDescriptor().getMessageTypes().get(90);
         internal_static_context_OpticalLinkDetails_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalLinkDetails_descriptor, new java.lang.String[] { "Length", "SrcPort", "DstPort", "LocalPeerPort", "RemotePeerPort", "Used", "CSlots", "LSlots", "SSlots" });
         internal_static_context_OpticalLinkDetails_CSlotsEntry_descriptor = internal_static_context_OpticalLinkDetails_descriptor.getNestedTypes().get(0);
         internal_static_context_OpticalLinkDetails_CSlotsEntry_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalLinkDetails_CSlotsEntry_descriptor, new java.lang.String[] { "Key", "Value" });
@@ -88188,22 +90332,24 @@ public final class ContextOuterClass {
         internal_static_context_OpticalLinkDetails_LSlotsEntry_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalLinkDetails_LSlotsEntry_descriptor, new java.lang.String[] { "Key", "Value" });
         internal_static_context_OpticalLinkDetails_SSlotsEntry_descriptor = internal_static_context_OpticalLinkDetails_descriptor.getNestedTypes().get(2);
         internal_static_context_OpticalLinkDetails_SSlotsEntry_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalLinkDetails_SSlotsEntry_descriptor, new java.lang.String[] { "Key", "Value" });
-        internal_static_context_OpticalLink_descriptor = getDescriptor().getMessageTypes().get(89);
+        internal_static_context_OpticalLink_descriptor = getDescriptor().getMessageTypes().get(91);
         internal_static_context_OpticalLink_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalLink_descriptor, new java.lang.String[] { "Name", "OpticalDetails", "LinkId", "LinkEndpointIds" });
-        internal_static_context_ChannelId_descriptor = getDescriptor().getMessageTypes().get(90);
+        internal_static_context_ChannelId_descriptor = getDescriptor().getMessageTypes().get(92);
         internal_static_context_ChannelId_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_ChannelId_descriptor, new java.lang.String[] { "ChannelUuid" });
-        internal_static_context_OpticalBandId_descriptor = getDescriptor().getMessageTypes().get(91);
+        internal_static_context_OpticalBandId_descriptor = getDescriptor().getMessageTypes().get(93);
         internal_static_context_OpticalBandId_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalBandId_descriptor, new java.lang.String[] { "OpticalbandUuid" });
-        internal_static_context_OpticalBand_descriptor = getDescriptor().getMessageTypes().get(92);
+        internal_static_context_OpticalBand_descriptor = getDescriptor().getMessageTypes().get(94);
         internal_static_context_OpticalBand_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalBand_descriptor, new java.lang.String[] { "OpticalbandId", "ConnectionId", "ChannelId", "ServiceId", "Service", "Connection", "Channel", "Field" });
-        internal_static_context_OpticalBandList_descriptor = getDescriptor().getMessageTypes().get(93);
+        internal_static_context_OpticalBandList_descriptor = getDescriptor().getMessageTypes().get(95);
         internal_static_context_OpticalBandList_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_OpticalBandList_descriptor, new java.lang.String[] { "Opticalbands" });
-        internal_static_context_ServiceConfigRule_descriptor = getDescriptor().getMessageTypes().get(94);
+        internal_static_context_ServiceConfigRule_descriptor = getDescriptor().getMessageTypes().get(96);
         internal_static_context_ServiceConfigRule_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_ServiceConfigRule_descriptor, new java.lang.String[] { "ServiceId", "ConfigruleCustom" });
         com.google.protobuf.AnyProto.getDescriptor();
         acl.Acl.getDescriptor();
+        ipowdm.Ipowdm.getDescriptor();
         ip_link.IpLink.getDescriptor();
         kpi_sample_types.KpiSampleTypes.getDescriptor();
+        tapi_lsp.TapiLsp.getDescriptor();
     }
     // @@protoc_insertion_point(outer_class_scope)
 }
diff --git a/src/ztp/target/generated-sources/grpc/ipowdm/Ipowdm.java b/src/ztp/target/generated-sources/grpc/ipowdm/Ipowdm.java
new file mode 100644
index 000000000..2008e5d4f
--- /dev/null
+++ b/src/ztp/target/generated-sources/grpc/ipowdm/Ipowdm.java
@@ -0,0 +1,5782 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: ipowdm.proto
+package ipowdm;
+
+public final class Ipowdm {
+
+    private Ipowdm() {
+    }
+
+    public static void registerAllExtensions(com.google.protobuf.ExtensionRegistryLite registry) {
+    }
+
+    public static void registerAllExtensions(com.google.protobuf.ExtensionRegistry registry) {
+        registerAllExtensions((com.google.protobuf.ExtensionRegistryLite) registry);
+    }
+
+    public interface RuleEndpointOrBuilder extends // @@protoc_insertion_point(interface_extends:ipowdm.RuleEndpoint)
+    com.google.protobuf.MessageOrBuilder {
+
+        /**
+         * string uuid = 1;
+         * @return The uuid.
+         */
+        java.lang.String getUuid();
+
+        /**
+         * string uuid = 1;
+         * @return The bytes for uuid.
+         */
+        com.google.protobuf.ByteString getUuidBytes();
+
+        /**
+         * string ip_address = 2;
+         * @return The ipAddress.
+         */
+        java.lang.String getIpAddress();
+
+        /**
+         * string ip_address = 2;
+         * @return The bytes for ipAddress.
+         */
+        com.google.protobuf.ByteString getIpAddressBytes();
+
+        /**
+         * string ip_mask = 3;
+         * @return The ipMask.
+         */
+        java.lang.String getIpMask();
+
+        /**
+         * string ip_mask = 3;
+         * @return The bytes for ipMask.
+         */
+        com.google.protobuf.ByteString getIpMaskBytes();
+
+        /**
+         * int32 vlan_id = 4;
+         * @return The vlanId.
+         */
+        int getVlanId();
+    }
+
+    /**
+     * Protobuf type {@code ipowdm.RuleEndpoint}
+     */
+    public static final class RuleEndpoint extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:ipowdm.RuleEndpoint)
+    RuleEndpointOrBuilder {
+
+        private static final long serialVersionUID = 0L;
+
+        // Use RuleEndpoint.newBuilder() to construct.
+        private RuleEndpoint(com.google.protobuf.GeneratedMessageV3.Builder builder) {
+            super(builder);
+        }
+
+        private RuleEndpoint() {
+            uuid_ = "";
+            ipAddress_ = "";
+            ipMask_ = "";
+        }
+
+        @java.lang.Override
+        @SuppressWarnings({ "unused" })
+        protected java.lang.Object newInstance(UnusedPrivateParameter unused) {
+            return new RuleEndpoint();
+        }
+
+        public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+            return ipowdm.Ipowdm.internal_static_ipowdm_RuleEndpoint_descriptor;
+        }
+
+        @java.lang.Override
+        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+            return ipowdm.Ipowdm.internal_static_ipowdm_RuleEndpoint_fieldAccessorTable.ensureFieldAccessorsInitialized(ipowdm.Ipowdm.RuleEndpoint.class, ipowdm.Ipowdm.RuleEndpoint.Builder.class);
+        }
+
+        public static final int UUID_FIELD_NUMBER = 1;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object uuid_ = "";
+
+        /**
+         * string uuid = 1;
+         * @return The uuid.
+         */
+        @java.lang.Override
+        public java.lang.String getUuid() {
+            java.lang.Object ref = uuid_;
+            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();
+                uuid_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string uuid = 1;
+         * @return The bytes for uuid.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getUuidBytes() {
+            java.lang.Object ref = uuid_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                uuid_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int IP_ADDRESS_FIELD_NUMBER = 2;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object ipAddress_ = "";
+
+        /**
+         * string ip_address = 2;
+         * @return The ipAddress.
+         */
+        @java.lang.Override
+        public java.lang.String getIpAddress() {
+            java.lang.Object ref = ipAddress_;
+            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();
+                ipAddress_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string ip_address = 2;
+         * @return The bytes for ipAddress.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getIpAddressBytes() {
+            java.lang.Object ref = ipAddress_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                ipAddress_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int IP_MASK_FIELD_NUMBER = 3;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object ipMask_ = "";
+
+        /**
+         * string ip_mask = 3;
+         * @return The ipMask.
+         */
+        @java.lang.Override
+        public java.lang.String getIpMask() {
+            java.lang.Object ref = ipMask_;
+            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();
+                ipMask_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string ip_mask = 3;
+         * @return The bytes for ipMask.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getIpMaskBytes() {
+            java.lang.Object ref = ipMask_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                ipMask_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int VLAN_ID_FIELD_NUMBER = 4;
+
+        private int vlanId_ = 0;
+
+        /**
+         * int32 vlan_id = 4;
+         * @return The vlanId.
+         */
+        @java.lang.Override
+        public int getVlanId() {
+            return vlanId_;
+        }
+
+        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(uuid_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 1, uuid_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(ipAddress_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 2, ipAddress_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(ipMask_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 3, ipMask_);
+            }
+            if (vlanId_ != 0) {
+                output.writeInt32(4, vlanId_);
+            }
+            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(uuid_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, uuid_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(ipAddress_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, ipAddress_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(ipMask_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, ipMask_);
+            }
+            if (vlanId_ != 0) {
+                size += com.google.protobuf.CodedOutputStream.computeInt32Size(4, vlanId_);
+            }
+            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 ipowdm.Ipowdm.RuleEndpoint)) {
+                return super.equals(obj);
+            }
+            ipowdm.Ipowdm.RuleEndpoint other = (ipowdm.Ipowdm.RuleEndpoint) obj;
+            if (!getUuid().equals(other.getUuid()))
+                return false;
+            if (!getIpAddress().equals(other.getIpAddress()))
+                return false;
+            if (!getIpMask().equals(other.getIpMask()))
+                return false;
+            if (getVlanId() != other.getVlanId())
+                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) + UUID_FIELD_NUMBER;
+            hash = (53 * hash) + getUuid().hashCode();
+            hash = (37 * hash) + IP_ADDRESS_FIELD_NUMBER;
+            hash = (53 * hash) + getIpAddress().hashCode();
+            hash = (37 * hash) + IP_MASK_FIELD_NUMBER;
+            hash = (53 * hash) + getIpMask().hashCode();
+            hash = (37 * hash) + VLAN_ID_FIELD_NUMBER;
+            hash = (53 * hash) + getVlanId();
+            hash = (29 * hash) + getUnknownFields().hashCode();
+            memoizedHashCode = hash;
+            return hash;
+        }
+
+        public static ipowdm.Ipowdm.RuleEndpoint parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.RuleEndpoint parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.RuleEndpoint parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.RuleEndpoint parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.RuleEndpoint parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.RuleEndpoint parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.RuleEndpoint parseFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.RuleEndpoint 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 ipowdm.Ipowdm.RuleEndpoint parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.RuleEndpoint 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 ipowdm.Ipowdm.RuleEndpoint parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.RuleEndpoint 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(ipowdm.Ipowdm.RuleEndpoint 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 ipowdm.RuleEndpoint}
+         */
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:ipowdm.RuleEndpoint)
+        ipowdm.Ipowdm.RuleEndpointOrBuilder {
+
+            public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_RuleEndpoint_descriptor;
+            }
+
+            @java.lang.Override
+            protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_RuleEndpoint_fieldAccessorTable.ensureFieldAccessorsInitialized(ipowdm.Ipowdm.RuleEndpoint.class, ipowdm.Ipowdm.RuleEndpoint.Builder.class);
+            }
+
+            // Construct using ipowdm.Ipowdm.RuleEndpoint.newBuilder()
+            private Builder() {
+            }
+
+            private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+                super(parent);
+            }
+
+            @java.lang.Override
+            public Builder clear() {
+                super.clear();
+                bitField0_ = 0;
+                uuid_ = "";
+                ipAddress_ = "";
+                ipMask_ = "";
+                vlanId_ = 0;
+                return this;
+            }
+
+            @java.lang.Override
+            public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_RuleEndpoint_descriptor;
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.RuleEndpoint getDefaultInstanceForType() {
+                return ipowdm.Ipowdm.RuleEndpoint.getDefaultInstance();
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.RuleEndpoint build() {
+                ipowdm.Ipowdm.RuleEndpoint result = buildPartial();
+                if (!result.isInitialized()) {
+                    throw newUninitializedMessageException(result);
+                }
+                return result;
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.RuleEndpoint buildPartial() {
+                ipowdm.Ipowdm.RuleEndpoint result = new ipowdm.Ipowdm.RuleEndpoint(this);
+                if (bitField0_ != 0) {
+                    buildPartial0(result);
+                }
+                onBuilt();
+                return result;
+            }
+
+            private void buildPartial0(ipowdm.Ipowdm.RuleEndpoint result) {
+                int from_bitField0_ = bitField0_;
+                if (((from_bitField0_ & 0x00000001) != 0)) {
+                    result.uuid_ = uuid_;
+                }
+                if (((from_bitField0_ & 0x00000002) != 0)) {
+                    result.ipAddress_ = ipAddress_;
+                }
+                if (((from_bitField0_ & 0x00000004) != 0)) {
+                    result.ipMask_ = ipMask_;
+                }
+                if (((from_bitField0_ & 0x00000008) != 0)) {
+                    result.vlanId_ = vlanId_;
+                }
+            }
+
+            @java.lang.Override
+            public Builder mergeFrom(com.google.protobuf.Message other) {
+                if (other instanceof ipowdm.Ipowdm.RuleEndpoint) {
+                    return mergeFrom((ipowdm.Ipowdm.RuleEndpoint) other);
+                } else {
+                    super.mergeFrom(other);
+                    return this;
+                }
+            }
+
+            public Builder mergeFrom(ipowdm.Ipowdm.RuleEndpoint other) {
+                if (other == ipowdm.Ipowdm.RuleEndpoint.getDefaultInstance())
+                    return this;
+                if (!other.getUuid().isEmpty()) {
+                    uuid_ = other.uuid_;
+                    bitField0_ |= 0x00000001;
+                    onChanged();
+                }
+                if (!other.getIpAddress().isEmpty()) {
+                    ipAddress_ = other.ipAddress_;
+                    bitField0_ |= 0x00000002;
+                    onChanged();
+                }
+                if (!other.getIpMask().isEmpty()) {
+                    ipMask_ = other.ipMask_;
+                    bitField0_ |= 0x00000004;
+                    onChanged();
+                }
+                if (other.getVlanId() != 0) {
+                    setVlanId(other.getVlanId());
+                }
+                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:
+                                {
+                                    uuid_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00000001;
+                                    break;
+                                }
+                            // case 10
+                            case 18:
+                                {
+                                    ipAddress_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00000002;
+                                    break;
+                                }
+                            // case 18
+                            case 26:
+                                {
+                                    ipMask_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00000004;
+                                    break;
+                                }
+                            // case 26
+                            case 32:
+                                {
+                                    vlanId_ = input.readInt32();
+                                    bitField0_ |= 0x00000008;
+                                    break;
+                                }
+                            // case 32
+                            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 uuid_ = "";
+
+            /**
+             * string uuid = 1;
+             * @return The uuid.
+             */
+            public java.lang.String getUuid() {
+                java.lang.Object ref = uuid_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    uuid_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string uuid = 1;
+             * @return The bytes for uuid.
+             */
+            public com.google.protobuf.ByteString getUuidBytes() {
+                java.lang.Object ref = uuid_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    uuid_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string uuid = 1;
+             * @param value The uuid to set.
+             * @return This builder for chaining.
+             */
+            public Builder setUuid(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                uuid_ = value;
+                bitField0_ |= 0x00000001;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string uuid = 1;
+             * @return This builder for chaining.
+             */
+            public Builder clearUuid() {
+                uuid_ = getDefaultInstance().getUuid();
+                bitField0_ = (bitField0_ & ~0x00000001);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string uuid = 1;
+             * @param value The bytes for uuid to set.
+             * @return This builder for chaining.
+             */
+            public Builder setUuidBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                uuid_ = value;
+                bitField0_ |= 0x00000001;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object ipAddress_ = "";
+
+            /**
+             * string ip_address = 2;
+             * @return The ipAddress.
+             */
+            public java.lang.String getIpAddress() {
+                java.lang.Object ref = ipAddress_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    ipAddress_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string ip_address = 2;
+             * @return The bytes for ipAddress.
+             */
+            public com.google.protobuf.ByteString getIpAddressBytes() {
+                java.lang.Object ref = ipAddress_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    ipAddress_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string ip_address = 2;
+             * @param value The ipAddress to set.
+             * @return This builder for chaining.
+             */
+            public Builder setIpAddress(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                ipAddress_ = value;
+                bitField0_ |= 0x00000002;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string ip_address = 2;
+             * @return This builder for chaining.
+             */
+            public Builder clearIpAddress() {
+                ipAddress_ = getDefaultInstance().getIpAddress();
+                bitField0_ = (bitField0_ & ~0x00000002);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string ip_address = 2;
+             * @param value The bytes for ipAddress to set.
+             * @return This builder for chaining.
+             */
+            public Builder setIpAddressBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                ipAddress_ = value;
+                bitField0_ |= 0x00000002;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object ipMask_ = "";
+
+            /**
+             * string ip_mask = 3;
+             * @return The ipMask.
+             */
+            public java.lang.String getIpMask() {
+                java.lang.Object ref = ipMask_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    ipMask_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string ip_mask = 3;
+             * @return The bytes for ipMask.
+             */
+            public com.google.protobuf.ByteString getIpMaskBytes() {
+                java.lang.Object ref = ipMask_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    ipMask_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string ip_mask = 3;
+             * @param value The ipMask to set.
+             * @return This builder for chaining.
+             */
+            public Builder setIpMask(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                ipMask_ = value;
+                bitField0_ |= 0x00000004;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string ip_mask = 3;
+             * @return This builder for chaining.
+             */
+            public Builder clearIpMask() {
+                ipMask_ = getDefaultInstance().getIpMask();
+                bitField0_ = (bitField0_ & ~0x00000004);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string ip_mask = 3;
+             * @param value The bytes for ipMask to set.
+             * @return This builder for chaining.
+             */
+            public Builder setIpMaskBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                ipMask_ = value;
+                bitField0_ |= 0x00000004;
+                onChanged();
+                return this;
+            }
+
+            private int vlanId_;
+
+            /**
+             * int32 vlan_id = 4;
+             * @return The vlanId.
+             */
+            @java.lang.Override
+            public int getVlanId() {
+                return vlanId_;
+            }
+
+            /**
+             * int32 vlan_id = 4;
+             * @param value The vlanId to set.
+             * @return This builder for chaining.
+             */
+            public Builder setVlanId(int value) {
+                vlanId_ = value;
+                bitField0_ |= 0x00000008;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * int32 vlan_id = 4;
+             * @return This builder for chaining.
+             */
+            public Builder clearVlanId() {
+                bitField0_ = (bitField0_ & ~0x00000008);
+                vlanId_ = 0;
+                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:ipowdm.RuleEndpoint)
+        }
+
+        // @@protoc_insertion_point(class_scope:ipowdm.RuleEndpoint)
+        private static final ipowdm.Ipowdm.RuleEndpoint DEFAULT_INSTANCE;
+
+        static {
+            DEFAULT_INSTANCE = new ipowdm.Ipowdm.RuleEndpoint();
+        }
+
+        public static ipowdm.Ipowdm.RuleEndpoint getDefaultInstance() {
+            return DEFAULT_INSTANCE;
+        }
+
+        private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+
+            @java.lang.Override
+            public RuleEndpoint parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+                Builder builder = newBuilder();
+                try {
+                    builder.mergeFrom(input, extensionRegistry);
+                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    throw e.setUnfinishedMessage(builder.buildPartial());
+                } catch (com.google.protobuf.UninitializedMessageException e) {
+                    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 ipowdm.Ipowdm.RuleEndpoint getDefaultInstanceForType() {
+            return DEFAULT_INSTANCE;
+        }
+    }
+
+    public interface DigitalSubCarrierIdOrBuilder extends // @@protoc_insertion_point(interface_extends:ipowdm.DigitalSubCarrierId)
+    com.google.protobuf.MessageOrBuilder {
+
+        /**
+         * int32 sub_carrier_id = 1;
+         * @return The subCarrierId.
+         */
+        int getSubCarrierId();
+
+        /**
+         * string active = 2;
+         * @return The active.
+         */
+        java.lang.String getActive();
+
+        /**
+         * string active = 2;
+         * @return The bytes for active.
+         */
+        com.google.protobuf.ByteString getActiveBytes();
+    }
+
+    /**
+     * Protobuf type {@code ipowdm.DigitalSubCarrierId}
+     */
+    public static final class DigitalSubCarrierId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:ipowdm.DigitalSubCarrierId)
+    DigitalSubCarrierIdOrBuilder {
+
+        private static final long serialVersionUID = 0L;
+
+        // Use DigitalSubCarrierId.newBuilder() to construct.
+        private DigitalSubCarrierId(com.google.protobuf.GeneratedMessageV3.Builder builder) {
+            super(builder);
+        }
+
+        private DigitalSubCarrierId() {
+            active_ = "";
+        }
+
+        @java.lang.Override
+        @SuppressWarnings({ "unused" })
+        protected java.lang.Object newInstance(UnusedPrivateParameter unused) {
+            return new DigitalSubCarrierId();
+        }
+
+        public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+            return ipowdm.Ipowdm.internal_static_ipowdm_DigitalSubCarrierId_descriptor;
+        }
+
+        @java.lang.Override
+        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+            return ipowdm.Ipowdm.internal_static_ipowdm_DigitalSubCarrierId_fieldAccessorTable.ensureFieldAccessorsInitialized(ipowdm.Ipowdm.DigitalSubCarrierId.class, ipowdm.Ipowdm.DigitalSubCarrierId.Builder.class);
+        }
+
+        public static final int SUB_CARRIER_ID_FIELD_NUMBER = 1;
+
+        private int subCarrierId_ = 0;
+
+        /**
+         * int32 sub_carrier_id = 1;
+         * @return The subCarrierId.
+         */
+        @java.lang.Override
+        public int getSubCarrierId() {
+            return subCarrierId_;
+        }
+
+        public static final int ACTIVE_FIELD_NUMBER = 2;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object active_ = "";
+
+        /**
+         * string active = 2;
+         * @return The active.
+         */
+        @java.lang.Override
+        public java.lang.String getActive() {
+            java.lang.Object ref = active_;
+            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();
+                active_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string active = 2;
+         * @return The bytes for active.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getActiveBytes() {
+            java.lang.Object ref = active_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                active_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        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 (subCarrierId_ != 0) {
+                output.writeInt32(1, subCarrierId_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(active_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 2, active_);
+            }
+            getUnknownFields().writeTo(output);
+        }
+
+        @java.lang.Override
+        public int getSerializedSize() {
+            int size = memoizedSize;
+            if (size != -1)
+                return size;
+            size = 0;
+            if (subCarrierId_ != 0) {
+                size += com.google.protobuf.CodedOutputStream.computeInt32Size(1, subCarrierId_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(active_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, active_);
+            }
+            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 ipowdm.Ipowdm.DigitalSubCarrierId)) {
+                return super.equals(obj);
+            }
+            ipowdm.Ipowdm.DigitalSubCarrierId other = (ipowdm.Ipowdm.DigitalSubCarrierId) obj;
+            if (getSubCarrierId() != other.getSubCarrierId())
+                return false;
+            if (!getActive().equals(other.getActive()))
+                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) + SUB_CARRIER_ID_FIELD_NUMBER;
+            hash = (53 * hash) + getSubCarrierId();
+            hash = (37 * hash) + ACTIVE_FIELD_NUMBER;
+            hash = (53 * hash) + getActive().hashCode();
+            hash = (29 * hash) + getUnknownFields().hashCode();
+            memoizedHashCode = hash;
+            return hash;
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarrierId parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarrierId parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarrierId parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarrierId parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarrierId parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarrierId parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarrierId parseFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarrierId 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 ipowdm.Ipowdm.DigitalSubCarrierId parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarrierId 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 ipowdm.Ipowdm.DigitalSubCarrierId parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarrierId 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(ipowdm.Ipowdm.DigitalSubCarrierId 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 ipowdm.DigitalSubCarrierId}
+         */
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:ipowdm.DigitalSubCarrierId)
+        ipowdm.Ipowdm.DigitalSubCarrierIdOrBuilder {
+
+            public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_DigitalSubCarrierId_descriptor;
+            }
+
+            @java.lang.Override
+            protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_DigitalSubCarrierId_fieldAccessorTable.ensureFieldAccessorsInitialized(ipowdm.Ipowdm.DigitalSubCarrierId.class, ipowdm.Ipowdm.DigitalSubCarrierId.Builder.class);
+            }
+
+            // Construct using ipowdm.Ipowdm.DigitalSubCarrierId.newBuilder()
+            private Builder() {
+            }
+
+            private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+                super(parent);
+            }
+
+            @java.lang.Override
+            public Builder clear() {
+                super.clear();
+                bitField0_ = 0;
+                subCarrierId_ = 0;
+                active_ = "";
+                return this;
+            }
+
+            @java.lang.Override
+            public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_DigitalSubCarrierId_descriptor;
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.DigitalSubCarrierId getDefaultInstanceForType() {
+                return ipowdm.Ipowdm.DigitalSubCarrierId.getDefaultInstance();
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.DigitalSubCarrierId build() {
+                ipowdm.Ipowdm.DigitalSubCarrierId result = buildPartial();
+                if (!result.isInitialized()) {
+                    throw newUninitializedMessageException(result);
+                }
+                return result;
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.DigitalSubCarrierId buildPartial() {
+                ipowdm.Ipowdm.DigitalSubCarrierId result = new ipowdm.Ipowdm.DigitalSubCarrierId(this);
+                if (bitField0_ != 0) {
+                    buildPartial0(result);
+                }
+                onBuilt();
+                return result;
+            }
+
+            private void buildPartial0(ipowdm.Ipowdm.DigitalSubCarrierId result) {
+                int from_bitField0_ = bitField0_;
+                if (((from_bitField0_ & 0x00000001) != 0)) {
+                    result.subCarrierId_ = subCarrierId_;
+                }
+                if (((from_bitField0_ & 0x00000002) != 0)) {
+                    result.active_ = active_;
+                }
+            }
+
+            @java.lang.Override
+            public Builder mergeFrom(com.google.protobuf.Message other) {
+                if (other instanceof ipowdm.Ipowdm.DigitalSubCarrierId) {
+                    return mergeFrom((ipowdm.Ipowdm.DigitalSubCarrierId) other);
+                } else {
+                    super.mergeFrom(other);
+                    return this;
+                }
+            }
+
+            public Builder mergeFrom(ipowdm.Ipowdm.DigitalSubCarrierId other) {
+                if (other == ipowdm.Ipowdm.DigitalSubCarrierId.getDefaultInstance())
+                    return this;
+                if (other.getSubCarrierId() != 0) {
+                    setSubCarrierId(other.getSubCarrierId());
+                }
+                if (!other.getActive().isEmpty()) {
+                    active_ = other.active_;
+                    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 8:
+                                {
+                                    subCarrierId_ = input.readInt32();
+                                    bitField0_ |= 0x00000001;
+                                    break;
+                                }
+                            // case 8
+                            case 18:
+                                {
+                                    active_ = 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 int subCarrierId_;
+
+            /**
+             * int32 sub_carrier_id = 1;
+             * @return The subCarrierId.
+             */
+            @java.lang.Override
+            public int getSubCarrierId() {
+                return subCarrierId_;
+            }
+
+            /**
+             * int32 sub_carrier_id = 1;
+             * @param value The subCarrierId to set.
+             * @return This builder for chaining.
+             */
+            public Builder setSubCarrierId(int value) {
+                subCarrierId_ = value;
+                bitField0_ |= 0x00000001;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * int32 sub_carrier_id = 1;
+             * @return This builder for chaining.
+             */
+            public Builder clearSubCarrierId() {
+                bitField0_ = (bitField0_ & ~0x00000001);
+                subCarrierId_ = 0;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object active_ = "";
+
+            /**
+             * string active = 2;
+             * @return The active.
+             */
+            public java.lang.String getActive() {
+                java.lang.Object ref = active_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    active_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string active = 2;
+             * @return The bytes for active.
+             */
+            public com.google.protobuf.ByteString getActiveBytes() {
+                java.lang.Object ref = active_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    active_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string active = 2;
+             * @param value The active to set.
+             * @return This builder for chaining.
+             */
+            public Builder setActive(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                active_ = value;
+                bitField0_ |= 0x00000002;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string active = 2;
+             * @return This builder for chaining.
+             */
+            public Builder clearActive() {
+                active_ = getDefaultInstance().getActive();
+                bitField0_ = (bitField0_ & ~0x00000002);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string active = 2;
+             * @param value The bytes for active to set.
+             * @return This builder for chaining.
+             */
+            public Builder setActiveBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                active_ = 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:ipowdm.DigitalSubCarrierId)
+        }
+
+        // @@protoc_insertion_point(class_scope:ipowdm.DigitalSubCarrierId)
+        private static final ipowdm.Ipowdm.DigitalSubCarrierId DEFAULT_INSTANCE;
+
+        static {
+            DEFAULT_INSTANCE = new ipowdm.Ipowdm.DigitalSubCarrierId();
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarrierId getDefaultInstance() {
+            return DEFAULT_INSTANCE;
+        }
+
+        private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+
+            @java.lang.Override
+            public DigitalSubCarrierId parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+                Builder builder = newBuilder();
+                try {
+                    builder.mergeFrom(input, extensionRegistry);
+                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    throw e.setUnfinishedMessage(builder.buildPartial());
+                } catch (com.google.protobuf.UninitializedMessageException e) {
+                    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 ipowdm.Ipowdm.DigitalSubCarrierId getDefaultInstanceForType() {
+            return DEFAULT_INSTANCE;
+        }
+    }
+
+    public interface DigitalSubCarriersGroupOrBuilder extends // @@protoc_insertion_point(interface_extends:ipowdm.DigitalSubCarriersGroup)
+    com.google.protobuf.MessageOrBuilder {
+
+        /**
+         * int32 digital_sub_carriers_group_id = 1;
+         * @return The digitalSubCarriersGroupId.
+         */
+        int getDigitalSubCarriersGroupId();
+
+        /**
+         * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+         */
+        java.util.List getDigitalSubCarrierIdList();
+
+        /**
+         * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+         */
+        ipowdm.Ipowdm.DigitalSubCarrierId getDigitalSubCarrierId(int index);
+
+        /**
+         * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+         */
+        int getDigitalSubCarrierIdCount();
+
+        /**
+         * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+         */
+        java.util.List getDigitalSubCarrierIdOrBuilderList();
+
+        /**
+         * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+         */
+        ipowdm.Ipowdm.DigitalSubCarrierIdOrBuilder getDigitalSubCarrierIdOrBuilder(int index);
+    }
+
+    /**
+     * Protobuf type {@code ipowdm.DigitalSubCarriersGroup}
+     */
+    public static final class DigitalSubCarriersGroup extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:ipowdm.DigitalSubCarriersGroup)
+    DigitalSubCarriersGroupOrBuilder {
+
+        private static final long serialVersionUID = 0L;
+
+        // Use DigitalSubCarriersGroup.newBuilder() to construct.
+        private DigitalSubCarriersGroup(com.google.protobuf.GeneratedMessageV3.Builder builder) {
+            super(builder);
+        }
+
+        private DigitalSubCarriersGroup() {
+            digitalSubCarrierId_ = java.util.Collections.emptyList();
+        }
+
+        @java.lang.Override
+        @SuppressWarnings({ "unused" })
+        protected java.lang.Object newInstance(UnusedPrivateParameter unused) {
+            return new DigitalSubCarriersGroup();
+        }
+
+        public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+            return ipowdm.Ipowdm.internal_static_ipowdm_DigitalSubCarriersGroup_descriptor;
+        }
+
+        @java.lang.Override
+        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+            return ipowdm.Ipowdm.internal_static_ipowdm_DigitalSubCarriersGroup_fieldAccessorTable.ensureFieldAccessorsInitialized(ipowdm.Ipowdm.DigitalSubCarriersGroup.class, ipowdm.Ipowdm.DigitalSubCarriersGroup.Builder.class);
+        }
+
+        public static final int DIGITAL_SUB_CARRIERS_GROUP_ID_FIELD_NUMBER = 1;
+
+        private int digitalSubCarriersGroupId_ = 0;
+
+        /**
+         * int32 digital_sub_carriers_group_id = 1;
+         * @return The digitalSubCarriersGroupId.
+         */
+        @java.lang.Override
+        public int getDigitalSubCarriersGroupId() {
+            return digitalSubCarriersGroupId_;
+        }
+
+        public static final int DIGITAL_SUB_CARRIER_ID_FIELD_NUMBER = 4;
+
+        @SuppressWarnings("serial")
+        private java.util.List digitalSubCarrierId_;
+
+        /**
+         * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+         */
+        @java.lang.Override
+        public java.util.List getDigitalSubCarrierIdList() {
+            return digitalSubCarrierId_;
+        }
+
+        /**
+         * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+         */
+        @java.lang.Override
+        public java.util.List getDigitalSubCarrierIdOrBuilderList() {
+            return digitalSubCarrierId_;
+        }
+
+        /**
+         * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+         */
+        @java.lang.Override
+        public int getDigitalSubCarrierIdCount() {
+            return digitalSubCarrierId_.size();
+        }
+
+        /**
+         * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+         */
+        @java.lang.Override
+        public ipowdm.Ipowdm.DigitalSubCarrierId getDigitalSubCarrierId(int index) {
+            return digitalSubCarrierId_.get(index);
+        }
+
+        /**
+         * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+         */
+        @java.lang.Override
+        public ipowdm.Ipowdm.DigitalSubCarrierIdOrBuilder getDigitalSubCarrierIdOrBuilder(int index) {
+            return digitalSubCarrierId_.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 (digitalSubCarriersGroupId_ != 0) {
+                output.writeInt32(1, digitalSubCarriersGroupId_);
+            }
+            for (int i = 0; i < digitalSubCarrierId_.size(); i++) {
+                output.writeMessage(4, digitalSubCarrierId_.get(i));
+            }
+            getUnknownFields().writeTo(output);
+        }
+
+        @java.lang.Override
+        public int getSerializedSize() {
+            int size = memoizedSize;
+            if (size != -1)
+                return size;
+            size = 0;
+            if (digitalSubCarriersGroupId_ != 0) {
+                size += com.google.protobuf.CodedOutputStream.computeInt32Size(1, digitalSubCarriersGroupId_);
+            }
+            for (int i = 0; i < digitalSubCarrierId_.size(); i++) {
+                size += com.google.protobuf.CodedOutputStream.computeMessageSize(4, digitalSubCarrierId_.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 ipowdm.Ipowdm.DigitalSubCarriersGroup)) {
+                return super.equals(obj);
+            }
+            ipowdm.Ipowdm.DigitalSubCarriersGroup other = (ipowdm.Ipowdm.DigitalSubCarriersGroup) obj;
+            if (getDigitalSubCarriersGroupId() != other.getDigitalSubCarriersGroupId())
+                return false;
+            if (!getDigitalSubCarrierIdList().equals(other.getDigitalSubCarrierIdList()))
+                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) + DIGITAL_SUB_CARRIERS_GROUP_ID_FIELD_NUMBER;
+            hash = (53 * hash) + getDigitalSubCarriersGroupId();
+            if (getDigitalSubCarrierIdCount() > 0) {
+                hash = (37 * hash) + DIGITAL_SUB_CARRIER_ID_FIELD_NUMBER;
+                hash = (53 * hash) + getDigitalSubCarrierIdList().hashCode();
+            }
+            hash = (29 * hash) + getUnknownFields().hashCode();
+            memoizedHashCode = hash;
+            return hash;
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarriersGroup parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarriersGroup parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarriersGroup parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarriersGroup parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarriersGroup parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarriersGroup parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarriersGroup parseFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarriersGroup 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 ipowdm.Ipowdm.DigitalSubCarriersGroup parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarriersGroup 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 ipowdm.Ipowdm.DigitalSubCarriersGroup parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarriersGroup 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(ipowdm.Ipowdm.DigitalSubCarriersGroup 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 ipowdm.DigitalSubCarriersGroup}
+         */
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:ipowdm.DigitalSubCarriersGroup)
+        ipowdm.Ipowdm.DigitalSubCarriersGroupOrBuilder {
+
+            public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_DigitalSubCarriersGroup_descriptor;
+            }
+
+            @java.lang.Override
+            protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_DigitalSubCarriersGroup_fieldAccessorTable.ensureFieldAccessorsInitialized(ipowdm.Ipowdm.DigitalSubCarriersGroup.class, ipowdm.Ipowdm.DigitalSubCarriersGroup.Builder.class);
+            }
+
+            // Construct using ipowdm.Ipowdm.DigitalSubCarriersGroup.newBuilder()
+            private Builder() {
+            }
+
+            private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+                super(parent);
+            }
+
+            @java.lang.Override
+            public Builder clear() {
+                super.clear();
+                bitField0_ = 0;
+                digitalSubCarriersGroupId_ = 0;
+                if (digitalSubCarrierIdBuilder_ == null) {
+                    digitalSubCarrierId_ = java.util.Collections.emptyList();
+                } else {
+                    digitalSubCarrierId_ = null;
+                    digitalSubCarrierIdBuilder_.clear();
+                }
+                bitField0_ = (bitField0_ & ~0x00000002);
+                return this;
+            }
+
+            @java.lang.Override
+            public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_DigitalSubCarriersGroup_descriptor;
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.DigitalSubCarriersGroup getDefaultInstanceForType() {
+                return ipowdm.Ipowdm.DigitalSubCarriersGroup.getDefaultInstance();
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.DigitalSubCarriersGroup build() {
+                ipowdm.Ipowdm.DigitalSubCarriersGroup result = buildPartial();
+                if (!result.isInitialized()) {
+                    throw newUninitializedMessageException(result);
+                }
+                return result;
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.DigitalSubCarriersGroup buildPartial() {
+                ipowdm.Ipowdm.DigitalSubCarriersGroup result = new ipowdm.Ipowdm.DigitalSubCarriersGroup(this);
+                buildPartialRepeatedFields(result);
+                if (bitField0_ != 0) {
+                    buildPartial0(result);
+                }
+                onBuilt();
+                return result;
+            }
+
+            private void buildPartialRepeatedFields(ipowdm.Ipowdm.DigitalSubCarriersGroup result) {
+                if (digitalSubCarrierIdBuilder_ == null) {
+                    if (((bitField0_ & 0x00000002) != 0)) {
+                        digitalSubCarrierId_ = java.util.Collections.unmodifiableList(digitalSubCarrierId_);
+                        bitField0_ = (bitField0_ & ~0x00000002);
+                    }
+                    result.digitalSubCarrierId_ = digitalSubCarrierId_;
+                } else {
+                    result.digitalSubCarrierId_ = digitalSubCarrierIdBuilder_.build();
+                }
+            }
+
+            private void buildPartial0(ipowdm.Ipowdm.DigitalSubCarriersGroup result) {
+                int from_bitField0_ = bitField0_;
+                if (((from_bitField0_ & 0x00000001) != 0)) {
+                    result.digitalSubCarriersGroupId_ = digitalSubCarriersGroupId_;
+                }
+            }
+
+            @java.lang.Override
+            public Builder mergeFrom(com.google.protobuf.Message other) {
+                if (other instanceof ipowdm.Ipowdm.DigitalSubCarriersGroup) {
+                    return mergeFrom((ipowdm.Ipowdm.DigitalSubCarriersGroup) other);
+                } else {
+                    super.mergeFrom(other);
+                    return this;
+                }
+            }
+
+            public Builder mergeFrom(ipowdm.Ipowdm.DigitalSubCarriersGroup other) {
+                if (other == ipowdm.Ipowdm.DigitalSubCarriersGroup.getDefaultInstance())
+                    return this;
+                if (other.getDigitalSubCarriersGroupId() != 0) {
+                    setDigitalSubCarriersGroupId(other.getDigitalSubCarriersGroupId());
+                }
+                if (digitalSubCarrierIdBuilder_ == null) {
+                    if (!other.digitalSubCarrierId_.isEmpty()) {
+                        if (digitalSubCarrierId_.isEmpty()) {
+                            digitalSubCarrierId_ = other.digitalSubCarrierId_;
+                            bitField0_ = (bitField0_ & ~0x00000002);
+                        } else {
+                            ensureDigitalSubCarrierIdIsMutable();
+                            digitalSubCarrierId_.addAll(other.digitalSubCarrierId_);
+                        }
+                        onChanged();
+                    }
+                } else {
+                    if (!other.digitalSubCarrierId_.isEmpty()) {
+                        if (digitalSubCarrierIdBuilder_.isEmpty()) {
+                            digitalSubCarrierIdBuilder_.dispose();
+                            digitalSubCarrierIdBuilder_ = null;
+                            digitalSubCarrierId_ = other.digitalSubCarrierId_;
+                            bitField0_ = (bitField0_ & ~0x00000002);
+                            digitalSubCarrierIdBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getDigitalSubCarrierIdFieldBuilder() : null;
+                        } else {
+                            digitalSubCarrierIdBuilder_.addAllMessages(other.digitalSubCarrierId_);
+                        }
+                    }
+                }
+                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 8:
+                                {
+                                    digitalSubCarriersGroupId_ = input.readInt32();
+                                    bitField0_ |= 0x00000001;
+                                    break;
+                                }
+                            // case 8
+                            case 34:
+                                {
+                                    ipowdm.Ipowdm.DigitalSubCarrierId m = input.readMessage(ipowdm.Ipowdm.DigitalSubCarrierId.parser(), extensionRegistry);
+                                    if (digitalSubCarrierIdBuilder_ == null) {
+                                        ensureDigitalSubCarrierIdIsMutable();
+                                        digitalSubCarrierId_.add(m);
+                                    } else {
+                                        digitalSubCarrierIdBuilder_.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 int digitalSubCarriersGroupId_;
+
+            /**
+             * int32 digital_sub_carriers_group_id = 1;
+             * @return The digitalSubCarriersGroupId.
+             */
+            @java.lang.Override
+            public int getDigitalSubCarriersGroupId() {
+                return digitalSubCarriersGroupId_;
+            }
+
+            /**
+             * int32 digital_sub_carriers_group_id = 1;
+             * @param value The digitalSubCarriersGroupId to set.
+             * @return This builder for chaining.
+             */
+            public Builder setDigitalSubCarriersGroupId(int value) {
+                digitalSubCarriersGroupId_ = value;
+                bitField0_ |= 0x00000001;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * int32 digital_sub_carriers_group_id = 1;
+             * @return This builder for chaining.
+             */
+            public Builder clearDigitalSubCarriersGroupId() {
+                bitField0_ = (bitField0_ & ~0x00000001);
+                digitalSubCarriersGroupId_ = 0;
+                onChanged();
+                return this;
+            }
+
+            private java.util.List digitalSubCarrierId_ = java.util.Collections.emptyList();
+
+            private void ensureDigitalSubCarrierIdIsMutable() {
+                if (!((bitField0_ & 0x00000002) != 0)) {
+                    digitalSubCarrierId_ = new java.util.ArrayList(digitalSubCarrierId_);
+                    bitField0_ |= 0x00000002;
+                }
+            }
+
+            private com.google.protobuf.RepeatedFieldBuilderV3 digitalSubCarrierIdBuilder_;
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public java.util.List getDigitalSubCarrierIdList() {
+                if (digitalSubCarrierIdBuilder_ == null) {
+                    return java.util.Collections.unmodifiableList(digitalSubCarrierId_);
+                } else {
+                    return digitalSubCarrierIdBuilder_.getMessageList();
+                }
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public int getDigitalSubCarrierIdCount() {
+                if (digitalSubCarrierIdBuilder_ == null) {
+                    return digitalSubCarrierId_.size();
+                } else {
+                    return digitalSubCarrierIdBuilder_.getCount();
+                }
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public ipowdm.Ipowdm.DigitalSubCarrierId getDigitalSubCarrierId(int index) {
+                if (digitalSubCarrierIdBuilder_ == null) {
+                    return digitalSubCarrierId_.get(index);
+                } else {
+                    return digitalSubCarrierIdBuilder_.getMessage(index);
+                }
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public Builder setDigitalSubCarrierId(int index, ipowdm.Ipowdm.DigitalSubCarrierId value) {
+                if (digitalSubCarrierIdBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureDigitalSubCarrierIdIsMutable();
+                    digitalSubCarrierId_.set(index, value);
+                    onChanged();
+                } else {
+                    digitalSubCarrierIdBuilder_.setMessage(index, value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public Builder setDigitalSubCarrierId(int index, ipowdm.Ipowdm.DigitalSubCarrierId.Builder builderForValue) {
+                if (digitalSubCarrierIdBuilder_ == null) {
+                    ensureDigitalSubCarrierIdIsMutable();
+                    digitalSubCarrierId_.set(index, builderForValue.build());
+                    onChanged();
+                } else {
+                    digitalSubCarrierIdBuilder_.setMessage(index, builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public Builder addDigitalSubCarrierId(ipowdm.Ipowdm.DigitalSubCarrierId value) {
+                if (digitalSubCarrierIdBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureDigitalSubCarrierIdIsMutable();
+                    digitalSubCarrierId_.add(value);
+                    onChanged();
+                } else {
+                    digitalSubCarrierIdBuilder_.addMessage(value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public Builder addDigitalSubCarrierId(int index, ipowdm.Ipowdm.DigitalSubCarrierId value) {
+                if (digitalSubCarrierIdBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureDigitalSubCarrierIdIsMutable();
+                    digitalSubCarrierId_.add(index, value);
+                    onChanged();
+                } else {
+                    digitalSubCarrierIdBuilder_.addMessage(index, value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public Builder addDigitalSubCarrierId(ipowdm.Ipowdm.DigitalSubCarrierId.Builder builderForValue) {
+                if (digitalSubCarrierIdBuilder_ == null) {
+                    ensureDigitalSubCarrierIdIsMutable();
+                    digitalSubCarrierId_.add(builderForValue.build());
+                    onChanged();
+                } else {
+                    digitalSubCarrierIdBuilder_.addMessage(builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public Builder addDigitalSubCarrierId(int index, ipowdm.Ipowdm.DigitalSubCarrierId.Builder builderForValue) {
+                if (digitalSubCarrierIdBuilder_ == null) {
+                    ensureDigitalSubCarrierIdIsMutable();
+                    digitalSubCarrierId_.add(index, builderForValue.build());
+                    onChanged();
+                } else {
+                    digitalSubCarrierIdBuilder_.addMessage(index, builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public Builder addAllDigitalSubCarrierId(java.lang.Iterable values) {
+                if (digitalSubCarrierIdBuilder_ == null) {
+                    ensureDigitalSubCarrierIdIsMutable();
+                    com.google.protobuf.AbstractMessageLite.Builder.addAll(values, digitalSubCarrierId_);
+                    onChanged();
+                } else {
+                    digitalSubCarrierIdBuilder_.addAllMessages(values);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public Builder clearDigitalSubCarrierId() {
+                if (digitalSubCarrierIdBuilder_ == null) {
+                    digitalSubCarrierId_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000002);
+                    onChanged();
+                } else {
+                    digitalSubCarrierIdBuilder_.clear();
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public Builder removeDigitalSubCarrierId(int index) {
+                if (digitalSubCarrierIdBuilder_ == null) {
+                    ensureDigitalSubCarrierIdIsMutable();
+                    digitalSubCarrierId_.remove(index);
+                    onChanged();
+                } else {
+                    digitalSubCarrierIdBuilder_.remove(index);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public ipowdm.Ipowdm.DigitalSubCarrierId.Builder getDigitalSubCarrierIdBuilder(int index) {
+                return getDigitalSubCarrierIdFieldBuilder().getBuilder(index);
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public ipowdm.Ipowdm.DigitalSubCarrierIdOrBuilder getDigitalSubCarrierIdOrBuilder(int index) {
+                if (digitalSubCarrierIdBuilder_ == null) {
+                    return digitalSubCarrierId_.get(index);
+                } else {
+                    return digitalSubCarrierIdBuilder_.getMessageOrBuilder(index);
+                }
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public java.util.List getDigitalSubCarrierIdOrBuilderList() {
+                if (digitalSubCarrierIdBuilder_ != null) {
+                    return digitalSubCarrierIdBuilder_.getMessageOrBuilderList();
+                } else {
+                    return java.util.Collections.unmodifiableList(digitalSubCarrierId_);
+                }
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public ipowdm.Ipowdm.DigitalSubCarrierId.Builder addDigitalSubCarrierIdBuilder() {
+                return getDigitalSubCarrierIdFieldBuilder().addBuilder(ipowdm.Ipowdm.DigitalSubCarrierId.getDefaultInstance());
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public ipowdm.Ipowdm.DigitalSubCarrierId.Builder addDigitalSubCarrierIdBuilder(int index) {
+                return getDigitalSubCarrierIdFieldBuilder().addBuilder(index, ipowdm.Ipowdm.DigitalSubCarrierId.getDefaultInstance());
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarrierId digital_sub_carrier_id = 4;
+             */
+            public java.util.List getDigitalSubCarrierIdBuilderList() {
+                return getDigitalSubCarrierIdFieldBuilder().getBuilderList();
+            }
+
+            private com.google.protobuf.RepeatedFieldBuilderV3 getDigitalSubCarrierIdFieldBuilder() {
+                if (digitalSubCarrierIdBuilder_ == null) {
+                    digitalSubCarrierIdBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(digitalSubCarrierId_, ((bitField0_ & 0x00000002) != 0), getParentForChildren(), isClean());
+                    digitalSubCarrierId_ = null;
+                }
+                return digitalSubCarrierIdBuilder_;
+            }
+
+            @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:ipowdm.DigitalSubCarriersGroup)
+        }
+
+        // @@protoc_insertion_point(class_scope:ipowdm.DigitalSubCarriersGroup)
+        private static final ipowdm.Ipowdm.DigitalSubCarriersGroup DEFAULT_INSTANCE;
+
+        static {
+            DEFAULT_INSTANCE = new ipowdm.Ipowdm.DigitalSubCarriersGroup();
+        }
+
+        public static ipowdm.Ipowdm.DigitalSubCarriersGroup getDefaultInstance() {
+            return DEFAULT_INSTANCE;
+        }
+
+        private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+
+            @java.lang.Override
+            public DigitalSubCarriersGroup parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+                Builder builder = newBuilder();
+                try {
+                    builder.mergeFrom(input, extensionRegistry);
+                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    throw e.setUnfinishedMessage(builder.buildPartial());
+                } catch (com.google.protobuf.UninitializedMessageException e) {
+                    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 ipowdm.Ipowdm.DigitalSubCarriersGroup getDefaultInstanceForType() {
+            return DEFAULT_INSTANCE;
+        }
+    }
+
+    public interface ComponentOrBuilder extends // @@protoc_insertion_point(interface_extends:ipowdm.Component)
+    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();
+
+        /**
+         * float frequency = 2;
+         * @return The frequency.
+         */
+        float getFrequency();
+
+        /**
+         * float target_output_power = 3;
+         * @return The targetOutputPower.
+         */
+        float getTargetOutputPower();
+
+        /**
+         * int32 operational_mode = 4;
+         * @return The operationalMode.
+         */
+        int getOperationalMode();
+
+        /**
+         * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+         */
+        java.util.List getDigitalSubCarriersGroupList();
+
+        /**
+         * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+         */
+        ipowdm.Ipowdm.DigitalSubCarriersGroup getDigitalSubCarriersGroup(int index);
+
+        /**
+         * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+         */
+        int getDigitalSubCarriersGroupCount();
+
+        /**
+         * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+         */
+        java.util.List getDigitalSubCarriersGroupOrBuilderList();
+
+        /**
+         * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+         */
+        ipowdm.Ipowdm.DigitalSubCarriersGroupOrBuilder getDigitalSubCarriersGroupOrBuilder(int index);
+
+        /**
+         * string operation = 6;
+         * @return The operation.
+         */
+        java.lang.String getOperation();
+
+        /**
+         * string operation = 6;
+         * @return The bytes for operation.
+         */
+        com.google.protobuf.ByteString getOperationBytes();
+    }
+
+    /**
+     * Protobuf type {@code ipowdm.Component}
+     */
+    public static final class Component extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:ipowdm.Component)
+    ComponentOrBuilder {
+
+        private static final long serialVersionUID = 0L;
+
+        // Use Component.newBuilder() to construct.
+        private Component(com.google.protobuf.GeneratedMessageV3.Builder builder) {
+            super(builder);
+        }
+
+        private Component() {
+            name_ = "";
+            digitalSubCarriersGroup_ = java.util.Collections.emptyList();
+            operation_ = "";
+        }
+
+        @java.lang.Override
+        @SuppressWarnings({ "unused" })
+        protected java.lang.Object newInstance(UnusedPrivateParameter unused) {
+            return new Component();
+        }
+
+        public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+            return ipowdm.Ipowdm.internal_static_ipowdm_Component_descriptor;
+        }
+
+        @java.lang.Override
+        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+            return ipowdm.Ipowdm.internal_static_ipowdm_Component_fieldAccessorTable.ensureFieldAccessorsInitialized(ipowdm.Ipowdm.Component.class, ipowdm.Ipowdm.Component.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 FREQUENCY_FIELD_NUMBER = 2;
+
+        private float frequency_ = 0F;
+
+        /**
+         * float frequency = 2;
+         * @return The frequency.
+         */
+        @java.lang.Override
+        public float getFrequency() {
+            return frequency_;
+        }
+
+        public static final int TARGET_OUTPUT_POWER_FIELD_NUMBER = 3;
+
+        private float targetOutputPower_ = 0F;
+
+        /**
+         * float target_output_power = 3;
+         * @return The targetOutputPower.
+         */
+        @java.lang.Override
+        public float getTargetOutputPower() {
+            return targetOutputPower_;
+        }
+
+        public static final int OPERATIONAL_MODE_FIELD_NUMBER = 4;
+
+        private int operationalMode_ = 0;
+
+        /**
+         * int32 operational_mode = 4;
+         * @return The operationalMode.
+         */
+        @java.lang.Override
+        public int getOperationalMode() {
+            return operationalMode_;
+        }
+
+        public static final int DIGITAL_SUB_CARRIERS_GROUP_FIELD_NUMBER = 5;
+
+        @SuppressWarnings("serial")
+        private java.util.List digitalSubCarriersGroup_;
+
+        /**
+         * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+         */
+        @java.lang.Override
+        public java.util.List getDigitalSubCarriersGroupList() {
+            return digitalSubCarriersGroup_;
+        }
+
+        /**
+         * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+         */
+        @java.lang.Override
+        public java.util.List getDigitalSubCarriersGroupOrBuilderList() {
+            return digitalSubCarriersGroup_;
+        }
+
+        /**
+         * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+         */
+        @java.lang.Override
+        public int getDigitalSubCarriersGroupCount() {
+            return digitalSubCarriersGroup_.size();
+        }
+
+        /**
+         * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+         */
+        @java.lang.Override
+        public ipowdm.Ipowdm.DigitalSubCarriersGroup getDigitalSubCarriersGroup(int index) {
+            return digitalSubCarriersGroup_.get(index);
+        }
+
+        /**
+         * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+         */
+        @java.lang.Override
+        public ipowdm.Ipowdm.DigitalSubCarriersGroupOrBuilder getDigitalSubCarriersGroupOrBuilder(int index) {
+            return digitalSubCarriersGroup_.get(index);
+        }
+
+        public static final int OPERATION_FIELD_NUMBER = 6;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object operation_ = "";
+
+        /**
+         * string operation = 6;
+         * @return The operation.
+         */
+        @java.lang.Override
+        public java.lang.String getOperation() {
+            java.lang.Object ref = operation_;
+            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();
+                operation_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string operation = 6;
+         * @return The bytes for operation.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getOperationBytes() {
+            java.lang.Object ref = operation_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                operation_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        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 (java.lang.Float.floatToRawIntBits(frequency_) != 0) {
+                output.writeFloat(2, frequency_);
+            }
+            if (java.lang.Float.floatToRawIntBits(targetOutputPower_) != 0) {
+                output.writeFloat(3, targetOutputPower_);
+            }
+            if (operationalMode_ != 0) {
+                output.writeInt32(4, operationalMode_);
+            }
+            for (int i = 0; i < digitalSubCarriersGroup_.size(); i++) {
+                output.writeMessage(5, digitalSubCarriersGroup_.get(i));
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(operation_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 6, operation_);
+            }
+            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 (java.lang.Float.floatToRawIntBits(frequency_) != 0) {
+                size += com.google.protobuf.CodedOutputStream.computeFloatSize(2, frequency_);
+            }
+            if (java.lang.Float.floatToRawIntBits(targetOutputPower_) != 0) {
+                size += com.google.protobuf.CodedOutputStream.computeFloatSize(3, targetOutputPower_);
+            }
+            if (operationalMode_ != 0) {
+                size += com.google.protobuf.CodedOutputStream.computeInt32Size(4, operationalMode_);
+            }
+            for (int i = 0; i < digitalSubCarriersGroup_.size(); i++) {
+                size += com.google.protobuf.CodedOutputStream.computeMessageSize(5, digitalSubCarriersGroup_.get(i));
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(operation_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(6, operation_);
+            }
+            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 ipowdm.Ipowdm.Component)) {
+                return super.equals(obj);
+            }
+            ipowdm.Ipowdm.Component other = (ipowdm.Ipowdm.Component) obj;
+            if (!getName().equals(other.getName()))
+                return false;
+            if (java.lang.Float.floatToIntBits(getFrequency()) != java.lang.Float.floatToIntBits(other.getFrequency()))
+                return false;
+            if (java.lang.Float.floatToIntBits(getTargetOutputPower()) != java.lang.Float.floatToIntBits(other.getTargetOutputPower()))
+                return false;
+            if (getOperationalMode() != other.getOperationalMode())
+                return false;
+            if (!getDigitalSubCarriersGroupList().equals(other.getDigitalSubCarriersGroupList()))
+                return false;
+            if (!getOperation().equals(other.getOperation()))
+                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();
+            hash = (37 * hash) + FREQUENCY_FIELD_NUMBER;
+            hash = (53 * hash) + java.lang.Float.floatToIntBits(getFrequency());
+            hash = (37 * hash) + TARGET_OUTPUT_POWER_FIELD_NUMBER;
+            hash = (53 * hash) + java.lang.Float.floatToIntBits(getTargetOutputPower());
+            hash = (37 * hash) + OPERATIONAL_MODE_FIELD_NUMBER;
+            hash = (53 * hash) + getOperationalMode();
+            if (getDigitalSubCarriersGroupCount() > 0) {
+                hash = (37 * hash) + DIGITAL_SUB_CARRIERS_GROUP_FIELD_NUMBER;
+                hash = (53 * hash) + getDigitalSubCarriersGroupList().hashCode();
+            }
+            hash = (37 * hash) + OPERATION_FIELD_NUMBER;
+            hash = (53 * hash) + getOperation().hashCode();
+            hash = (29 * hash) + getUnknownFields().hashCode();
+            memoizedHashCode = hash;
+            return hash;
+        }
+
+        public static ipowdm.Ipowdm.Component parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.Component parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.Component parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.Component parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.Component parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.Component parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.Component parseFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.Component 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 ipowdm.Ipowdm.Component parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.Component 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 ipowdm.Ipowdm.Component parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.Component 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(ipowdm.Ipowdm.Component 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 ipowdm.Component}
+         */
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:ipowdm.Component)
+        ipowdm.Ipowdm.ComponentOrBuilder {
+
+            public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_Component_descriptor;
+            }
+
+            @java.lang.Override
+            protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_Component_fieldAccessorTable.ensureFieldAccessorsInitialized(ipowdm.Ipowdm.Component.class, ipowdm.Ipowdm.Component.Builder.class);
+            }
+
+            // Construct using ipowdm.Ipowdm.Component.newBuilder()
+            private Builder() {
+            }
+
+            private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+                super(parent);
+            }
+
+            @java.lang.Override
+            public Builder clear() {
+                super.clear();
+                bitField0_ = 0;
+                name_ = "";
+                frequency_ = 0F;
+                targetOutputPower_ = 0F;
+                operationalMode_ = 0;
+                if (digitalSubCarriersGroupBuilder_ == null) {
+                    digitalSubCarriersGroup_ = java.util.Collections.emptyList();
+                } else {
+                    digitalSubCarriersGroup_ = null;
+                    digitalSubCarriersGroupBuilder_.clear();
+                }
+                bitField0_ = (bitField0_ & ~0x00000010);
+                operation_ = "";
+                return this;
+            }
+
+            @java.lang.Override
+            public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_Component_descriptor;
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.Component getDefaultInstanceForType() {
+                return ipowdm.Ipowdm.Component.getDefaultInstance();
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.Component build() {
+                ipowdm.Ipowdm.Component result = buildPartial();
+                if (!result.isInitialized()) {
+                    throw newUninitializedMessageException(result);
+                }
+                return result;
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.Component buildPartial() {
+                ipowdm.Ipowdm.Component result = new ipowdm.Ipowdm.Component(this);
+                buildPartialRepeatedFields(result);
+                if (bitField0_ != 0) {
+                    buildPartial0(result);
+                }
+                onBuilt();
+                return result;
+            }
+
+            private void buildPartialRepeatedFields(ipowdm.Ipowdm.Component result) {
+                if (digitalSubCarriersGroupBuilder_ == null) {
+                    if (((bitField0_ & 0x00000010) != 0)) {
+                        digitalSubCarriersGroup_ = java.util.Collections.unmodifiableList(digitalSubCarriersGroup_);
+                        bitField0_ = (bitField0_ & ~0x00000010);
+                    }
+                    result.digitalSubCarriersGroup_ = digitalSubCarriersGroup_;
+                } else {
+                    result.digitalSubCarriersGroup_ = digitalSubCarriersGroupBuilder_.build();
+                }
+            }
+
+            private void buildPartial0(ipowdm.Ipowdm.Component result) {
+                int from_bitField0_ = bitField0_;
+                if (((from_bitField0_ & 0x00000001) != 0)) {
+                    result.name_ = name_;
+                }
+                if (((from_bitField0_ & 0x00000002) != 0)) {
+                    result.frequency_ = frequency_;
+                }
+                if (((from_bitField0_ & 0x00000004) != 0)) {
+                    result.targetOutputPower_ = targetOutputPower_;
+                }
+                if (((from_bitField0_ & 0x00000008) != 0)) {
+                    result.operationalMode_ = operationalMode_;
+                }
+                if (((from_bitField0_ & 0x00000020) != 0)) {
+                    result.operation_ = operation_;
+                }
+            }
+
+            @java.lang.Override
+            public Builder mergeFrom(com.google.protobuf.Message other) {
+                if (other instanceof ipowdm.Ipowdm.Component) {
+                    return mergeFrom((ipowdm.Ipowdm.Component) other);
+                } else {
+                    super.mergeFrom(other);
+                    return this;
+                }
+            }
+
+            public Builder mergeFrom(ipowdm.Ipowdm.Component other) {
+                if (other == ipowdm.Ipowdm.Component.getDefaultInstance())
+                    return this;
+                if (!other.getName().isEmpty()) {
+                    name_ = other.name_;
+                    bitField0_ |= 0x00000001;
+                    onChanged();
+                }
+                if (other.getFrequency() != 0F) {
+                    setFrequency(other.getFrequency());
+                }
+                if (other.getTargetOutputPower() != 0F) {
+                    setTargetOutputPower(other.getTargetOutputPower());
+                }
+                if (other.getOperationalMode() != 0) {
+                    setOperationalMode(other.getOperationalMode());
+                }
+                if (digitalSubCarriersGroupBuilder_ == null) {
+                    if (!other.digitalSubCarriersGroup_.isEmpty()) {
+                        if (digitalSubCarriersGroup_.isEmpty()) {
+                            digitalSubCarriersGroup_ = other.digitalSubCarriersGroup_;
+                            bitField0_ = (bitField0_ & ~0x00000010);
+                        } else {
+                            ensureDigitalSubCarriersGroupIsMutable();
+                            digitalSubCarriersGroup_.addAll(other.digitalSubCarriersGroup_);
+                        }
+                        onChanged();
+                    }
+                } else {
+                    if (!other.digitalSubCarriersGroup_.isEmpty()) {
+                        if (digitalSubCarriersGroupBuilder_.isEmpty()) {
+                            digitalSubCarriersGroupBuilder_.dispose();
+                            digitalSubCarriersGroupBuilder_ = null;
+                            digitalSubCarriersGroup_ = other.digitalSubCarriersGroup_;
+                            bitField0_ = (bitField0_ & ~0x00000010);
+                            digitalSubCarriersGroupBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getDigitalSubCarriersGroupFieldBuilder() : null;
+                        } else {
+                            digitalSubCarriersGroupBuilder_.addAllMessages(other.digitalSubCarriersGroup_);
+                        }
+                    }
+                }
+                if (!other.getOperation().isEmpty()) {
+                    operation_ = other.operation_;
+                    bitField0_ |= 0x00000020;
+                    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:
+                                {
+                                    name_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00000001;
+                                    break;
+                                }
+                            // case 10
+                            case 21:
+                                {
+                                    frequency_ = input.readFloat();
+                                    bitField0_ |= 0x00000002;
+                                    break;
+                                }
+                            // case 21
+                            case 29:
+                                {
+                                    targetOutputPower_ = input.readFloat();
+                                    bitField0_ |= 0x00000004;
+                                    break;
+                                }
+                            // case 29
+                            case 32:
+                                {
+                                    operationalMode_ = input.readInt32();
+                                    bitField0_ |= 0x00000008;
+                                    break;
+                                }
+                            // case 32
+                            case 42:
+                                {
+                                    ipowdm.Ipowdm.DigitalSubCarriersGroup m = input.readMessage(ipowdm.Ipowdm.DigitalSubCarriersGroup.parser(), extensionRegistry);
+                                    if (digitalSubCarriersGroupBuilder_ == null) {
+                                        ensureDigitalSubCarriersGroupIsMutable();
+                                        digitalSubCarriersGroup_.add(m);
+                                    } else {
+                                        digitalSubCarriersGroupBuilder_.addMessage(m);
+                                    }
+                                    break;
+                                }
+                            // case 42
+                            case 50:
+                                {
+                                    operation_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00000020;
+                                    break;
+                                }
+                            // case 50
+                            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 float frequency_;
+
+            /**
+             * float frequency = 2;
+             * @return The frequency.
+             */
+            @java.lang.Override
+            public float getFrequency() {
+                return frequency_;
+            }
+
+            /**
+             * float frequency = 2;
+             * @param value The frequency to set.
+             * @return This builder for chaining.
+             */
+            public Builder setFrequency(float value) {
+                frequency_ = value;
+                bitField0_ |= 0x00000002;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * float frequency = 2;
+             * @return This builder for chaining.
+             */
+            public Builder clearFrequency() {
+                bitField0_ = (bitField0_ & ~0x00000002);
+                frequency_ = 0F;
+                onChanged();
+                return this;
+            }
+
+            private float targetOutputPower_;
+
+            /**
+             * float target_output_power = 3;
+             * @return The targetOutputPower.
+             */
+            @java.lang.Override
+            public float getTargetOutputPower() {
+                return targetOutputPower_;
+            }
+
+            /**
+             * float target_output_power = 3;
+             * @param value The targetOutputPower to set.
+             * @return This builder for chaining.
+             */
+            public Builder setTargetOutputPower(float value) {
+                targetOutputPower_ = value;
+                bitField0_ |= 0x00000004;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * float target_output_power = 3;
+             * @return This builder for chaining.
+             */
+            public Builder clearTargetOutputPower() {
+                bitField0_ = (bitField0_ & ~0x00000004);
+                targetOutputPower_ = 0F;
+                onChanged();
+                return this;
+            }
+
+            private int operationalMode_;
+
+            /**
+             * int32 operational_mode = 4;
+             * @return The operationalMode.
+             */
+            @java.lang.Override
+            public int getOperationalMode() {
+                return operationalMode_;
+            }
+
+            /**
+             * int32 operational_mode = 4;
+             * @param value The operationalMode to set.
+             * @return This builder for chaining.
+             */
+            public Builder setOperationalMode(int value) {
+                operationalMode_ = value;
+                bitField0_ |= 0x00000008;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * int32 operational_mode = 4;
+             * @return This builder for chaining.
+             */
+            public Builder clearOperationalMode() {
+                bitField0_ = (bitField0_ & ~0x00000008);
+                operationalMode_ = 0;
+                onChanged();
+                return this;
+            }
+
+            private java.util.List digitalSubCarriersGroup_ = java.util.Collections.emptyList();
+
+            private void ensureDigitalSubCarriersGroupIsMutable() {
+                if (!((bitField0_ & 0x00000010) != 0)) {
+                    digitalSubCarriersGroup_ = new java.util.ArrayList(digitalSubCarriersGroup_);
+                    bitField0_ |= 0x00000010;
+                }
+            }
+
+            private com.google.protobuf.RepeatedFieldBuilderV3 digitalSubCarriersGroupBuilder_;
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public java.util.List getDigitalSubCarriersGroupList() {
+                if (digitalSubCarriersGroupBuilder_ == null) {
+                    return java.util.Collections.unmodifiableList(digitalSubCarriersGroup_);
+                } else {
+                    return digitalSubCarriersGroupBuilder_.getMessageList();
+                }
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public int getDigitalSubCarriersGroupCount() {
+                if (digitalSubCarriersGroupBuilder_ == null) {
+                    return digitalSubCarriersGroup_.size();
+                } else {
+                    return digitalSubCarriersGroupBuilder_.getCount();
+                }
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public ipowdm.Ipowdm.DigitalSubCarriersGroup getDigitalSubCarriersGroup(int index) {
+                if (digitalSubCarriersGroupBuilder_ == null) {
+                    return digitalSubCarriersGroup_.get(index);
+                } else {
+                    return digitalSubCarriersGroupBuilder_.getMessage(index);
+                }
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public Builder setDigitalSubCarriersGroup(int index, ipowdm.Ipowdm.DigitalSubCarriersGroup value) {
+                if (digitalSubCarriersGroupBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureDigitalSubCarriersGroupIsMutable();
+                    digitalSubCarriersGroup_.set(index, value);
+                    onChanged();
+                } else {
+                    digitalSubCarriersGroupBuilder_.setMessage(index, value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public Builder setDigitalSubCarriersGroup(int index, ipowdm.Ipowdm.DigitalSubCarriersGroup.Builder builderForValue) {
+                if (digitalSubCarriersGroupBuilder_ == null) {
+                    ensureDigitalSubCarriersGroupIsMutable();
+                    digitalSubCarriersGroup_.set(index, builderForValue.build());
+                    onChanged();
+                } else {
+                    digitalSubCarriersGroupBuilder_.setMessage(index, builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public Builder addDigitalSubCarriersGroup(ipowdm.Ipowdm.DigitalSubCarriersGroup value) {
+                if (digitalSubCarriersGroupBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureDigitalSubCarriersGroupIsMutable();
+                    digitalSubCarriersGroup_.add(value);
+                    onChanged();
+                } else {
+                    digitalSubCarriersGroupBuilder_.addMessage(value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public Builder addDigitalSubCarriersGroup(int index, ipowdm.Ipowdm.DigitalSubCarriersGroup value) {
+                if (digitalSubCarriersGroupBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureDigitalSubCarriersGroupIsMutable();
+                    digitalSubCarriersGroup_.add(index, value);
+                    onChanged();
+                } else {
+                    digitalSubCarriersGroupBuilder_.addMessage(index, value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public Builder addDigitalSubCarriersGroup(ipowdm.Ipowdm.DigitalSubCarriersGroup.Builder builderForValue) {
+                if (digitalSubCarriersGroupBuilder_ == null) {
+                    ensureDigitalSubCarriersGroupIsMutable();
+                    digitalSubCarriersGroup_.add(builderForValue.build());
+                    onChanged();
+                } else {
+                    digitalSubCarriersGroupBuilder_.addMessage(builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public Builder addDigitalSubCarriersGroup(int index, ipowdm.Ipowdm.DigitalSubCarriersGroup.Builder builderForValue) {
+                if (digitalSubCarriersGroupBuilder_ == null) {
+                    ensureDigitalSubCarriersGroupIsMutable();
+                    digitalSubCarriersGroup_.add(index, builderForValue.build());
+                    onChanged();
+                } else {
+                    digitalSubCarriersGroupBuilder_.addMessage(index, builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public Builder addAllDigitalSubCarriersGroup(java.lang.Iterable values) {
+                if (digitalSubCarriersGroupBuilder_ == null) {
+                    ensureDigitalSubCarriersGroupIsMutable();
+                    com.google.protobuf.AbstractMessageLite.Builder.addAll(values, digitalSubCarriersGroup_);
+                    onChanged();
+                } else {
+                    digitalSubCarriersGroupBuilder_.addAllMessages(values);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public Builder clearDigitalSubCarriersGroup() {
+                if (digitalSubCarriersGroupBuilder_ == null) {
+                    digitalSubCarriersGroup_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000010);
+                    onChanged();
+                } else {
+                    digitalSubCarriersGroupBuilder_.clear();
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public Builder removeDigitalSubCarriersGroup(int index) {
+                if (digitalSubCarriersGroupBuilder_ == null) {
+                    ensureDigitalSubCarriersGroupIsMutable();
+                    digitalSubCarriersGroup_.remove(index);
+                    onChanged();
+                } else {
+                    digitalSubCarriersGroupBuilder_.remove(index);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public ipowdm.Ipowdm.DigitalSubCarriersGroup.Builder getDigitalSubCarriersGroupBuilder(int index) {
+                return getDigitalSubCarriersGroupFieldBuilder().getBuilder(index);
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public ipowdm.Ipowdm.DigitalSubCarriersGroupOrBuilder getDigitalSubCarriersGroupOrBuilder(int index) {
+                if (digitalSubCarriersGroupBuilder_ == null) {
+                    return digitalSubCarriersGroup_.get(index);
+                } else {
+                    return digitalSubCarriersGroupBuilder_.getMessageOrBuilder(index);
+                }
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public java.util.List getDigitalSubCarriersGroupOrBuilderList() {
+                if (digitalSubCarriersGroupBuilder_ != null) {
+                    return digitalSubCarriersGroupBuilder_.getMessageOrBuilderList();
+                } else {
+                    return java.util.Collections.unmodifiableList(digitalSubCarriersGroup_);
+                }
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public ipowdm.Ipowdm.DigitalSubCarriersGroup.Builder addDigitalSubCarriersGroupBuilder() {
+                return getDigitalSubCarriersGroupFieldBuilder().addBuilder(ipowdm.Ipowdm.DigitalSubCarriersGroup.getDefaultInstance());
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public ipowdm.Ipowdm.DigitalSubCarriersGroup.Builder addDigitalSubCarriersGroupBuilder(int index) {
+                return getDigitalSubCarriersGroupFieldBuilder().addBuilder(index, ipowdm.Ipowdm.DigitalSubCarriersGroup.getDefaultInstance());
+            }
+
+            /**
+             * repeated .ipowdm.DigitalSubCarriersGroup digital_sub_carriers_group = 5;
+             */
+            public java.util.List getDigitalSubCarriersGroupBuilderList() {
+                return getDigitalSubCarriersGroupFieldBuilder().getBuilderList();
+            }
+
+            private com.google.protobuf.RepeatedFieldBuilderV3 getDigitalSubCarriersGroupFieldBuilder() {
+                if (digitalSubCarriersGroupBuilder_ == null) {
+                    digitalSubCarriersGroupBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(digitalSubCarriersGroup_, ((bitField0_ & 0x00000010) != 0), getParentForChildren(), isClean());
+                    digitalSubCarriersGroup_ = null;
+                }
+                return digitalSubCarriersGroupBuilder_;
+            }
+
+            private java.lang.Object operation_ = "";
+
+            /**
+             * string operation = 6;
+             * @return The operation.
+             */
+            public java.lang.String getOperation() {
+                java.lang.Object ref = operation_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    operation_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string operation = 6;
+             * @return The bytes for operation.
+             */
+            public com.google.protobuf.ByteString getOperationBytes() {
+                java.lang.Object ref = operation_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    operation_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string operation = 6;
+             * @param value The operation to set.
+             * @return This builder for chaining.
+             */
+            public Builder setOperation(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                operation_ = value;
+                bitField0_ |= 0x00000020;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string operation = 6;
+             * @return This builder for chaining.
+             */
+            public Builder clearOperation() {
+                operation_ = getDefaultInstance().getOperation();
+                bitField0_ = (bitField0_ & ~0x00000020);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string operation = 6;
+             * @param value The bytes for operation to set.
+             * @return This builder for chaining.
+             */
+            public Builder setOperationBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                operation_ = value;
+                bitField0_ |= 0x00000020;
+                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:ipowdm.Component)
+        }
+
+        // @@protoc_insertion_point(class_scope:ipowdm.Component)
+        private static final ipowdm.Ipowdm.Component DEFAULT_INSTANCE;
+
+        static {
+            DEFAULT_INSTANCE = new ipowdm.Ipowdm.Component();
+        }
+
+        public static ipowdm.Ipowdm.Component getDefaultInstance() {
+            return DEFAULT_INSTANCE;
+        }
+
+        private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+
+            @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();
+            }
+        };
+
+        public static com.google.protobuf.Parser parser() {
+            return PARSER;
+        }
+
+        @java.lang.Override
+        public com.google.protobuf.Parser getParserForType() {
+            return PARSER;
+        }
+
+        @java.lang.Override
+        public ipowdm.Ipowdm.Component getDefaultInstanceForType() {
+            return DEFAULT_INSTANCE;
+        }
+    }
+
+    public interface TransceiverOrBuilder extends // @@protoc_insertion_point(interface_extends:ipowdm.Transceiver)
+    com.google.protobuf.MessageOrBuilder {
+
+        /**
+         * repeated .ipowdm.Component components = 1;
+         */
+        java.util.List getComponentsList();
+
+        /**
+         * repeated .ipowdm.Component components = 1;
+         */
+        ipowdm.Ipowdm.Component getComponents(int index);
+
+        /**
+         * repeated .ipowdm.Component components = 1;
+         */
+        int getComponentsCount();
+
+        /**
+         * repeated .ipowdm.Component components = 1;
+         */
+        java.util.List getComponentsOrBuilderList();
+
+        /**
+         * repeated .ipowdm.Component components = 1;
+         */
+        ipowdm.Ipowdm.ComponentOrBuilder getComponentsOrBuilder(int index);
+    }
+
+    /**
+     * Protobuf type {@code ipowdm.Transceiver}
+     */
+    public static final class Transceiver extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:ipowdm.Transceiver)
+    TransceiverOrBuilder {
+
+        private static final long serialVersionUID = 0L;
+
+        // Use Transceiver.newBuilder() to construct.
+        private Transceiver(com.google.protobuf.GeneratedMessageV3.Builder builder) {
+            super(builder);
+        }
+
+        private Transceiver() {
+            components_ = java.util.Collections.emptyList();
+        }
+
+        @java.lang.Override
+        @SuppressWarnings({ "unused" })
+        protected java.lang.Object newInstance(UnusedPrivateParameter unused) {
+            return new Transceiver();
+        }
+
+        public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+            return ipowdm.Ipowdm.internal_static_ipowdm_Transceiver_descriptor;
+        }
+
+        @java.lang.Override
+        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+            return ipowdm.Ipowdm.internal_static_ipowdm_Transceiver_fieldAccessorTable.ensureFieldAccessorsInitialized(ipowdm.Ipowdm.Transceiver.class, ipowdm.Ipowdm.Transceiver.Builder.class);
+        }
+
+        public static final int COMPONENTS_FIELD_NUMBER = 1;
+
+        @SuppressWarnings("serial")
+        private java.util.List components_;
+
+        /**
+         * repeated .ipowdm.Component components = 1;
+         */
+        @java.lang.Override
+        public java.util.List getComponentsList() {
+            return components_;
+        }
+
+        /**
+         * repeated .ipowdm.Component components = 1;
+         */
+        @java.lang.Override
+        public java.util.List getComponentsOrBuilderList() {
+            return components_;
+        }
+
+        /**
+         * repeated .ipowdm.Component components = 1;
+         */
+        @java.lang.Override
+        public int getComponentsCount() {
+            return components_.size();
+        }
+
+        /**
+         * repeated .ipowdm.Component components = 1;
+         */
+        @java.lang.Override
+        public ipowdm.Ipowdm.Component getComponents(int index) {
+            return components_.get(index);
+        }
+
+        /**
+         * repeated .ipowdm.Component components = 1;
+         */
+        @java.lang.Override
+        public ipowdm.Ipowdm.ComponentOrBuilder getComponentsOrBuilder(int index) {
+            return components_.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 < components_.size(); i++) {
+                output.writeMessage(1, components_.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 < components_.size(); i++) {
+                size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, components_.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 ipowdm.Ipowdm.Transceiver)) {
+                return super.equals(obj);
+            }
+            ipowdm.Ipowdm.Transceiver other = (ipowdm.Ipowdm.Transceiver) obj;
+            if (!getComponentsList().equals(other.getComponentsList()))
+                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 (getComponentsCount() > 0) {
+                hash = (37 * hash) + COMPONENTS_FIELD_NUMBER;
+                hash = (53 * hash) + getComponentsList().hashCode();
+            }
+            hash = (29 * hash) + getUnknownFields().hashCode();
+            memoizedHashCode = hash;
+            return hash;
+        }
+
+        public static ipowdm.Ipowdm.Transceiver parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.Transceiver parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.Transceiver parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.Transceiver parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.Transceiver parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.Transceiver parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.Transceiver parseFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.Transceiver 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 ipowdm.Ipowdm.Transceiver parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.Transceiver 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 ipowdm.Ipowdm.Transceiver parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.Transceiver 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(ipowdm.Ipowdm.Transceiver 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 ipowdm.Transceiver}
+         */
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:ipowdm.Transceiver)
+        ipowdm.Ipowdm.TransceiverOrBuilder {
+
+            public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_Transceiver_descriptor;
+            }
+
+            @java.lang.Override
+            protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_Transceiver_fieldAccessorTable.ensureFieldAccessorsInitialized(ipowdm.Ipowdm.Transceiver.class, ipowdm.Ipowdm.Transceiver.Builder.class);
+            }
+
+            // Construct using ipowdm.Ipowdm.Transceiver.newBuilder()
+            private Builder() {
+            }
+
+            private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+                super(parent);
+            }
+
+            @java.lang.Override
+            public Builder clear() {
+                super.clear();
+                bitField0_ = 0;
+                if (componentsBuilder_ == null) {
+                    components_ = java.util.Collections.emptyList();
+                } else {
+                    components_ = null;
+                    componentsBuilder_.clear();
+                }
+                bitField0_ = (bitField0_ & ~0x00000001);
+                return this;
+            }
+
+            @java.lang.Override
+            public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_Transceiver_descriptor;
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.Transceiver getDefaultInstanceForType() {
+                return ipowdm.Ipowdm.Transceiver.getDefaultInstance();
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.Transceiver build() {
+                ipowdm.Ipowdm.Transceiver result = buildPartial();
+                if (!result.isInitialized()) {
+                    throw newUninitializedMessageException(result);
+                }
+                return result;
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.Transceiver buildPartial() {
+                ipowdm.Ipowdm.Transceiver result = new ipowdm.Ipowdm.Transceiver(this);
+                buildPartialRepeatedFields(result);
+                if (bitField0_ != 0) {
+                    buildPartial0(result);
+                }
+                onBuilt();
+                return result;
+            }
+
+            private void buildPartialRepeatedFields(ipowdm.Ipowdm.Transceiver result) {
+                if (componentsBuilder_ == null) {
+                    if (((bitField0_ & 0x00000001) != 0)) {
+                        components_ = java.util.Collections.unmodifiableList(components_);
+                        bitField0_ = (bitField0_ & ~0x00000001);
+                    }
+                    result.components_ = components_;
+                } else {
+                    result.components_ = componentsBuilder_.build();
+                }
+            }
+
+            private void buildPartial0(ipowdm.Ipowdm.Transceiver result) {
+                int from_bitField0_ = bitField0_;
+            }
+
+            @java.lang.Override
+            public Builder mergeFrom(com.google.protobuf.Message other) {
+                if (other instanceof ipowdm.Ipowdm.Transceiver) {
+                    return mergeFrom((ipowdm.Ipowdm.Transceiver) other);
+                } else {
+                    super.mergeFrom(other);
+                    return this;
+                }
+            }
+
+            public Builder mergeFrom(ipowdm.Ipowdm.Transceiver other) {
+                if (other == ipowdm.Ipowdm.Transceiver.getDefaultInstance())
+                    return this;
+                if (componentsBuilder_ == null) {
+                    if (!other.components_.isEmpty()) {
+                        if (components_.isEmpty()) {
+                            components_ = other.components_;
+                            bitField0_ = (bitField0_ & ~0x00000001);
+                        } else {
+                            ensureComponentsIsMutable();
+                            components_.addAll(other.components_);
+                        }
+                        onChanged();
+                    }
+                } else {
+                    if (!other.components_.isEmpty()) {
+                        if (componentsBuilder_.isEmpty()) {
+                            componentsBuilder_.dispose();
+                            componentsBuilder_ = null;
+                            components_ = other.components_;
+                            bitField0_ = (bitField0_ & ~0x00000001);
+                            componentsBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getComponentsFieldBuilder() : null;
+                        } else {
+                            componentsBuilder_.addAllMessages(other.components_);
+                        }
+                    }
+                }
+                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:
+                                {
+                                    ipowdm.Ipowdm.Component m = input.readMessage(ipowdm.Ipowdm.Component.parser(), extensionRegistry);
+                                    if (componentsBuilder_ == null) {
+                                        ensureComponentsIsMutable();
+                                        components_.add(m);
+                                    } else {
+                                        componentsBuilder_.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 components_ = java.util.Collections.emptyList();
+
+            private void ensureComponentsIsMutable() {
+                if (!((bitField0_ & 0x00000001) != 0)) {
+                    components_ = new java.util.ArrayList(components_);
+                    bitField0_ |= 0x00000001;
+                }
+            }
+
+            private com.google.protobuf.RepeatedFieldBuilderV3 componentsBuilder_;
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public java.util.List getComponentsList() {
+                if (componentsBuilder_ == null) {
+                    return java.util.Collections.unmodifiableList(components_);
+                } else {
+                    return componentsBuilder_.getMessageList();
+                }
+            }
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public int getComponentsCount() {
+                if (componentsBuilder_ == null) {
+                    return components_.size();
+                } else {
+                    return componentsBuilder_.getCount();
+                }
+            }
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public ipowdm.Ipowdm.Component getComponents(int index) {
+                if (componentsBuilder_ == null) {
+                    return components_.get(index);
+                } else {
+                    return componentsBuilder_.getMessage(index);
+                }
+            }
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public Builder setComponents(int index, ipowdm.Ipowdm.Component value) {
+                if (componentsBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureComponentsIsMutable();
+                    components_.set(index, value);
+                    onChanged();
+                } else {
+                    componentsBuilder_.setMessage(index, value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public Builder setComponents(int index, ipowdm.Ipowdm.Component.Builder builderForValue) {
+                if (componentsBuilder_ == null) {
+                    ensureComponentsIsMutable();
+                    components_.set(index, builderForValue.build());
+                    onChanged();
+                } else {
+                    componentsBuilder_.setMessage(index, builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public Builder addComponents(ipowdm.Ipowdm.Component value) {
+                if (componentsBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureComponentsIsMutable();
+                    components_.add(value);
+                    onChanged();
+                } else {
+                    componentsBuilder_.addMessage(value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public Builder addComponents(int index, ipowdm.Ipowdm.Component value) {
+                if (componentsBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureComponentsIsMutable();
+                    components_.add(index, value);
+                    onChanged();
+                } else {
+                    componentsBuilder_.addMessage(index, value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public Builder addComponents(ipowdm.Ipowdm.Component.Builder builderForValue) {
+                if (componentsBuilder_ == null) {
+                    ensureComponentsIsMutable();
+                    components_.add(builderForValue.build());
+                    onChanged();
+                } else {
+                    componentsBuilder_.addMessage(builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public Builder addComponents(int index, ipowdm.Ipowdm.Component.Builder builderForValue) {
+                if (componentsBuilder_ == null) {
+                    ensureComponentsIsMutable();
+                    components_.add(index, builderForValue.build());
+                    onChanged();
+                } else {
+                    componentsBuilder_.addMessage(index, builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public Builder addAllComponents(java.lang.Iterable values) {
+                if (componentsBuilder_ == null) {
+                    ensureComponentsIsMutable();
+                    com.google.protobuf.AbstractMessageLite.Builder.addAll(values, components_);
+                    onChanged();
+                } else {
+                    componentsBuilder_.addAllMessages(values);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public Builder clearComponents() {
+                if (componentsBuilder_ == null) {
+                    components_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
+                    onChanged();
+                } else {
+                    componentsBuilder_.clear();
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public Builder removeComponents(int index) {
+                if (componentsBuilder_ == null) {
+                    ensureComponentsIsMutable();
+                    components_.remove(index);
+                    onChanged();
+                } else {
+                    componentsBuilder_.remove(index);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public ipowdm.Ipowdm.Component.Builder getComponentsBuilder(int index) {
+                return getComponentsFieldBuilder().getBuilder(index);
+            }
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public ipowdm.Ipowdm.ComponentOrBuilder getComponentsOrBuilder(int index) {
+                if (componentsBuilder_ == null) {
+                    return components_.get(index);
+                } else {
+                    return componentsBuilder_.getMessageOrBuilder(index);
+                }
+            }
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public java.util.List getComponentsOrBuilderList() {
+                if (componentsBuilder_ != null) {
+                    return componentsBuilder_.getMessageOrBuilderList();
+                } else {
+                    return java.util.Collections.unmodifiableList(components_);
+                }
+            }
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public ipowdm.Ipowdm.Component.Builder addComponentsBuilder() {
+                return getComponentsFieldBuilder().addBuilder(ipowdm.Ipowdm.Component.getDefaultInstance());
+            }
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public ipowdm.Ipowdm.Component.Builder addComponentsBuilder(int index) {
+                return getComponentsFieldBuilder().addBuilder(index, ipowdm.Ipowdm.Component.getDefaultInstance());
+            }
+
+            /**
+             * repeated .ipowdm.Component components = 1;
+             */
+            public java.util.List getComponentsBuilderList() {
+                return getComponentsFieldBuilder().getBuilderList();
+            }
+
+            private com.google.protobuf.RepeatedFieldBuilderV3 getComponentsFieldBuilder() {
+                if (componentsBuilder_ == null) {
+                    componentsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(components_, ((bitField0_ & 0x00000001) != 0), getParentForChildren(), isClean());
+                    components_ = null;
+                }
+                return componentsBuilder_;
+            }
+
+            @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:ipowdm.Transceiver)
+        }
+
+        // @@protoc_insertion_point(class_scope:ipowdm.Transceiver)
+        private static final ipowdm.Ipowdm.Transceiver DEFAULT_INSTANCE;
+
+        static {
+            DEFAULT_INSTANCE = new ipowdm.Ipowdm.Transceiver();
+        }
+
+        public static ipowdm.Ipowdm.Transceiver getDefaultInstance() {
+            return DEFAULT_INSTANCE;
+        }
+
+        private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+
+            @java.lang.Override
+            public Transceiver parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+                Builder builder = newBuilder();
+                try {
+                    builder.mergeFrom(input, extensionRegistry);
+                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    throw e.setUnfinishedMessage(builder.buildPartial());
+                } catch (com.google.protobuf.UninitializedMessageException e) {
+                    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 ipowdm.Ipowdm.Transceiver getDefaultInstanceForType() {
+            return DEFAULT_INSTANCE;
+        }
+    }
+
+    public interface IpowdmRuleSetOrBuilder extends // @@protoc_insertion_point(interface_extends:ipowdm.IpowdmRuleSet)
+    com.google.protobuf.MessageOrBuilder {
+
+        /**
+         * repeated .ipowdm.RuleEndpoint src = 1;
+         */
+        java.util.List getSrcList();
+
+        /**
+         * repeated .ipowdm.RuleEndpoint src = 1;
+         */
+        ipowdm.Ipowdm.RuleEndpoint getSrc(int index);
+
+        /**
+         * repeated .ipowdm.RuleEndpoint src = 1;
+         */
+        int getSrcCount();
+
+        /**
+         * repeated .ipowdm.RuleEndpoint src = 1;
+         */
+        java.util.List getSrcOrBuilderList();
+
+        /**
+         * repeated .ipowdm.RuleEndpoint src = 1;
+         */
+        ipowdm.Ipowdm.RuleEndpointOrBuilder getSrcOrBuilder(int index);
+
+        /**
+         * repeated .ipowdm.RuleEndpoint dst = 2;
+         */
+        java.util.List getDstList();
+
+        /**
+         * repeated .ipowdm.RuleEndpoint dst = 2;
+         */
+        ipowdm.Ipowdm.RuleEndpoint getDst(int index);
+
+        /**
+         * repeated .ipowdm.RuleEndpoint dst = 2;
+         */
+        int getDstCount();
+
+        /**
+         * repeated .ipowdm.RuleEndpoint dst = 2;
+         */
+        java.util.List getDstOrBuilderList();
+
+        /**
+         * repeated .ipowdm.RuleEndpoint dst = 2;
+         */
+        ipowdm.Ipowdm.RuleEndpointOrBuilder getDstOrBuilder(int index);
+
+        /**
+         * int32 bw = 3;
+         * @return The bw.
+         */
+        int getBw();
+
+        /**
+         * string uuid = 4;
+         * @return The uuid.
+         */
+        java.lang.String getUuid();
+
+        /**
+         * string uuid = 4;
+         * @return The bytes for uuid.
+         */
+        com.google.protobuf.ByteString getUuidBytes();
+
+        /**
+         * .ipowdm.Transceiver transceiver = 5;
+         * @return Whether the transceiver field is set.
+         */
+        boolean hasTransceiver();
+
+        /**
+         * .ipowdm.Transceiver transceiver = 5;
+         * @return The transceiver.
+         */
+        ipowdm.Ipowdm.Transceiver getTransceiver();
+
+        /**
+         * .ipowdm.Transceiver transceiver = 5;
+         */
+        ipowdm.Ipowdm.TransceiverOrBuilder getTransceiverOrBuilder();
+    }
+
+    /**
+     * Protobuf type {@code ipowdm.IpowdmRuleSet}
+     */
+    public static final class IpowdmRuleSet extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:ipowdm.IpowdmRuleSet)
+    IpowdmRuleSetOrBuilder {
+
+        private static final long serialVersionUID = 0L;
+
+        // Use IpowdmRuleSet.newBuilder() to construct.
+        private IpowdmRuleSet(com.google.protobuf.GeneratedMessageV3.Builder builder) {
+            super(builder);
+        }
+
+        private IpowdmRuleSet() {
+            src_ = java.util.Collections.emptyList();
+            dst_ = java.util.Collections.emptyList();
+            uuid_ = "";
+        }
+
+        @java.lang.Override
+        @SuppressWarnings({ "unused" })
+        protected java.lang.Object newInstance(UnusedPrivateParameter unused) {
+            return new IpowdmRuleSet();
+        }
+
+        public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+            return ipowdm.Ipowdm.internal_static_ipowdm_IpowdmRuleSet_descriptor;
+        }
+
+        @java.lang.Override
+        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+            return ipowdm.Ipowdm.internal_static_ipowdm_IpowdmRuleSet_fieldAccessorTable.ensureFieldAccessorsInitialized(ipowdm.Ipowdm.IpowdmRuleSet.class, ipowdm.Ipowdm.IpowdmRuleSet.Builder.class);
+        }
+
+        public static final int SRC_FIELD_NUMBER = 1;
+
+        @SuppressWarnings("serial")
+        private java.util.List src_;
+
+        /**
+         * repeated .ipowdm.RuleEndpoint src = 1;
+         */
+        @java.lang.Override
+        public java.util.List getSrcList() {
+            return src_;
+        }
+
+        /**
+         * repeated .ipowdm.RuleEndpoint src = 1;
+         */
+        @java.lang.Override
+        public java.util.List getSrcOrBuilderList() {
+            return src_;
+        }
+
+        /**
+         * repeated .ipowdm.RuleEndpoint src = 1;
+         */
+        @java.lang.Override
+        public int getSrcCount() {
+            return src_.size();
+        }
+
+        /**
+         * repeated .ipowdm.RuleEndpoint src = 1;
+         */
+        @java.lang.Override
+        public ipowdm.Ipowdm.RuleEndpoint getSrc(int index) {
+            return src_.get(index);
+        }
+
+        /**
+         * repeated .ipowdm.RuleEndpoint src = 1;
+         */
+        @java.lang.Override
+        public ipowdm.Ipowdm.RuleEndpointOrBuilder getSrcOrBuilder(int index) {
+            return src_.get(index);
+        }
+
+        public static final int DST_FIELD_NUMBER = 2;
+
+        @SuppressWarnings("serial")
+        private java.util.List dst_;
+
+        /**
+         * repeated .ipowdm.RuleEndpoint dst = 2;
+         */
+        @java.lang.Override
+        public java.util.List getDstList() {
+            return dst_;
+        }
+
+        /**
+         * repeated .ipowdm.RuleEndpoint dst = 2;
+         */
+        @java.lang.Override
+        public java.util.List getDstOrBuilderList() {
+            return dst_;
+        }
+
+        /**
+         * repeated .ipowdm.RuleEndpoint dst = 2;
+         */
+        @java.lang.Override
+        public int getDstCount() {
+            return dst_.size();
+        }
+
+        /**
+         * repeated .ipowdm.RuleEndpoint dst = 2;
+         */
+        @java.lang.Override
+        public ipowdm.Ipowdm.RuleEndpoint getDst(int index) {
+            return dst_.get(index);
+        }
+
+        /**
+         * repeated .ipowdm.RuleEndpoint dst = 2;
+         */
+        @java.lang.Override
+        public ipowdm.Ipowdm.RuleEndpointOrBuilder getDstOrBuilder(int index) {
+            return dst_.get(index);
+        }
+
+        public static final int BW_FIELD_NUMBER = 3;
+
+        private int bw_ = 0;
+
+        /**
+         * int32 bw = 3;
+         * @return The bw.
+         */
+        @java.lang.Override
+        public int getBw() {
+            return bw_;
+        }
+
+        public static final int UUID_FIELD_NUMBER = 4;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object uuid_ = "";
+
+        /**
+         * string uuid = 4;
+         * @return The uuid.
+         */
+        @java.lang.Override
+        public java.lang.String getUuid() {
+            java.lang.Object ref = uuid_;
+            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();
+                uuid_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string uuid = 4;
+         * @return The bytes for uuid.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getUuidBytes() {
+            java.lang.Object ref = uuid_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                uuid_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int TRANSCEIVER_FIELD_NUMBER = 5;
+
+        private ipowdm.Ipowdm.Transceiver transceiver_;
+
+        /**
+         * .ipowdm.Transceiver transceiver = 5;
+         * @return Whether the transceiver field is set.
+         */
+        @java.lang.Override
+        public boolean hasTransceiver() {
+            return transceiver_ != null;
+        }
+
+        /**
+         * .ipowdm.Transceiver transceiver = 5;
+         * @return The transceiver.
+         */
+        @java.lang.Override
+        public ipowdm.Ipowdm.Transceiver getTransceiver() {
+            return transceiver_ == null ? ipowdm.Ipowdm.Transceiver.getDefaultInstance() : transceiver_;
+        }
+
+        /**
+         * .ipowdm.Transceiver transceiver = 5;
+         */
+        @java.lang.Override
+        public ipowdm.Ipowdm.TransceiverOrBuilder getTransceiverOrBuilder() {
+            return transceiver_ == null ? ipowdm.Ipowdm.Transceiver.getDefaultInstance() : transceiver_;
+        }
+
+        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 < src_.size(); i++) {
+                output.writeMessage(1, src_.get(i));
+            }
+            for (int i = 0; i < dst_.size(); i++) {
+                output.writeMessage(2, dst_.get(i));
+            }
+            if (bw_ != 0) {
+                output.writeInt32(3, bw_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(uuid_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 4, uuid_);
+            }
+            if (transceiver_ != null) {
+                output.writeMessage(5, getTransceiver());
+            }
+            getUnknownFields().writeTo(output);
+        }
+
+        @java.lang.Override
+        public int getSerializedSize() {
+            int size = memoizedSize;
+            if (size != -1)
+                return size;
+            size = 0;
+            for (int i = 0; i < src_.size(); i++) {
+                size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, src_.get(i));
+            }
+            for (int i = 0; i < dst_.size(); i++) {
+                size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, dst_.get(i));
+            }
+            if (bw_ != 0) {
+                size += com.google.protobuf.CodedOutputStream.computeInt32Size(3, bw_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(uuid_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, uuid_);
+            }
+            if (transceiver_ != null) {
+                size += com.google.protobuf.CodedOutputStream.computeMessageSize(5, getTransceiver());
+            }
+            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 ipowdm.Ipowdm.IpowdmRuleSet)) {
+                return super.equals(obj);
+            }
+            ipowdm.Ipowdm.IpowdmRuleSet other = (ipowdm.Ipowdm.IpowdmRuleSet) obj;
+            if (!getSrcList().equals(other.getSrcList()))
+                return false;
+            if (!getDstList().equals(other.getDstList()))
+                return false;
+            if (getBw() != other.getBw())
+                return false;
+            if (!getUuid().equals(other.getUuid()))
+                return false;
+            if (hasTransceiver() != other.hasTransceiver())
+                return false;
+            if (hasTransceiver()) {
+                if (!getTransceiver().equals(other.getTransceiver()))
+                    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 (getSrcCount() > 0) {
+                hash = (37 * hash) + SRC_FIELD_NUMBER;
+                hash = (53 * hash) + getSrcList().hashCode();
+            }
+            if (getDstCount() > 0) {
+                hash = (37 * hash) + DST_FIELD_NUMBER;
+                hash = (53 * hash) + getDstList().hashCode();
+            }
+            hash = (37 * hash) + BW_FIELD_NUMBER;
+            hash = (53 * hash) + getBw();
+            hash = (37 * hash) + UUID_FIELD_NUMBER;
+            hash = (53 * hash) + getUuid().hashCode();
+            if (hasTransceiver()) {
+                hash = (37 * hash) + TRANSCEIVER_FIELD_NUMBER;
+                hash = (53 * hash) + getTransceiver().hashCode();
+            }
+            hash = (29 * hash) + getUnknownFields().hashCode();
+            memoizedHashCode = hash;
+            return hash;
+        }
+
+        public static ipowdm.Ipowdm.IpowdmRuleSet parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.IpowdmRuleSet parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.IpowdmRuleSet parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.IpowdmRuleSet parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.IpowdmRuleSet parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static ipowdm.Ipowdm.IpowdmRuleSet parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static ipowdm.Ipowdm.IpowdmRuleSet parseFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.IpowdmRuleSet 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 ipowdm.Ipowdm.IpowdmRuleSet parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.IpowdmRuleSet 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 ipowdm.Ipowdm.IpowdmRuleSet parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static ipowdm.Ipowdm.IpowdmRuleSet 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(ipowdm.Ipowdm.IpowdmRuleSet 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 ipowdm.IpowdmRuleSet}
+         */
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:ipowdm.IpowdmRuleSet)
+        ipowdm.Ipowdm.IpowdmRuleSetOrBuilder {
+
+            public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_IpowdmRuleSet_descriptor;
+            }
+
+            @java.lang.Override
+            protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_IpowdmRuleSet_fieldAccessorTable.ensureFieldAccessorsInitialized(ipowdm.Ipowdm.IpowdmRuleSet.class, ipowdm.Ipowdm.IpowdmRuleSet.Builder.class);
+            }
+
+            // Construct using ipowdm.Ipowdm.IpowdmRuleSet.newBuilder()
+            private Builder() {
+            }
+
+            private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+                super(parent);
+            }
+
+            @java.lang.Override
+            public Builder clear() {
+                super.clear();
+                bitField0_ = 0;
+                if (srcBuilder_ == null) {
+                    src_ = java.util.Collections.emptyList();
+                } else {
+                    src_ = null;
+                    srcBuilder_.clear();
+                }
+                bitField0_ = (bitField0_ & ~0x00000001);
+                if (dstBuilder_ == null) {
+                    dst_ = java.util.Collections.emptyList();
+                } else {
+                    dst_ = null;
+                    dstBuilder_.clear();
+                }
+                bitField0_ = (bitField0_ & ~0x00000002);
+                bw_ = 0;
+                uuid_ = "";
+                transceiver_ = null;
+                if (transceiverBuilder_ != null) {
+                    transceiverBuilder_.dispose();
+                    transceiverBuilder_ = null;
+                }
+                return this;
+            }
+
+            @java.lang.Override
+            public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+                return ipowdm.Ipowdm.internal_static_ipowdm_IpowdmRuleSet_descriptor;
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.IpowdmRuleSet getDefaultInstanceForType() {
+                return ipowdm.Ipowdm.IpowdmRuleSet.getDefaultInstance();
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.IpowdmRuleSet build() {
+                ipowdm.Ipowdm.IpowdmRuleSet result = buildPartial();
+                if (!result.isInitialized()) {
+                    throw newUninitializedMessageException(result);
+                }
+                return result;
+            }
+
+            @java.lang.Override
+            public ipowdm.Ipowdm.IpowdmRuleSet buildPartial() {
+                ipowdm.Ipowdm.IpowdmRuleSet result = new ipowdm.Ipowdm.IpowdmRuleSet(this);
+                buildPartialRepeatedFields(result);
+                if (bitField0_ != 0) {
+                    buildPartial0(result);
+                }
+                onBuilt();
+                return result;
+            }
+
+            private void buildPartialRepeatedFields(ipowdm.Ipowdm.IpowdmRuleSet result) {
+                if (srcBuilder_ == null) {
+                    if (((bitField0_ & 0x00000001) != 0)) {
+                        src_ = java.util.Collections.unmodifiableList(src_);
+                        bitField0_ = (bitField0_ & ~0x00000001);
+                    }
+                    result.src_ = src_;
+                } else {
+                    result.src_ = srcBuilder_.build();
+                }
+                if (dstBuilder_ == null) {
+                    if (((bitField0_ & 0x00000002) != 0)) {
+                        dst_ = java.util.Collections.unmodifiableList(dst_);
+                        bitField0_ = (bitField0_ & ~0x00000002);
+                    }
+                    result.dst_ = dst_;
+                } else {
+                    result.dst_ = dstBuilder_.build();
+                }
+            }
+
+            private void buildPartial0(ipowdm.Ipowdm.IpowdmRuleSet result) {
+                int from_bitField0_ = bitField0_;
+                if (((from_bitField0_ & 0x00000004) != 0)) {
+                    result.bw_ = bw_;
+                }
+                if (((from_bitField0_ & 0x00000008) != 0)) {
+                    result.uuid_ = uuid_;
+                }
+                if (((from_bitField0_ & 0x00000010) != 0)) {
+                    result.transceiver_ = transceiverBuilder_ == null ? transceiver_ : transceiverBuilder_.build();
+                }
+            }
+
+            @java.lang.Override
+            public Builder mergeFrom(com.google.protobuf.Message other) {
+                if (other instanceof ipowdm.Ipowdm.IpowdmRuleSet) {
+                    return mergeFrom((ipowdm.Ipowdm.IpowdmRuleSet) other);
+                } else {
+                    super.mergeFrom(other);
+                    return this;
+                }
+            }
+
+            public Builder mergeFrom(ipowdm.Ipowdm.IpowdmRuleSet other) {
+                if (other == ipowdm.Ipowdm.IpowdmRuleSet.getDefaultInstance())
+                    return this;
+                if (srcBuilder_ == null) {
+                    if (!other.src_.isEmpty()) {
+                        if (src_.isEmpty()) {
+                            src_ = other.src_;
+                            bitField0_ = (bitField0_ & ~0x00000001);
+                        } else {
+                            ensureSrcIsMutable();
+                            src_.addAll(other.src_);
+                        }
+                        onChanged();
+                    }
+                } else {
+                    if (!other.src_.isEmpty()) {
+                        if (srcBuilder_.isEmpty()) {
+                            srcBuilder_.dispose();
+                            srcBuilder_ = null;
+                            src_ = other.src_;
+                            bitField0_ = (bitField0_ & ~0x00000001);
+                            srcBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getSrcFieldBuilder() : null;
+                        } else {
+                            srcBuilder_.addAllMessages(other.src_);
+                        }
+                    }
+                }
+                if (dstBuilder_ == null) {
+                    if (!other.dst_.isEmpty()) {
+                        if (dst_.isEmpty()) {
+                            dst_ = other.dst_;
+                            bitField0_ = (bitField0_ & ~0x00000002);
+                        } else {
+                            ensureDstIsMutable();
+                            dst_.addAll(other.dst_);
+                        }
+                        onChanged();
+                    }
+                } else {
+                    if (!other.dst_.isEmpty()) {
+                        if (dstBuilder_.isEmpty()) {
+                            dstBuilder_.dispose();
+                            dstBuilder_ = null;
+                            dst_ = other.dst_;
+                            bitField0_ = (bitField0_ & ~0x00000002);
+                            dstBuilder_ = com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? getDstFieldBuilder() : null;
+                        } else {
+                            dstBuilder_.addAllMessages(other.dst_);
+                        }
+                    }
+                }
+                if (other.getBw() != 0) {
+                    setBw(other.getBw());
+                }
+                if (!other.getUuid().isEmpty()) {
+                    uuid_ = other.uuid_;
+                    bitField0_ |= 0x00000008;
+                    onChanged();
+                }
+                if (other.hasTransceiver()) {
+                    mergeTransceiver(other.getTransceiver());
+                }
+                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:
+                                {
+                                    ipowdm.Ipowdm.RuleEndpoint m = input.readMessage(ipowdm.Ipowdm.RuleEndpoint.parser(), extensionRegistry);
+                                    if (srcBuilder_ == null) {
+                                        ensureSrcIsMutable();
+                                        src_.add(m);
+                                    } else {
+                                        srcBuilder_.addMessage(m);
+                                    }
+                                    break;
+                                }
+                            // case 10
+                            case 18:
+                                {
+                                    ipowdm.Ipowdm.RuleEndpoint m = input.readMessage(ipowdm.Ipowdm.RuleEndpoint.parser(), extensionRegistry);
+                                    if (dstBuilder_ == null) {
+                                        ensureDstIsMutable();
+                                        dst_.add(m);
+                                    } else {
+                                        dstBuilder_.addMessage(m);
+                                    }
+                                    break;
+                                }
+                            // case 18
+                            case 24:
+                                {
+                                    bw_ = input.readInt32();
+                                    bitField0_ |= 0x00000004;
+                                    break;
+                                }
+                            // case 24
+                            case 34:
+                                {
+                                    uuid_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00000008;
+                                    break;
+                                }
+                            // case 34
+                            case 42:
+                                {
+                                    input.readMessage(getTransceiverFieldBuilder().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)
+                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    throw e.unwrapIOException();
+                } finally {
+                    onChanged();
+                }
+                // finally
+                return this;
+            }
+
+            private int bitField0_;
+
+            private java.util.List src_ = java.util.Collections.emptyList();
+
+            private void ensureSrcIsMutable() {
+                if (!((bitField0_ & 0x00000001) != 0)) {
+                    src_ = new java.util.ArrayList(src_);
+                    bitField0_ |= 0x00000001;
+                }
+            }
+
+            private com.google.protobuf.RepeatedFieldBuilderV3 srcBuilder_;
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public java.util.List getSrcList() {
+                if (srcBuilder_ == null) {
+                    return java.util.Collections.unmodifiableList(src_);
+                } else {
+                    return srcBuilder_.getMessageList();
+                }
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public int getSrcCount() {
+                if (srcBuilder_ == null) {
+                    return src_.size();
+                } else {
+                    return srcBuilder_.getCount();
+                }
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public ipowdm.Ipowdm.RuleEndpoint getSrc(int index) {
+                if (srcBuilder_ == null) {
+                    return src_.get(index);
+                } else {
+                    return srcBuilder_.getMessage(index);
+                }
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public Builder setSrc(int index, ipowdm.Ipowdm.RuleEndpoint value) {
+                if (srcBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureSrcIsMutable();
+                    src_.set(index, value);
+                    onChanged();
+                } else {
+                    srcBuilder_.setMessage(index, value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public Builder setSrc(int index, ipowdm.Ipowdm.RuleEndpoint.Builder builderForValue) {
+                if (srcBuilder_ == null) {
+                    ensureSrcIsMutable();
+                    src_.set(index, builderForValue.build());
+                    onChanged();
+                } else {
+                    srcBuilder_.setMessage(index, builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public Builder addSrc(ipowdm.Ipowdm.RuleEndpoint value) {
+                if (srcBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureSrcIsMutable();
+                    src_.add(value);
+                    onChanged();
+                } else {
+                    srcBuilder_.addMessage(value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public Builder addSrc(int index, ipowdm.Ipowdm.RuleEndpoint value) {
+                if (srcBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureSrcIsMutable();
+                    src_.add(index, value);
+                    onChanged();
+                } else {
+                    srcBuilder_.addMessage(index, value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public Builder addSrc(ipowdm.Ipowdm.RuleEndpoint.Builder builderForValue) {
+                if (srcBuilder_ == null) {
+                    ensureSrcIsMutable();
+                    src_.add(builderForValue.build());
+                    onChanged();
+                } else {
+                    srcBuilder_.addMessage(builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public Builder addSrc(int index, ipowdm.Ipowdm.RuleEndpoint.Builder builderForValue) {
+                if (srcBuilder_ == null) {
+                    ensureSrcIsMutable();
+                    src_.add(index, builderForValue.build());
+                    onChanged();
+                } else {
+                    srcBuilder_.addMessage(index, builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public Builder addAllSrc(java.lang.Iterable values) {
+                if (srcBuilder_ == null) {
+                    ensureSrcIsMutable();
+                    com.google.protobuf.AbstractMessageLite.Builder.addAll(values, src_);
+                    onChanged();
+                } else {
+                    srcBuilder_.addAllMessages(values);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public Builder clearSrc() {
+                if (srcBuilder_ == null) {
+                    src_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000001);
+                    onChanged();
+                } else {
+                    srcBuilder_.clear();
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public Builder removeSrc(int index) {
+                if (srcBuilder_ == null) {
+                    ensureSrcIsMutable();
+                    src_.remove(index);
+                    onChanged();
+                } else {
+                    srcBuilder_.remove(index);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public ipowdm.Ipowdm.RuleEndpoint.Builder getSrcBuilder(int index) {
+                return getSrcFieldBuilder().getBuilder(index);
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public ipowdm.Ipowdm.RuleEndpointOrBuilder getSrcOrBuilder(int index) {
+                if (srcBuilder_ == null) {
+                    return src_.get(index);
+                } else {
+                    return srcBuilder_.getMessageOrBuilder(index);
+                }
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public java.util.List getSrcOrBuilderList() {
+                if (srcBuilder_ != null) {
+                    return srcBuilder_.getMessageOrBuilderList();
+                } else {
+                    return java.util.Collections.unmodifiableList(src_);
+                }
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public ipowdm.Ipowdm.RuleEndpoint.Builder addSrcBuilder() {
+                return getSrcFieldBuilder().addBuilder(ipowdm.Ipowdm.RuleEndpoint.getDefaultInstance());
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public ipowdm.Ipowdm.RuleEndpoint.Builder addSrcBuilder(int index) {
+                return getSrcFieldBuilder().addBuilder(index, ipowdm.Ipowdm.RuleEndpoint.getDefaultInstance());
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint src = 1;
+             */
+            public java.util.List getSrcBuilderList() {
+                return getSrcFieldBuilder().getBuilderList();
+            }
+
+            private com.google.protobuf.RepeatedFieldBuilderV3 getSrcFieldBuilder() {
+                if (srcBuilder_ == null) {
+                    srcBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(src_, ((bitField0_ & 0x00000001) != 0), getParentForChildren(), isClean());
+                    src_ = null;
+                }
+                return srcBuilder_;
+            }
+
+            private java.util.List dst_ = java.util.Collections.emptyList();
+
+            private void ensureDstIsMutable() {
+                if (!((bitField0_ & 0x00000002) != 0)) {
+                    dst_ = new java.util.ArrayList(dst_);
+                    bitField0_ |= 0x00000002;
+                }
+            }
+
+            private com.google.protobuf.RepeatedFieldBuilderV3 dstBuilder_;
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public java.util.List getDstList() {
+                if (dstBuilder_ == null) {
+                    return java.util.Collections.unmodifiableList(dst_);
+                } else {
+                    return dstBuilder_.getMessageList();
+                }
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public int getDstCount() {
+                if (dstBuilder_ == null) {
+                    return dst_.size();
+                } else {
+                    return dstBuilder_.getCount();
+                }
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public ipowdm.Ipowdm.RuleEndpoint getDst(int index) {
+                if (dstBuilder_ == null) {
+                    return dst_.get(index);
+                } else {
+                    return dstBuilder_.getMessage(index);
+                }
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public Builder setDst(int index, ipowdm.Ipowdm.RuleEndpoint value) {
+                if (dstBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureDstIsMutable();
+                    dst_.set(index, value);
+                    onChanged();
+                } else {
+                    dstBuilder_.setMessage(index, value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public Builder setDst(int index, ipowdm.Ipowdm.RuleEndpoint.Builder builderForValue) {
+                if (dstBuilder_ == null) {
+                    ensureDstIsMutable();
+                    dst_.set(index, builderForValue.build());
+                    onChanged();
+                } else {
+                    dstBuilder_.setMessage(index, builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public Builder addDst(ipowdm.Ipowdm.RuleEndpoint value) {
+                if (dstBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureDstIsMutable();
+                    dst_.add(value);
+                    onChanged();
+                } else {
+                    dstBuilder_.addMessage(value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public Builder addDst(int index, ipowdm.Ipowdm.RuleEndpoint value) {
+                if (dstBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    ensureDstIsMutable();
+                    dst_.add(index, value);
+                    onChanged();
+                } else {
+                    dstBuilder_.addMessage(index, value);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public Builder addDst(ipowdm.Ipowdm.RuleEndpoint.Builder builderForValue) {
+                if (dstBuilder_ == null) {
+                    ensureDstIsMutable();
+                    dst_.add(builderForValue.build());
+                    onChanged();
+                } else {
+                    dstBuilder_.addMessage(builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public Builder addDst(int index, ipowdm.Ipowdm.RuleEndpoint.Builder builderForValue) {
+                if (dstBuilder_ == null) {
+                    ensureDstIsMutable();
+                    dst_.add(index, builderForValue.build());
+                    onChanged();
+                } else {
+                    dstBuilder_.addMessage(index, builderForValue.build());
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public Builder addAllDst(java.lang.Iterable values) {
+                if (dstBuilder_ == null) {
+                    ensureDstIsMutable();
+                    com.google.protobuf.AbstractMessageLite.Builder.addAll(values, dst_);
+                    onChanged();
+                } else {
+                    dstBuilder_.addAllMessages(values);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public Builder clearDst() {
+                if (dstBuilder_ == null) {
+                    dst_ = java.util.Collections.emptyList();
+                    bitField0_ = (bitField0_ & ~0x00000002);
+                    onChanged();
+                } else {
+                    dstBuilder_.clear();
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public Builder removeDst(int index) {
+                if (dstBuilder_ == null) {
+                    ensureDstIsMutable();
+                    dst_.remove(index);
+                    onChanged();
+                } else {
+                    dstBuilder_.remove(index);
+                }
+                return this;
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public ipowdm.Ipowdm.RuleEndpoint.Builder getDstBuilder(int index) {
+                return getDstFieldBuilder().getBuilder(index);
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public ipowdm.Ipowdm.RuleEndpointOrBuilder getDstOrBuilder(int index) {
+                if (dstBuilder_ == null) {
+                    return dst_.get(index);
+                } else {
+                    return dstBuilder_.getMessageOrBuilder(index);
+                }
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public java.util.List getDstOrBuilderList() {
+                if (dstBuilder_ != null) {
+                    return dstBuilder_.getMessageOrBuilderList();
+                } else {
+                    return java.util.Collections.unmodifiableList(dst_);
+                }
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public ipowdm.Ipowdm.RuleEndpoint.Builder addDstBuilder() {
+                return getDstFieldBuilder().addBuilder(ipowdm.Ipowdm.RuleEndpoint.getDefaultInstance());
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public ipowdm.Ipowdm.RuleEndpoint.Builder addDstBuilder(int index) {
+                return getDstFieldBuilder().addBuilder(index, ipowdm.Ipowdm.RuleEndpoint.getDefaultInstance());
+            }
+
+            /**
+             * repeated .ipowdm.RuleEndpoint dst = 2;
+             */
+            public java.util.List getDstBuilderList() {
+                return getDstFieldBuilder().getBuilderList();
+            }
+
+            private com.google.protobuf.RepeatedFieldBuilderV3 getDstFieldBuilder() {
+                if (dstBuilder_ == null) {
+                    dstBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3(dst_, ((bitField0_ & 0x00000002) != 0), getParentForChildren(), isClean());
+                    dst_ = null;
+                }
+                return dstBuilder_;
+            }
+
+            private int bw_;
+
+            /**
+             * int32 bw = 3;
+             * @return The bw.
+             */
+            @java.lang.Override
+            public int getBw() {
+                return bw_;
+            }
+
+            /**
+             * int32 bw = 3;
+             * @param value The bw to set.
+             * @return This builder for chaining.
+             */
+            public Builder setBw(int value) {
+                bw_ = value;
+                bitField0_ |= 0x00000004;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * int32 bw = 3;
+             * @return This builder for chaining.
+             */
+            public Builder clearBw() {
+                bitField0_ = (bitField0_ & ~0x00000004);
+                bw_ = 0;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object uuid_ = "";
+
+            /**
+             * string uuid = 4;
+             * @return The uuid.
+             */
+            public java.lang.String getUuid() {
+                java.lang.Object ref = uuid_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    uuid_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string uuid = 4;
+             * @return The bytes for uuid.
+             */
+            public com.google.protobuf.ByteString getUuidBytes() {
+                java.lang.Object ref = uuid_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    uuid_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string uuid = 4;
+             * @param value The uuid to set.
+             * @return This builder for chaining.
+             */
+            public Builder setUuid(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                uuid_ = value;
+                bitField0_ |= 0x00000008;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string uuid = 4;
+             * @return This builder for chaining.
+             */
+            public Builder clearUuid() {
+                uuid_ = getDefaultInstance().getUuid();
+                bitField0_ = (bitField0_ & ~0x00000008);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string uuid = 4;
+             * @param value The bytes for uuid to set.
+             * @return This builder for chaining.
+             */
+            public Builder setUuidBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                uuid_ = value;
+                bitField0_ |= 0x00000008;
+                onChanged();
+                return this;
+            }
+
+            private ipowdm.Ipowdm.Transceiver transceiver_;
+
+            private com.google.protobuf.SingleFieldBuilderV3 transceiverBuilder_;
+
+            /**
+             * .ipowdm.Transceiver transceiver = 5;
+             * @return Whether the transceiver field is set.
+             */
+            public boolean hasTransceiver() {
+                return ((bitField0_ & 0x00000010) != 0);
+            }
+
+            /**
+             * .ipowdm.Transceiver transceiver = 5;
+             * @return The transceiver.
+             */
+            public ipowdm.Ipowdm.Transceiver getTransceiver() {
+                if (transceiverBuilder_ == null) {
+                    return transceiver_ == null ? ipowdm.Ipowdm.Transceiver.getDefaultInstance() : transceiver_;
+                } else {
+                    return transceiverBuilder_.getMessage();
+                }
+            }
+
+            /**
+             * .ipowdm.Transceiver transceiver = 5;
+             */
+            public Builder setTransceiver(ipowdm.Ipowdm.Transceiver value) {
+                if (transceiverBuilder_ == null) {
+                    if (value == null) {
+                        throw new NullPointerException();
+                    }
+                    transceiver_ = value;
+                } else {
+                    transceiverBuilder_.setMessage(value);
+                }
+                bitField0_ |= 0x00000010;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .ipowdm.Transceiver transceiver = 5;
+             */
+            public Builder setTransceiver(ipowdm.Ipowdm.Transceiver.Builder builderForValue) {
+                if (transceiverBuilder_ == null) {
+                    transceiver_ = builderForValue.build();
+                } else {
+                    transceiverBuilder_.setMessage(builderForValue.build());
+                }
+                bitField0_ |= 0x00000010;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .ipowdm.Transceiver transceiver = 5;
+             */
+            public Builder mergeTransceiver(ipowdm.Ipowdm.Transceiver value) {
+                if (transceiverBuilder_ == null) {
+                    if (((bitField0_ & 0x00000010) != 0) && transceiver_ != null && transceiver_ != ipowdm.Ipowdm.Transceiver.getDefaultInstance()) {
+                        getTransceiverBuilder().mergeFrom(value);
+                    } else {
+                        transceiver_ = value;
+                    }
+                } else {
+                    transceiverBuilder_.mergeFrom(value);
+                }
+                bitField0_ |= 0x00000010;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .ipowdm.Transceiver transceiver = 5;
+             */
+            public Builder clearTransceiver() {
+                bitField0_ = (bitField0_ & ~0x00000010);
+                transceiver_ = null;
+                if (transceiverBuilder_ != null) {
+                    transceiverBuilder_.dispose();
+                    transceiverBuilder_ = null;
+                }
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .ipowdm.Transceiver transceiver = 5;
+             */
+            public ipowdm.Ipowdm.Transceiver.Builder getTransceiverBuilder() {
+                bitField0_ |= 0x00000010;
+                onChanged();
+                return getTransceiverFieldBuilder().getBuilder();
+            }
+
+            /**
+             * .ipowdm.Transceiver transceiver = 5;
+             */
+            public ipowdm.Ipowdm.TransceiverOrBuilder getTransceiverOrBuilder() {
+                if (transceiverBuilder_ != null) {
+                    return transceiverBuilder_.getMessageOrBuilder();
+                } else {
+                    return transceiver_ == null ? ipowdm.Ipowdm.Transceiver.getDefaultInstance() : transceiver_;
+                }
+            }
+
+            /**
+             * .ipowdm.Transceiver transceiver = 5;
+             */
+            private com.google.protobuf.SingleFieldBuilderV3 getTransceiverFieldBuilder() {
+                if (transceiverBuilder_ == null) {
+                    transceiverBuilder_ = new com.google.protobuf.SingleFieldBuilderV3(getTransceiver(), getParentForChildren(), isClean());
+                    transceiver_ = null;
+                }
+                return transceiverBuilder_;
+            }
+
+            @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:ipowdm.IpowdmRuleSet)
+        }
+
+        // @@protoc_insertion_point(class_scope:ipowdm.IpowdmRuleSet)
+        private static final ipowdm.Ipowdm.IpowdmRuleSet DEFAULT_INSTANCE;
+
+        static {
+            DEFAULT_INSTANCE = new ipowdm.Ipowdm.IpowdmRuleSet();
+        }
+
+        public static ipowdm.Ipowdm.IpowdmRuleSet getDefaultInstance() {
+            return DEFAULT_INSTANCE;
+        }
+
+        private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+
+            @java.lang.Override
+            public IpowdmRuleSet parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+                Builder builder = newBuilder();
+                try {
+                    builder.mergeFrom(input, extensionRegistry);
+                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    throw e.setUnfinishedMessage(builder.buildPartial());
+                } catch (com.google.protobuf.UninitializedMessageException e) {
+                    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 ipowdm.Ipowdm.IpowdmRuleSet getDefaultInstanceForType() {
+            return DEFAULT_INSTANCE;
+        }
+    }
+
+    private static final com.google.protobuf.Descriptors.Descriptor internal_static_ipowdm_RuleEndpoint_descriptor;
+
+    private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_ipowdm_RuleEndpoint_fieldAccessorTable;
+
+    private static final com.google.protobuf.Descriptors.Descriptor internal_static_ipowdm_DigitalSubCarrierId_descriptor;
+
+    private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_ipowdm_DigitalSubCarrierId_fieldAccessorTable;
+
+    private static final com.google.protobuf.Descriptors.Descriptor internal_static_ipowdm_DigitalSubCarriersGroup_descriptor;
+
+    private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_ipowdm_DigitalSubCarriersGroup_fieldAccessorTable;
+
+    private static final com.google.protobuf.Descriptors.Descriptor internal_static_ipowdm_Component_descriptor;
+
+    private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_ipowdm_Component_fieldAccessorTable;
+
+    private static final com.google.protobuf.Descriptors.Descriptor internal_static_ipowdm_Transceiver_descriptor;
+
+    private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_ipowdm_Transceiver_fieldAccessorTable;
+
+    private static final com.google.protobuf.Descriptors.Descriptor internal_static_ipowdm_IpowdmRuleSet_descriptor;
+
+    private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_ipowdm_IpowdmRuleSet_fieldAccessorTable;
+
+    public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() {
+        return descriptor;
+    }
+
+    private static com.google.protobuf.Descriptors.FileDescriptor descriptor;
+
+    static {
+        java.lang.String[] descriptorData = { "\n\014ipowdm.proto\022\006ipowdm\"R\n\014RuleEndpoint\022\014" + "\n\004uuid\030\001 \001(\t\022\022\n\nip_address\030\002 \001(\t\022\017\n\007ip_m" + "ask\030\003 \001(\t\022\017\n\007vlan_id\030\004 \001(\005\"=\n\023DigitalSub" + "CarrierId\022\026\n\016sub_carrier_id\030\001 \001(\005\022\016\n\006act" + "ive\030\002 \001(\t\"}\n\027DigitalSubCarriersGroup\022%\n\035" + "digital_sub_carriers_group_id\030\001 \001(\005\022;\n\026d" + "igital_sub_carrier_id\030\004 \003(\0132\033.ipowdm.Dig" + "italSubCarrierId\"\273\001\n\tComponent\022\014\n\004name\030\001" + " \001(\t\022\021\n\tfrequency\030\002 \001(\002\022\033\n\023target_output" + "_power\030\003 \001(\002\022\030\n\020operational_mode\030\004 \001(\005\022C" + "\n\032digital_sub_carriers_group\030\005 \003(\0132\037.ipo" + "wdm.DigitalSubCarriersGroup\022\021\n\toperation" + "\030\006 \001(\t\"4\n\013Transceiver\022%\n\ncomponents\030\001 \003(" + "\0132\021.ipowdm.Component\"\231\001\n\rIpowdmRuleSet\022!" + "\n\003src\030\001 \003(\0132\024.ipowdm.RuleEndpoint\022!\n\003dst" + "\030\002 \003(\0132\024.ipowdm.RuleEndpoint\022\n\n\002bw\030\003 \001(\005" + "\022\014\n\004uuid\030\004 \001(\t\022(\n\013transceiver\030\005 \001(\0132\023.ip" + "owdm.Transceiverb\006proto3" };
+        descriptor = com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] {});
+        internal_static_ipowdm_RuleEndpoint_descriptor = getDescriptor().getMessageTypes().get(0);
+        internal_static_ipowdm_RuleEndpoint_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_ipowdm_RuleEndpoint_descriptor, new java.lang.String[] { "Uuid", "IpAddress", "IpMask", "VlanId" });
+        internal_static_ipowdm_DigitalSubCarrierId_descriptor = getDescriptor().getMessageTypes().get(1);
+        internal_static_ipowdm_DigitalSubCarrierId_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_ipowdm_DigitalSubCarrierId_descriptor, new java.lang.String[] { "SubCarrierId", "Active" });
+        internal_static_ipowdm_DigitalSubCarriersGroup_descriptor = getDescriptor().getMessageTypes().get(2);
+        internal_static_ipowdm_DigitalSubCarriersGroup_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_ipowdm_DigitalSubCarriersGroup_descriptor, new java.lang.String[] { "DigitalSubCarriersGroupId", "DigitalSubCarrierId" });
+        internal_static_ipowdm_Component_descriptor = getDescriptor().getMessageTypes().get(3);
+        internal_static_ipowdm_Component_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_ipowdm_Component_descriptor, new java.lang.String[] { "Name", "Frequency", "TargetOutputPower", "OperationalMode", "DigitalSubCarriersGroup", "Operation" });
+        internal_static_ipowdm_Transceiver_descriptor = getDescriptor().getMessageTypes().get(4);
+        internal_static_ipowdm_Transceiver_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_ipowdm_Transceiver_descriptor, new java.lang.String[] { "Components" });
+        internal_static_ipowdm_IpowdmRuleSet_descriptor = getDescriptor().getMessageTypes().get(5);
+        internal_static_ipowdm_IpowdmRuleSet_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_ipowdm_IpowdmRuleSet_descriptor, new java.lang.String[] { "Src", "Dst", "Bw", "Uuid", "Transceiver" });
+    }
+    // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/src/ztp/target/generated-sources/grpc/tapi_lsp/TapiLsp.java b/src/ztp/target/generated-sources/grpc/tapi_lsp/TapiLsp.java
new file mode 100644
index 000000000..e8f5145bd
--- /dev/null
+++ b/src/ztp/target/generated-sources/grpc/tapi_lsp/TapiLsp.java
@@ -0,0 +1,3031 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: tapi_lsp.proto
+package tapi_lsp;
+
+public final class TapiLsp {
+
+    private TapiLsp() {
+    }
+
+    public static void registerAllExtensions(com.google.protobuf.ExtensionRegistryLite registry) {
+    }
+
+    public static void registerAllExtensions(com.google.protobuf.ExtensionRegistry registry) {
+        registerAllExtensions((com.google.protobuf.ExtensionRegistryLite) registry);
+    }
+
+    public interface TapiLspRuleSetOrBuilder extends // @@protoc_insertion_point(interface_extends:tapi_lsp.TapiLspRuleSet)
+    com.google.protobuf.MessageOrBuilder {
+
+        /**
+         * string input_sip = 1;
+         * @return The inputSip.
+         */
+        java.lang.String getInputSip();
+
+        /**
+         * string input_sip = 1;
+         * @return The bytes for inputSip.
+         */
+        com.google.protobuf.ByteString getInputSipBytes();
+
+        /**
+         * string output_sip = 2;
+         * @return The outputSip.
+         */
+        java.lang.String getOutputSip();
+
+        /**
+         * string output_sip = 2;
+         * @return The bytes for outputSip.
+         */
+        com.google.protobuf.ByteString getOutputSipBytes();
+
+        /**
+         * string uuid = 3;
+         * @return The uuid.
+         */
+        java.lang.String getUuid();
+
+        /**
+         * string uuid = 3;
+         * @return The bytes for uuid.
+         */
+        com.google.protobuf.ByteString getUuidBytes();
+
+        /**
+         * string bw = 4;
+         * @return The bw.
+         */
+        java.lang.String getBw();
+
+        /**
+         * string bw = 4;
+         * @return The bytes for bw.
+         */
+        com.google.protobuf.ByteString getBwBytes();
+
+        /**
+         * string tenant_uuid = 5;
+         * @return The tenantUuid.
+         */
+        java.lang.String getTenantUuid();
+
+        /**
+         * string tenant_uuid = 5;
+         * @return The bytes for tenantUuid.
+         */
+        com.google.protobuf.ByteString getTenantUuidBytes();
+
+        /**
+         * string layer_protocol_name = 6;
+         * @return The layerProtocolName.
+         */
+        java.lang.String getLayerProtocolName();
+
+        /**
+         * string layer_protocol_name = 6;
+         * @return The bytes for layerProtocolName.
+         */
+        com.google.protobuf.ByteString getLayerProtocolNameBytes();
+
+        /**
+         * string layer_protocol_qualifier = 7;
+         * @return The layerProtocolQualifier.
+         */
+        java.lang.String getLayerProtocolQualifier();
+
+        /**
+         * string layer_protocol_qualifier = 7;
+         * @return The bytes for layerProtocolQualifier.
+         */
+        com.google.protobuf.ByteString getLayerProtocolQualifierBytes();
+
+        /**
+         * string lower_frequency_mhz = 8;
+         * @return The lowerFrequencyMhz.
+         */
+        java.lang.String getLowerFrequencyMhz();
+
+        /**
+         * string lower_frequency_mhz = 8;
+         * @return The bytes for lowerFrequencyMhz.
+         */
+        com.google.protobuf.ByteString getLowerFrequencyMhzBytes();
+
+        /**
+         * string upper_frequency_mhz = 9;
+         * @return The upperFrequencyMhz.
+         */
+        java.lang.String getUpperFrequencyMhz();
+
+        /**
+         * string upper_frequency_mhz = 9;
+         * @return The bytes for upperFrequencyMhz.
+         */
+        com.google.protobuf.ByteString getUpperFrequencyMhzBytes();
+
+        /**
+         * repeated string link_uuid_path = 10;
+         * @return A list containing the linkUuidPath.
+         */
+        java.util.List getLinkUuidPathList();
+
+        /**
+         * repeated string link_uuid_path = 10;
+         * @return The count of linkUuidPath.
+         */
+        int getLinkUuidPathCount();
+
+        /**
+         * repeated string link_uuid_path = 10;
+         * @param index The index of the element to return.
+         * @return The linkUuidPath at the given index.
+         */
+        java.lang.String getLinkUuidPath(int index);
+
+        /**
+         * repeated string link_uuid_path = 10;
+         * @param index The index of the value to return.
+         * @return The bytes of the linkUuidPath at the given index.
+         */
+        com.google.protobuf.ByteString getLinkUuidPathBytes(int index);
+
+        /**
+         * string granularity = 11;
+         * @return The granularity.
+         */
+        java.lang.String getGranularity();
+
+        /**
+         * string granularity = 11;
+         * @return The bytes for granularity.
+         */
+        com.google.protobuf.ByteString getGranularityBytes();
+
+        /**
+         * string grid_type = 12;
+         * @return The gridType.
+         */
+        java.lang.String getGridType();
+
+        /**
+         * string grid_type = 12;
+         * @return The bytes for gridType.
+         */
+        com.google.protobuf.ByteString getGridTypeBytes();
+
+        /**
+         * string direction = 13;
+         * @return The direction.
+         */
+        java.lang.String getDirection();
+
+        /**
+         * string direction = 13;
+         * @return The bytes for direction.
+         */
+        com.google.protobuf.ByteString getDirectionBytes();
+
+        /**
+         * string capacity_unit = 14;
+         * @return The capacityUnit.
+         */
+        java.lang.String getCapacityUnit();
+
+        /**
+         * string capacity_unit = 14;
+         * @return The bytes for capacityUnit.
+         */
+        com.google.protobuf.ByteString getCapacityUnitBytes();
+
+        /**
+         * string capacity_value = 15;
+         * @return The capacityValue.
+         */
+        java.lang.String getCapacityValue();
+
+        /**
+         * string capacity_value = 15;
+         * @return The bytes for capacityValue.
+         */
+        com.google.protobuf.ByteString getCapacityValueBytes();
+
+        /**
+         * string route_objective_function = 16;
+         * @return The routeObjectiveFunction.
+         */
+        java.lang.String getRouteObjectiveFunction();
+
+        /**
+         * string route_objective_function = 16;
+         * @return The bytes for routeObjectiveFunction.
+         */
+        com.google.protobuf.ByteString getRouteObjectiveFunctionBytes();
+
+        /**
+         * string url = 17;
+         * @return The url.
+         */
+        java.lang.String getUrl();
+
+        /**
+         * string url = 17;
+         * @return The bytes for url.
+         */
+        com.google.protobuf.ByteString getUrlBytes();
+    }
+
+    /**
+     * Protobuf type {@code tapi_lsp.TapiLspRuleSet}
+     */
+    public static final class TapiLspRuleSet extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:tapi_lsp.TapiLspRuleSet)
+    TapiLspRuleSetOrBuilder {
+
+        private static final long serialVersionUID = 0L;
+
+        // Use TapiLspRuleSet.newBuilder() to construct.
+        private TapiLspRuleSet(com.google.protobuf.GeneratedMessageV3.Builder builder) {
+            super(builder);
+        }
+
+        private TapiLspRuleSet() {
+            inputSip_ = "";
+            outputSip_ = "";
+            uuid_ = "";
+            bw_ = "";
+            tenantUuid_ = "";
+            layerProtocolName_ = "";
+            layerProtocolQualifier_ = "";
+            lowerFrequencyMhz_ = "";
+            upperFrequencyMhz_ = "";
+            linkUuidPath_ = com.google.protobuf.LazyStringArrayList.emptyList();
+            granularity_ = "";
+            gridType_ = "";
+            direction_ = "";
+            capacityUnit_ = "";
+            capacityValue_ = "";
+            routeObjectiveFunction_ = "";
+            url_ = "";
+        }
+
+        @java.lang.Override
+        @SuppressWarnings({ "unused" })
+        protected java.lang.Object newInstance(UnusedPrivateParameter unused) {
+            return new TapiLspRuleSet();
+        }
+
+        public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+            return tapi_lsp.TapiLsp.internal_static_tapi_lsp_TapiLspRuleSet_descriptor;
+        }
+
+        @java.lang.Override
+        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+            return tapi_lsp.TapiLsp.internal_static_tapi_lsp_TapiLspRuleSet_fieldAccessorTable.ensureFieldAccessorsInitialized(tapi_lsp.TapiLsp.TapiLspRuleSet.class, tapi_lsp.TapiLsp.TapiLspRuleSet.Builder.class);
+        }
+
+        public static final int INPUT_SIP_FIELD_NUMBER = 1;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object inputSip_ = "";
+
+        /**
+         * string input_sip = 1;
+         * @return The inputSip.
+         */
+        @java.lang.Override
+        public java.lang.String getInputSip() {
+            java.lang.Object ref = inputSip_;
+            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();
+                inputSip_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string input_sip = 1;
+         * @return The bytes for inputSip.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getInputSipBytes() {
+            java.lang.Object ref = inputSip_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                inputSip_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int OUTPUT_SIP_FIELD_NUMBER = 2;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object outputSip_ = "";
+
+        /**
+         * string output_sip = 2;
+         * @return The outputSip.
+         */
+        @java.lang.Override
+        public java.lang.String getOutputSip() {
+            java.lang.Object ref = outputSip_;
+            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();
+                outputSip_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string output_sip = 2;
+         * @return The bytes for outputSip.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getOutputSipBytes() {
+            java.lang.Object ref = outputSip_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                outputSip_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int UUID_FIELD_NUMBER = 3;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object uuid_ = "";
+
+        /**
+         * string uuid = 3;
+         * @return The uuid.
+         */
+        @java.lang.Override
+        public java.lang.String getUuid() {
+            java.lang.Object ref = uuid_;
+            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();
+                uuid_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string uuid = 3;
+         * @return The bytes for uuid.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getUuidBytes() {
+            java.lang.Object ref = uuid_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                uuid_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int BW_FIELD_NUMBER = 4;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object bw_ = "";
+
+        /**
+         * string bw = 4;
+         * @return The bw.
+         */
+        @java.lang.Override
+        public java.lang.String getBw() {
+            java.lang.Object ref = bw_;
+            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();
+                bw_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string bw = 4;
+         * @return The bytes for bw.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getBwBytes() {
+            java.lang.Object ref = bw_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                bw_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int TENANT_UUID_FIELD_NUMBER = 5;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object tenantUuid_ = "";
+
+        /**
+         * string tenant_uuid = 5;
+         * @return The tenantUuid.
+         */
+        @java.lang.Override
+        public java.lang.String getTenantUuid() {
+            java.lang.Object ref = tenantUuid_;
+            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();
+                tenantUuid_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string tenant_uuid = 5;
+         * @return The bytes for tenantUuid.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getTenantUuidBytes() {
+            java.lang.Object ref = tenantUuid_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                tenantUuid_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int LAYER_PROTOCOL_NAME_FIELD_NUMBER = 6;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object layerProtocolName_ = "";
+
+        /**
+         * string layer_protocol_name = 6;
+         * @return The layerProtocolName.
+         */
+        @java.lang.Override
+        public java.lang.String getLayerProtocolName() {
+            java.lang.Object ref = layerProtocolName_;
+            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();
+                layerProtocolName_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string layer_protocol_name = 6;
+         * @return The bytes for layerProtocolName.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getLayerProtocolNameBytes() {
+            java.lang.Object ref = layerProtocolName_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                layerProtocolName_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int LAYER_PROTOCOL_QUALIFIER_FIELD_NUMBER = 7;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object layerProtocolQualifier_ = "";
+
+        /**
+         * string layer_protocol_qualifier = 7;
+         * @return The layerProtocolQualifier.
+         */
+        @java.lang.Override
+        public java.lang.String getLayerProtocolQualifier() {
+            java.lang.Object ref = layerProtocolQualifier_;
+            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();
+                layerProtocolQualifier_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string layer_protocol_qualifier = 7;
+         * @return The bytes for layerProtocolQualifier.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getLayerProtocolQualifierBytes() {
+            java.lang.Object ref = layerProtocolQualifier_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                layerProtocolQualifier_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int LOWER_FREQUENCY_MHZ_FIELD_NUMBER = 8;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object lowerFrequencyMhz_ = "";
+
+        /**
+         * string lower_frequency_mhz = 8;
+         * @return The lowerFrequencyMhz.
+         */
+        @java.lang.Override
+        public java.lang.String getLowerFrequencyMhz() {
+            java.lang.Object ref = lowerFrequencyMhz_;
+            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();
+                lowerFrequencyMhz_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string lower_frequency_mhz = 8;
+         * @return The bytes for lowerFrequencyMhz.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getLowerFrequencyMhzBytes() {
+            java.lang.Object ref = lowerFrequencyMhz_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                lowerFrequencyMhz_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int UPPER_FREQUENCY_MHZ_FIELD_NUMBER = 9;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object upperFrequencyMhz_ = "";
+
+        /**
+         * string upper_frequency_mhz = 9;
+         * @return The upperFrequencyMhz.
+         */
+        @java.lang.Override
+        public java.lang.String getUpperFrequencyMhz() {
+            java.lang.Object ref = upperFrequencyMhz_;
+            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();
+                upperFrequencyMhz_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string upper_frequency_mhz = 9;
+         * @return The bytes for upperFrequencyMhz.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getUpperFrequencyMhzBytes() {
+            java.lang.Object ref = upperFrequencyMhz_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                upperFrequencyMhz_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int LINK_UUID_PATH_FIELD_NUMBER = 10;
+
+        @SuppressWarnings("serial")
+        private com.google.protobuf.LazyStringArrayList linkUuidPath_ = com.google.protobuf.LazyStringArrayList.emptyList();
+
+        /**
+         * repeated string link_uuid_path = 10;
+         * @return A list containing the linkUuidPath.
+         */
+        public com.google.protobuf.ProtocolStringList getLinkUuidPathList() {
+            return linkUuidPath_;
+        }
+
+        /**
+         * repeated string link_uuid_path = 10;
+         * @return The count of linkUuidPath.
+         */
+        public int getLinkUuidPathCount() {
+            return linkUuidPath_.size();
+        }
+
+        /**
+         * repeated string link_uuid_path = 10;
+         * @param index The index of the element to return.
+         * @return The linkUuidPath at the given index.
+         */
+        public java.lang.String getLinkUuidPath(int index) {
+            return linkUuidPath_.get(index);
+        }
+
+        /**
+         * repeated string link_uuid_path = 10;
+         * @param index The index of the value to return.
+         * @return The bytes of the linkUuidPath at the given index.
+         */
+        public com.google.protobuf.ByteString getLinkUuidPathBytes(int index) {
+            return linkUuidPath_.getByteString(index);
+        }
+
+        public static final int GRANULARITY_FIELD_NUMBER = 11;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object granularity_ = "";
+
+        /**
+         * string granularity = 11;
+         * @return The granularity.
+         */
+        @java.lang.Override
+        public java.lang.String getGranularity() {
+            java.lang.Object ref = granularity_;
+            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();
+                granularity_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string granularity = 11;
+         * @return The bytes for granularity.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getGranularityBytes() {
+            java.lang.Object ref = granularity_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                granularity_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int GRID_TYPE_FIELD_NUMBER = 12;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object gridType_ = "";
+
+        /**
+         * string grid_type = 12;
+         * @return The gridType.
+         */
+        @java.lang.Override
+        public java.lang.String getGridType() {
+            java.lang.Object ref = gridType_;
+            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();
+                gridType_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string grid_type = 12;
+         * @return The bytes for gridType.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getGridTypeBytes() {
+            java.lang.Object ref = gridType_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                gridType_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int DIRECTION_FIELD_NUMBER = 13;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object direction_ = "";
+
+        /**
+         * string direction = 13;
+         * @return The direction.
+         */
+        @java.lang.Override
+        public java.lang.String getDirection() {
+            java.lang.Object ref = direction_;
+            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();
+                direction_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string direction = 13;
+         * @return The bytes for direction.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getDirectionBytes() {
+            java.lang.Object ref = direction_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                direction_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int CAPACITY_UNIT_FIELD_NUMBER = 14;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object capacityUnit_ = "";
+
+        /**
+         * string capacity_unit = 14;
+         * @return The capacityUnit.
+         */
+        @java.lang.Override
+        public java.lang.String getCapacityUnit() {
+            java.lang.Object ref = capacityUnit_;
+            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();
+                capacityUnit_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string capacity_unit = 14;
+         * @return The bytes for capacityUnit.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getCapacityUnitBytes() {
+            java.lang.Object ref = capacityUnit_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                capacityUnit_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int CAPACITY_VALUE_FIELD_NUMBER = 15;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object capacityValue_ = "";
+
+        /**
+         * string capacity_value = 15;
+         * @return The capacityValue.
+         */
+        @java.lang.Override
+        public java.lang.String getCapacityValue() {
+            java.lang.Object ref = capacityValue_;
+            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();
+                capacityValue_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string capacity_value = 15;
+         * @return The bytes for capacityValue.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getCapacityValueBytes() {
+            java.lang.Object ref = capacityValue_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                capacityValue_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int ROUTE_OBJECTIVE_FUNCTION_FIELD_NUMBER = 16;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object routeObjectiveFunction_ = "";
+
+        /**
+         * string route_objective_function = 16;
+         * @return The routeObjectiveFunction.
+         */
+        @java.lang.Override
+        public java.lang.String getRouteObjectiveFunction() {
+            java.lang.Object ref = routeObjectiveFunction_;
+            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();
+                routeObjectiveFunction_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string route_objective_function = 16;
+         * @return The bytes for routeObjectiveFunction.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getRouteObjectiveFunctionBytes() {
+            java.lang.Object ref = routeObjectiveFunction_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                routeObjectiveFunction_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        public static final int URL_FIELD_NUMBER = 17;
+
+        @SuppressWarnings("serial")
+        private volatile java.lang.Object url_ = "";
+
+        /**
+         * string url = 17;
+         * @return The url.
+         */
+        @java.lang.Override
+        public java.lang.String getUrl() {
+            java.lang.Object ref = url_;
+            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();
+                url_ = s;
+                return s;
+            }
+        }
+
+        /**
+         * string url = 17;
+         * @return The bytes for url.
+         */
+        @java.lang.Override
+        public com.google.protobuf.ByteString getUrlBytes() {
+            java.lang.Object ref = url_;
+            if (ref instanceof java.lang.String) {
+                com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                url_ = b;
+                return b;
+            } else {
+                return (com.google.protobuf.ByteString) ref;
+            }
+        }
+
+        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(inputSip_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 1, inputSip_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(outputSip_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 2, outputSip_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(uuid_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 3, uuid_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(bw_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 4, bw_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(tenantUuid_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 5, tenantUuid_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(layerProtocolName_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 6, layerProtocolName_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(layerProtocolQualifier_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 7, layerProtocolQualifier_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(lowerFrequencyMhz_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 8, lowerFrequencyMhz_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(upperFrequencyMhz_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 9, upperFrequencyMhz_);
+            }
+            for (int i = 0; i < linkUuidPath_.size(); i++) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 10, linkUuidPath_.getRaw(i));
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(granularity_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 11, granularity_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(gridType_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 12, gridType_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(direction_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 13, direction_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(capacityUnit_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 14, capacityUnit_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(capacityValue_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 15, capacityValue_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(routeObjectiveFunction_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 16, routeObjectiveFunction_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(url_)) {
+                com.google.protobuf.GeneratedMessageV3.writeString(output, 17, url_);
+            }
+            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(inputSip_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, inputSip_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(outputSip_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, outputSip_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(uuid_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, uuid_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(bw_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, bw_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(tenantUuid_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(5, tenantUuid_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(layerProtocolName_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(6, layerProtocolName_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(layerProtocolQualifier_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(7, layerProtocolQualifier_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(lowerFrequencyMhz_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(8, lowerFrequencyMhz_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(upperFrequencyMhz_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(9, upperFrequencyMhz_);
+            }
+            {
+                int dataSize = 0;
+                for (int i = 0; i < linkUuidPath_.size(); i++) {
+                    dataSize += computeStringSizeNoTag(linkUuidPath_.getRaw(i));
+                }
+                size += dataSize;
+                size += 1 * getLinkUuidPathList().size();
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(granularity_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(11, granularity_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(gridType_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(12, gridType_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(direction_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(13, direction_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(capacityUnit_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(14, capacityUnit_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(capacityValue_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(15, capacityValue_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(routeObjectiveFunction_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(16, routeObjectiveFunction_);
+            }
+            if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(url_)) {
+                size += com.google.protobuf.GeneratedMessageV3.computeStringSize(17, url_);
+            }
+            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 tapi_lsp.TapiLsp.TapiLspRuleSet)) {
+                return super.equals(obj);
+            }
+            tapi_lsp.TapiLsp.TapiLspRuleSet other = (tapi_lsp.TapiLsp.TapiLspRuleSet) obj;
+            if (!getInputSip().equals(other.getInputSip()))
+                return false;
+            if (!getOutputSip().equals(other.getOutputSip()))
+                return false;
+            if (!getUuid().equals(other.getUuid()))
+                return false;
+            if (!getBw().equals(other.getBw()))
+                return false;
+            if (!getTenantUuid().equals(other.getTenantUuid()))
+                return false;
+            if (!getLayerProtocolName().equals(other.getLayerProtocolName()))
+                return false;
+            if (!getLayerProtocolQualifier().equals(other.getLayerProtocolQualifier()))
+                return false;
+            if (!getLowerFrequencyMhz().equals(other.getLowerFrequencyMhz()))
+                return false;
+            if (!getUpperFrequencyMhz().equals(other.getUpperFrequencyMhz()))
+                return false;
+            if (!getLinkUuidPathList().equals(other.getLinkUuidPathList()))
+                return false;
+            if (!getGranularity().equals(other.getGranularity()))
+                return false;
+            if (!getGridType().equals(other.getGridType()))
+                return false;
+            if (!getDirection().equals(other.getDirection()))
+                return false;
+            if (!getCapacityUnit().equals(other.getCapacityUnit()))
+                return false;
+            if (!getCapacityValue().equals(other.getCapacityValue()))
+                return false;
+            if (!getRouteObjectiveFunction().equals(other.getRouteObjectiveFunction()))
+                return false;
+            if (!getUrl().equals(other.getUrl()))
+                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) + INPUT_SIP_FIELD_NUMBER;
+            hash = (53 * hash) + getInputSip().hashCode();
+            hash = (37 * hash) + OUTPUT_SIP_FIELD_NUMBER;
+            hash = (53 * hash) + getOutputSip().hashCode();
+            hash = (37 * hash) + UUID_FIELD_NUMBER;
+            hash = (53 * hash) + getUuid().hashCode();
+            hash = (37 * hash) + BW_FIELD_NUMBER;
+            hash = (53 * hash) + getBw().hashCode();
+            hash = (37 * hash) + TENANT_UUID_FIELD_NUMBER;
+            hash = (53 * hash) + getTenantUuid().hashCode();
+            hash = (37 * hash) + LAYER_PROTOCOL_NAME_FIELD_NUMBER;
+            hash = (53 * hash) + getLayerProtocolName().hashCode();
+            hash = (37 * hash) + LAYER_PROTOCOL_QUALIFIER_FIELD_NUMBER;
+            hash = (53 * hash) + getLayerProtocolQualifier().hashCode();
+            hash = (37 * hash) + LOWER_FREQUENCY_MHZ_FIELD_NUMBER;
+            hash = (53 * hash) + getLowerFrequencyMhz().hashCode();
+            hash = (37 * hash) + UPPER_FREQUENCY_MHZ_FIELD_NUMBER;
+            hash = (53 * hash) + getUpperFrequencyMhz().hashCode();
+            if (getLinkUuidPathCount() > 0) {
+                hash = (37 * hash) + LINK_UUID_PATH_FIELD_NUMBER;
+                hash = (53 * hash) + getLinkUuidPathList().hashCode();
+            }
+            hash = (37 * hash) + GRANULARITY_FIELD_NUMBER;
+            hash = (53 * hash) + getGranularity().hashCode();
+            hash = (37 * hash) + GRID_TYPE_FIELD_NUMBER;
+            hash = (53 * hash) + getGridType().hashCode();
+            hash = (37 * hash) + DIRECTION_FIELD_NUMBER;
+            hash = (53 * hash) + getDirection().hashCode();
+            hash = (37 * hash) + CAPACITY_UNIT_FIELD_NUMBER;
+            hash = (53 * hash) + getCapacityUnit().hashCode();
+            hash = (37 * hash) + CAPACITY_VALUE_FIELD_NUMBER;
+            hash = (53 * hash) + getCapacityValue().hashCode();
+            hash = (37 * hash) + ROUTE_OBJECTIVE_FUNCTION_FIELD_NUMBER;
+            hash = (53 * hash) + getRouteObjectiveFunction().hashCode();
+            hash = (37 * hash) + URL_FIELD_NUMBER;
+            hash = (53 * hash) + getUrl().hashCode();
+            hash = (29 * hash) + getUnknownFields().hashCode();
+            memoizedHashCode = hash;
+            return hash;
+        }
+
+        public static tapi_lsp.TapiLsp.TapiLspRuleSet parseFrom(java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static tapi_lsp.TapiLsp.TapiLspRuleSet parseFrom(java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static tapi_lsp.TapiLsp.TapiLspRuleSet parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static tapi_lsp.TapiLsp.TapiLspRuleSet parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static tapi_lsp.TapiLsp.TapiLspRuleSet parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data);
+        }
+
+        public static tapi_lsp.TapiLsp.TapiLspRuleSet parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+            return PARSER.parseFrom(data, extensionRegistry);
+        }
+
+        public static tapi_lsp.TapiLsp.TapiLspRuleSet parseFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static tapi_lsp.TapiLsp.TapiLspRuleSet 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 tapi_lsp.TapiLsp.TapiLspRuleSet parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input);
+        }
+
+        public static tapi_lsp.TapiLsp.TapiLspRuleSet 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 tapi_lsp.TapiLsp.TapiLspRuleSet parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException {
+            return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
+        }
+
+        public static tapi_lsp.TapiLsp.TapiLspRuleSet 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(tapi_lsp.TapiLsp.TapiLspRuleSet 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 tapi_lsp.TapiLspRuleSet}
+         */
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:tapi_lsp.TapiLspRuleSet)
+        tapi_lsp.TapiLsp.TapiLspRuleSetOrBuilder {
+
+            public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+                return tapi_lsp.TapiLsp.internal_static_tapi_lsp_TapiLspRuleSet_descriptor;
+            }
+
+            @java.lang.Override
+            protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internalGetFieldAccessorTable() {
+                return tapi_lsp.TapiLsp.internal_static_tapi_lsp_TapiLspRuleSet_fieldAccessorTable.ensureFieldAccessorsInitialized(tapi_lsp.TapiLsp.TapiLspRuleSet.class, tapi_lsp.TapiLsp.TapiLspRuleSet.Builder.class);
+            }
+
+            // Construct using tapi_lsp.TapiLsp.TapiLspRuleSet.newBuilder()
+            private Builder() {
+            }
+
+            private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+                super(parent);
+            }
+
+            @java.lang.Override
+            public Builder clear() {
+                super.clear();
+                bitField0_ = 0;
+                inputSip_ = "";
+                outputSip_ = "";
+                uuid_ = "";
+                bw_ = "";
+                tenantUuid_ = "";
+                layerProtocolName_ = "";
+                layerProtocolQualifier_ = "";
+                lowerFrequencyMhz_ = "";
+                upperFrequencyMhz_ = "";
+                linkUuidPath_ = com.google.protobuf.LazyStringArrayList.emptyList();
+                granularity_ = "";
+                gridType_ = "";
+                direction_ = "";
+                capacityUnit_ = "";
+                capacityValue_ = "";
+                routeObjectiveFunction_ = "";
+                url_ = "";
+                return this;
+            }
+
+            @java.lang.Override
+            public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+                return tapi_lsp.TapiLsp.internal_static_tapi_lsp_TapiLspRuleSet_descriptor;
+            }
+
+            @java.lang.Override
+            public tapi_lsp.TapiLsp.TapiLspRuleSet getDefaultInstanceForType() {
+                return tapi_lsp.TapiLsp.TapiLspRuleSet.getDefaultInstance();
+            }
+
+            @java.lang.Override
+            public tapi_lsp.TapiLsp.TapiLspRuleSet build() {
+                tapi_lsp.TapiLsp.TapiLspRuleSet result = buildPartial();
+                if (!result.isInitialized()) {
+                    throw newUninitializedMessageException(result);
+                }
+                return result;
+            }
+
+            @java.lang.Override
+            public tapi_lsp.TapiLsp.TapiLspRuleSet buildPartial() {
+                tapi_lsp.TapiLsp.TapiLspRuleSet result = new tapi_lsp.TapiLsp.TapiLspRuleSet(this);
+                if (bitField0_ != 0) {
+                    buildPartial0(result);
+                }
+                onBuilt();
+                return result;
+            }
+
+            private void buildPartial0(tapi_lsp.TapiLsp.TapiLspRuleSet result) {
+                int from_bitField0_ = bitField0_;
+                if (((from_bitField0_ & 0x00000001) != 0)) {
+                    result.inputSip_ = inputSip_;
+                }
+                if (((from_bitField0_ & 0x00000002) != 0)) {
+                    result.outputSip_ = outputSip_;
+                }
+                if (((from_bitField0_ & 0x00000004) != 0)) {
+                    result.uuid_ = uuid_;
+                }
+                if (((from_bitField0_ & 0x00000008) != 0)) {
+                    result.bw_ = bw_;
+                }
+                if (((from_bitField0_ & 0x00000010) != 0)) {
+                    result.tenantUuid_ = tenantUuid_;
+                }
+                if (((from_bitField0_ & 0x00000020) != 0)) {
+                    result.layerProtocolName_ = layerProtocolName_;
+                }
+                if (((from_bitField0_ & 0x00000040) != 0)) {
+                    result.layerProtocolQualifier_ = layerProtocolQualifier_;
+                }
+                if (((from_bitField0_ & 0x00000080) != 0)) {
+                    result.lowerFrequencyMhz_ = lowerFrequencyMhz_;
+                }
+                if (((from_bitField0_ & 0x00000100) != 0)) {
+                    result.upperFrequencyMhz_ = upperFrequencyMhz_;
+                }
+                if (((from_bitField0_ & 0x00000200) != 0)) {
+                    linkUuidPath_.makeImmutable();
+                    result.linkUuidPath_ = linkUuidPath_;
+                }
+                if (((from_bitField0_ & 0x00000400) != 0)) {
+                    result.granularity_ = granularity_;
+                }
+                if (((from_bitField0_ & 0x00000800) != 0)) {
+                    result.gridType_ = gridType_;
+                }
+                if (((from_bitField0_ & 0x00001000) != 0)) {
+                    result.direction_ = direction_;
+                }
+                if (((from_bitField0_ & 0x00002000) != 0)) {
+                    result.capacityUnit_ = capacityUnit_;
+                }
+                if (((from_bitField0_ & 0x00004000) != 0)) {
+                    result.capacityValue_ = capacityValue_;
+                }
+                if (((from_bitField0_ & 0x00008000) != 0)) {
+                    result.routeObjectiveFunction_ = routeObjectiveFunction_;
+                }
+                if (((from_bitField0_ & 0x00010000) != 0)) {
+                    result.url_ = url_;
+                }
+            }
+
+            @java.lang.Override
+            public Builder mergeFrom(com.google.protobuf.Message other) {
+                if (other instanceof tapi_lsp.TapiLsp.TapiLspRuleSet) {
+                    return mergeFrom((tapi_lsp.TapiLsp.TapiLspRuleSet) other);
+                } else {
+                    super.mergeFrom(other);
+                    return this;
+                }
+            }
+
+            public Builder mergeFrom(tapi_lsp.TapiLsp.TapiLspRuleSet other) {
+                if (other == tapi_lsp.TapiLsp.TapiLspRuleSet.getDefaultInstance())
+                    return this;
+                if (!other.getInputSip().isEmpty()) {
+                    inputSip_ = other.inputSip_;
+                    bitField0_ |= 0x00000001;
+                    onChanged();
+                }
+                if (!other.getOutputSip().isEmpty()) {
+                    outputSip_ = other.outputSip_;
+                    bitField0_ |= 0x00000002;
+                    onChanged();
+                }
+                if (!other.getUuid().isEmpty()) {
+                    uuid_ = other.uuid_;
+                    bitField0_ |= 0x00000004;
+                    onChanged();
+                }
+                if (!other.getBw().isEmpty()) {
+                    bw_ = other.bw_;
+                    bitField0_ |= 0x00000008;
+                    onChanged();
+                }
+                if (!other.getTenantUuid().isEmpty()) {
+                    tenantUuid_ = other.tenantUuid_;
+                    bitField0_ |= 0x00000010;
+                    onChanged();
+                }
+                if (!other.getLayerProtocolName().isEmpty()) {
+                    layerProtocolName_ = other.layerProtocolName_;
+                    bitField0_ |= 0x00000020;
+                    onChanged();
+                }
+                if (!other.getLayerProtocolQualifier().isEmpty()) {
+                    layerProtocolQualifier_ = other.layerProtocolQualifier_;
+                    bitField0_ |= 0x00000040;
+                    onChanged();
+                }
+                if (!other.getLowerFrequencyMhz().isEmpty()) {
+                    lowerFrequencyMhz_ = other.lowerFrequencyMhz_;
+                    bitField0_ |= 0x00000080;
+                    onChanged();
+                }
+                if (!other.getUpperFrequencyMhz().isEmpty()) {
+                    upperFrequencyMhz_ = other.upperFrequencyMhz_;
+                    bitField0_ |= 0x00000100;
+                    onChanged();
+                }
+                if (!other.linkUuidPath_.isEmpty()) {
+                    if (linkUuidPath_.isEmpty()) {
+                        linkUuidPath_ = other.linkUuidPath_;
+                        bitField0_ |= 0x00000200;
+                    } else {
+                        ensureLinkUuidPathIsMutable();
+                        linkUuidPath_.addAll(other.linkUuidPath_);
+                    }
+                    onChanged();
+                }
+                if (!other.getGranularity().isEmpty()) {
+                    granularity_ = other.granularity_;
+                    bitField0_ |= 0x00000400;
+                    onChanged();
+                }
+                if (!other.getGridType().isEmpty()) {
+                    gridType_ = other.gridType_;
+                    bitField0_ |= 0x00000800;
+                    onChanged();
+                }
+                if (!other.getDirection().isEmpty()) {
+                    direction_ = other.direction_;
+                    bitField0_ |= 0x00001000;
+                    onChanged();
+                }
+                if (!other.getCapacityUnit().isEmpty()) {
+                    capacityUnit_ = other.capacityUnit_;
+                    bitField0_ |= 0x00002000;
+                    onChanged();
+                }
+                if (!other.getCapacityValue().isEmpty()) {
+                    capacityValue_ = other.capacityValue_;
+                    bitField0_ |= 0x00004000;
+                    onChanged();
+                }
+                if (!other.getRouteObjectiveFunction().isEmpty()) {
+                    routeObjectiveFunction_ = other.routeObjectiveFunction_;
+                    bitField0_ |= 0x00008000;
+                    onChanged();
+                }
+                if (!other.getUrl().isEmpty()) {
+                    url_ = other.url_;
+                    bitField0_ |= 0x00010000;
+                    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:
+                                {
+                                    inputSip_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00000001;
+                                    break;
+                                }
+                            // case 10
+                            case 18:
+                                {
+                                    outputSip_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00000002;
+                                    break;
+                                }
+                            // case 18
+                            case 26:
+                                {
+                                    uuid_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00000004;
+                                    break;
+                                }
+                            // case 26
+                            case 34:
+                                {
+                                    bw_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00000008;
+                                    break;
+                                }
+                            // case 34
+                            case 42:
+                                {
+                                    tenantUuid_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00000010;
+                                    break;
+                                }
+                            // case 42
+                            case 50:
+                                {
+                                    layerProtocolName_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00000020;
+                                    break;
+                                }
+                            // case 50
+                            case 58:
+                                {
+                                    layerProtocolQualifier_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00000040;
+                                    break;
+                                }
+                            // case 58
+                            case 66:
+                                {
+                                    lowerFrequencyMhz_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00000080;
+                                    break;
+                                }
+                            // case 66
+                            case 74:
+                                {
+                                    upperFrequencyMhz_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00000100;
+                                    break;
+                                }
+                            // case 74
+                            case 82:
+                                {
+                                    java.lang.String s = input.readStringRequireUtf8();
+                                    ensureLinkUuidPathIsMutable();
+                                    linkUuidPath_.add(s);
+                                    break;
+                                }
+                            // case 82
+                            case 90:
+                                {
+                                    granularity_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00000400;
+                                    break;
+                                }
+                            // case 90
+                            case 98:
+                                {
+                                    gridType_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00000800;
+                                    break;
+                                }
+                            // case 98
+                            case 106:
+                                {
+                                    direction_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00001000;
+                                    break;
+                                }
+                            // case 106
+                            case 114:
+                                {
+                                    capacityUnit_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00002000;
+                                    break;
+                                }
+                            // case 114
+                            case 122:
+                                {
+                                    capacityValue_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00004000;
+                                    break;
+                                }
+                            // case 122
+                            case 130:
+                                {
+                                    routeObjectiveFunction_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00008000;
+                                    break;
+                                }
+                            // case 130
+                            case 138:
+                                {
+                                    url_ = input.readStringRequireUtf8();
+                                    bitField0_ |= 0x00010000;
+                                    break;
+                                }
+                            // case 138
+                            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 inputSip_ = "";
+
+            /**
+             * string input_sip = 1;
+             * @return The inputSip.
+             */
+            public java.lang.String getInputSip() {
+                java.lang.Object ref = inputSip_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    inputSip_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string input_sip = 1;
+             * @return The bytes for inputSip.
+             */
+            public com.google.protobuf.ByteString getInputSipBytes() {
+                java.lang.Object ref = inputSip_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    inputSip_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string input_sip = 1;
+             * @param value The inputSip to set.
+             * @return This builder for chaining.
+             */
+            public Builder setInputSip(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                inputSip_ = value;
+                bitField0_ |= 0x00000001;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string input_sip = 1;
+             * @return This builder for chaining.
+             */
+            public Builder clearInputSip() {
+                inputSip_ = getDefaultInstance().getInputSip();
+                bitField0_ = (bitField0_ & ~0x00000001);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string input_sip = 1;
+             * @param value The bytes for inputSip to set.
+             * @return This builder for chaining.
+             */
+            public Builder setInputSipBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                inputSip_ = value;
+                bitField0_ |= 0x00000001;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object outputSip_ = "";
+
+            /**
+             * string output_sip = 2;
+             * @return The outputSip.
+             */
+            public java.lang.String getOutputSip() {
+                java.lang.Object ref = outputSip_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    outputSip_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string output_sip = 2;
+             * @return The bytes for outputSip.
+             */
+            public com.google.protobuf.ByteString getOutputSipBytes() {
+                java.lang.Object ref = outputSip_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    outputSip_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string output_sip = 2;
+             * @param value The outputSip to set.
+             * @return This builder for chaining.
+             */
+            public Builder setOutputSip(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                outputSip_ = value;
+                bitField0_ |= 0x00000002;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string output_sip = 2;
+             * @return This builder for chaining.
+             */
+            public Builder clearOutputSip() {
+                outputSip_ = getDefaultInstance().getOutputSip();
+                bitField0_ = (bitField0_ & ~0x00000002);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string output_sip = 2;
+             * @param value The bytes for outputSip to set.
+             * @return This builder for chaining.
+             */
+            public Builder setOutputSipBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                outputSip_ = value;
+                bitField0_ |= 0x00000002;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object uuid_ = "";
+
+            /**
+             * string uuid = 3;
+             * @return The uuid.
+             */
+            public java.lang.String getUuid() {
+                java.lang.Object ref = uuid_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    uuid_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string uuid = 3;
+             * @return The bytes for uuid.
+             */
+            public com.google.protobuf.ByteString getUuidBytes() {
+                java.lang.Object ref = uuid_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    uuid_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string uuid = 3;
+             * @param value The uuid to set.
+             * @return This builder for chaining.
+             */
+            public Builder setUuid(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                uuid_ = value;
+                bitField0_ |= 0x00000004;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string uuid = 3;
+             * @return This builder for chaining.
+             */
+            public Builder clearUuid() {
+                uuid_ = getDefaultInstance().getUuid();
+                bitField0_ = (bitField0_ & ~0x00000004);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string uuid = 3;
+             * @param value The bytes for uuid to set.
+             * @return This builder for chaining.
+             */
+            public Builder setUuidBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                uuid_ = value;
+                bitField0_ |= 0x00000004;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object bw_ = "";
+
+            /**
+             * string bw = 4;
+             * @return The bw.
+             */
+            public java.lang.String getBw() {
+                java.lang.Object ref = bw_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    bw_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string bw = 4;
+             * @return The bytes for bw.
+             */
+            public com.google.protobuf.ByteString getBwBytes() {
+                java.lang.Object ref = bw_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    bw_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string bw = 4;
+             * @param value The bw to set.
+             * @return This builder for chaining.
+             */
+            public Builder setBw(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                bw_ = value;
+                bitField0_ |= 0x00000008;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string bw = 4;
+             * @return This builder for chaining.
+             */
+            public Builder clearBw() {
+                bw_ = getDefaultInstance().getBw();
+                bitField0_ = (bitField0_ & ~0x00000008);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string bw = 4;
+             * @param value The bytes for bw to set.
+             * @return This builder for chaining.
+             */
+            public Builder setBwBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                bw_ = value;
+                bitField0_ |= 0x00000008;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object tenantUuid_ = "";
+
+            /**
+             * string tenant_uuid = 5;
+             * @return The tenantUuid.
+             */
+            public java.lang.String getTenantUuid() {
+                java.lang.Object ref = tenantUuid_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    tenantUuid_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string tenant_uuid = 5;
+             * @return The bytes for tenantUuid.
+             */
+            public com.google.protobuf.ByteString getTenantUuidBytes() {
+                java.lang.Object ref = tenantUuid_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    tenantUuid_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string tenant_uuid = 5;
+             * @param value The tenantUuid to set.
+             * @return This builder for chaining.
+             */
+            public Builder setTenantUuid(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                tenantUuid_ = value;
+                bitField0_ |= 0x00000010;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string tenant_uuid = 5;
+             * @return This builder for chaining.
+             */
+            public Builder clearTenantUuid() {
+                tenantUuid_ = getDefaultInstance().getTenantUuid();
+                bitField0_ = (bitField0_ & ~0x00000010);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string tenant_uuid = 5;
+             * @param value The bytes for tenantUuid to set.
+             * @return This builder for chaining.
+             */
+            public Builder setTenantUuidBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                tenantUuid_ = value;
+                bitField0_ |= 0x00000010;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object layerProtocolName_ = "";
+
+            /**
+             * string layer_protocol_name = 6;
+             * @return The layerProtocolName.
+             */
+            public java.lang.String getLayerProtocolName() {
+                java.lang.Object ref = layerProtocolName_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    layerProtocolName_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string layer_protocol_name = 6;
+             * @return The bytes for layerProtocolName.
+             */
+            public com.google.protobuf.ByteString getLayerProtocolNameBytes() {
+                java.lang.Object ref = layerProtocolName_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    layerProtocolName_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string layer_protocol_name = 6;
+             * @param value The layerProtocolName to set.
+             * @return This builder for chaining.
+             */
+            public Builder setLayerProtocolName(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                layerProtocolName_ = value;
+                bitField0_ |= 0x00000020;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string layer_protocol_name = 6;
+             * @return This builder for chaining.
+             */
+            public Builder clearLayerProtocolName() {
+                layerProtocolName_ = getDefaultInstance().getLayerProtocolName();
+                bitField0_ = (bitField0_ & ~0x00000020);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string layer_protocol_name = 6;
+             * @param value The bytes for layerProtocolName to set.
+             * @return This builder for chaining.
+             */
+            public Builder setLayerProtocolNameBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                layerProtocolName_ = value;
+                bitField0_ |= 0x00000020;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object layerProtocolQualifier_ = "";
+
+            /**
+             * string layer_protocol_qualifier = 7;
+             * @return The layerProtocolQualifier.
+             */
+            public java.lang.String getLayerProtocolQualifier() {
+                java.lang.Object ref = layerProtocolQualifier_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    layerProtocolQualifier_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string layer_protocol_qualifier = 7;
+             * @return The bytes for layerProtocolQualifier.
+             */
+            public com.google.protobuf.ByteString getLayerProtocolQualifierBytes() {
+                java.lang.Object ref = layerProtocolQualifier_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    layerProtocolQualifier_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string layer_protocol_qualifier = 7;
+             * @param value The layerProtocolQualifier to set.
+             * @return This builder for chaining.
+             */
+            public Builder setLayerProtocolQualifier(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                layerProtocolQualifier_ = value;
+                bitField0_ |= 0x00000040;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string layer_protocol_qualifier = 7;
+             * @return This builder for chaining.
+             */
+            public Builder clearLayerProtocolQualifier() {
+                layerProtocolQualifier_ = getDefaultInstance().getLayerProtocolQualifier();
+                bitField0_ = (bitField0_ & ~0x00000040);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string layer_protocol_qualifier = 7;
+             * @param value The bytes for layerProtocolQualifier to set.
+             * @return This builder for chaining.
+             */
+            public Builder setLayerProtocolQualifierBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                layerProtocolQualifier_ = value;
+                bitField0_ |= 0x00000040;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object lowerFrequencyMhz_ = "";
+
+            /**
+             * string lower_frequency_mhz = 8;
+             * @return The lowerFrequencyMhz.
+             */
+            public java.lang.String getLowerFrequencyMhz() {
+                java.lang.Object ref = lowerFrequencyMhz_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    lowerFrequencyMhz_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string lower_frequency_mhz = 8;
+             * @return The bytes for lowerFrequencyMhz.
+             */
+            public com.google.protobuf.ByteString getLowerFrequencyMhzBytes() {
+                java.lang.Object ref = lowerFrequencyMhz_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    lowerFrequencyMhz_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string lower_frequency_mhz = 8;
+             * @param value The lowerFrequencyMhz to set.
+             * @return This builder for chaining.
+             */
+            public Builder setLowerFrequencyMhz(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                lowerFrequencyMhz_ = value;
+                bitField0_ |= 0x00000080;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string lower_frequency_mhz = 8;
+             * @return This builder for chaining.
+             */
+            public Builder clearLowerFrequencyMhz() {
+                lowerFrequencyMhz_ = getDefaultInstance().getLowerFrequencyMhz();
+                bitField0_ = (bitField0_ & ~0x00000080);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string lower_frequency_mhz = 8;
+             * @param value The bytes for lowerFrequencyMhz to set.
+             * @return This builder for chaining.
+             */
+            public Builder setLowerFrequencyMhzBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                lowerFrequencyMhz_ = value;
+                bitField0_ |= 0x00000080;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object upperFrequencyMhz_ = "";
+
+            /**
+             * string upper_frequency_mhz = 9;
+             * @return The upperFrequencyMhz.
+             */
+            public java.lang.String getUpperFrequencyMhz() {
+                java.lang.Object ref = upperFrequencyMhz_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    upperFrequencyMhz_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string upper_frequency_mhz = 9;
+             * @return The bytes for upperFrequencyMhz.
+             */
+            public com.google.protobuf.ByteString getUpperFrequencyMhzBytes() {
+                java.lang.Object ref = upperFrequencyMhz_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    upperFrequencyMhz_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string upper_frequency_mhz = 9;
+             * @param value The upperFrequencyMhz to set.
+             * @return This builder for chaining.
+             */
+            public Builder setUpperFrequencyMhz(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                upperFrequencyMhz_ = value;
+                bitField0_ |= 0x00000100;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string upper_frequency_mhz = 9;
+             * @return This builder for chaining.
+             */
+            public Builder clearUpperFrequencyMhz() {
+                upperFrequencyMhz_ = getDefaultInstance().getUpperFrequencyMhz();
+                bitField0_ = (bitField0_ & ~0x00000100);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string upper_frequency_mhz = 9;
+             * @param value The bytes for upperFrequencyMhz to set.
+             * @return This builder for chaining.
+             */
+            public Builder setUpperFrequencyMhzBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                upperFrequencyMhz_ = value;
+                bitField0_ |= 0x00000100;
+                onChanged();
+                return this;
+            }
+
+            private com.google.protobuf.LazyStringArrayList linkUuidPath_ = com.google.protobuf.LazyStringArrayList.emptyList();
+
+            private void ensureLinkUuidPathIsMutable() {
+                if (!linkUuidPath_.isModifiable()) {
+                    linkUuidPath_ = new com.google.protobuf.LazyStringArrayList(linkUuidPath_);
+                }
+                bitField0_ |= 0x00000200;
+            }
+
+            /**
+             * repeated string link_uuid_path = 10;
+             * @return A list containing the linkUuidPath.
+             */
+            public com.google.protobuf.ProtocolStringList getLinkUuidPathList() {
+                linkUuidPath_.makeImmutable();
+                return linkUuidPath_;
+            }
+
+            /**
+             * repeated string link_uuid_path = 10;
+             * @return The count of linkUuidPath.
+             */
+            public int getLinkUuidPathCount() {
+                return linkUuidPath_.size();
+            }
+
+            /**
+             * repeated string link_uuid_path = 10;
+             * @param index The index of the element to return.
+             * @return The linkUuidPath at the given index.
+             */
+            public java.lang.String getLinkUuidPath(int index) {
+                return linkUuidPath_.get(index);
+            }
+
+            /**
+             * repeated string link_uuid_path = 10;
+             * @param index The index of the value to return.
+             * @return The bytes of the linkUuidPath at the given index.
+             */
+            public com.google.protobuf.ByteString getLinkUuidPathBytes(int index) {
+                return linkUuidPath_.getByteString(index);
+            }
+
+            /**
+             * repeated string link_uuid_path = 10;
+             * @param index The index to set the value at.
+             * @param value The linkUuidPath to set.
+             * @return This builder for chaining.
+             */
+            public Builder setLinkUuidPath(int index, java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                ensureLinkUuidPathIsMutable();
+                linkUuidPath_.set(index, value);
+                bitField0_ |= 0x00000200;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * repeated string link_uuid_path = 10;
+             * @param value The linkUuidPath to add.
+             * @return This builder for chaining.
+             */
+            public Builder addLinkUuidPath(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                ensureLinkUuidPathIsMutable();
+                linkUuidPath_.add(value);
+                bitField0_ |= 0x00000200;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * repeated string link_uuid_path = 10;
+             * @param values The linkUuidPath to add.
+             * @return This builder for chaining.
+             */
+            public Builder addAllLinkUuidPath(java.lang.Iterable values) {
+                ensureLinkUuidPathIsMutable();
+                com.google.protobuf.AbstractMessageLite.Builder.addAll(values, linkUuidPath_);
+                bitField0_ |= 0x00000200;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * repeated string link_uuid_path = 10;
+             * @return This builder for chaining.
+             */
+            public Builder clearLinkUuidPath() {
+                linkUuidPath_ = com.google.protobuf.LazyStringArrayList.emptyList();
+                bitField0_ = (bitField0_ & ~0x00000200);
+                ;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * repeated string link_uuid_path = 10;
+             * @param value The bytes of the linkUuidPath to add.
+             * @return This builder for chaining.
+             */
+            public Builder addLinkUuidPathBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                ensureLinkUuidPathIsMutable();
+                linkUuidPath_.add(value);
+                bitField0_ |= 0x00000200;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object granularity_ = "";
+
+            /**
+             * string granularity = 11;
+             * @return The granularity.
+             */
+            public java.lang.String getGranularity() {
+                java.lang.Object ref = granularity_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    granularity_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string granularity = 11;
+             * @return The bytes for granularity.
+             */
+            public com.google.protobuf.ByteString getGranularityBytes() {
+                java.lang.Object ref = granularity_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    granularity_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string granularity = 11;
+             * @param value The granularity to set.
+             * @return This builder for chaining.
+             */
+            public Builder setGranularity(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                granularity_ = value;
+                bitField0_ |= 0x00000400;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string granularity = 11;
+             * @return This builder for chaining.
+             */
+            public Builder clearGranularity() {
+                granularity_ = getDefaultInstance().getGranularity();
+                bitField0_ = (bitField0_ & ~0x00000400);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string granularity = 11;
+             * @param value The bytes for granularity to set.
+             * @return This builder for chaining.
+             */
+            public Builder setGranularityBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                granularity_ = value;
+                bitField0_ |= 0x00000400;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object gridType_ = "";
+
+            /**
+             * string grid_type = 12;
+             * @return The gridType.
+             */
+            public java.lang.String getGridType() {
+                java.lang.Object ref = gridType_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    gridType_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string grid_type = 12;
+             * @return The bytes for gridType.
+             */
+            public com.google.protobuf.ByteString getGridTypeBytes() {
+                java.lang.Object ref = gridType_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    gridType_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string grid_type = 12;
+             * @param value The gridType to set.
+             * @return This builder for chaining.
+             */
+            public Builder setGridType(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                gridType_ = value;
+                bitField0_ |= 0x00000800;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string grid_type = 12;
+             * @return This builder for chaining.
+             */
+            public Builder clearGridType() {
+                gridType_ = getDefaultInstance().getGridType();
+                bitField0_ = (bitField0_ & ~0x00000800);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string grid_type = 12;
+             * @param value The bytes for gridType to set.
+             * @return This builder for chaining.
+             */
+            public Builder setGridTypeBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                gridType_ = value;
+                bitField0_ |= 0x00000800;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object direction_ = "";
+
+            /**
+             * string direction = 13;
+             * @return The direction.
+             */
+            public java.lang.String getDirection() {
+                java.lang.Object ref = direction_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    direction_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string direction = 13;
+             * @return The bytes for direction.
+             */
+            public com.google.protobuf.ByteString getDirectionBytes() {
+                java.lang.Object ref = direction_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    direction_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string direction = 13;
+             * @param value The direction to set.
+             * @return This builder for chaining.
+             */
+            public Builder setDirection(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                direction_ = value;
+                bitField0_ |= 0x00001000;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string direction = 13;
+             * @return This builder for chaining.
+             */
+            public Builder clearDirection() {
+                direction_ = getDefaultInstance().getDirection();
+                bitField0_ = (bitField0_ & ~0x00001000);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string direction = 13;
+             * @param value The bytes for direction to set.
+             * @return This builder for chaining.
+             */
+            public Builder setDirectionBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                direction_ = value;
+                bitField0_ |= 0x00001000;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object capacityUnit_ = "";
+
+            /**
+             * string capacity_unit = 14;
+             * @return The capacityUnit.
+             */
+            public java.lang.String getCapacityUnit() {
+                java.lang.Object ref = capacityUnit_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    capacityUnit_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string capacity_unit = 14;
+             * @return The bytes for capacityUnit.
+             */
+            public com.google.protobuf.ByteString getCapacityUnitBytes() {
+                java.lang.Object ref = capacityUnit_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    capacityUnit_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string capacity_unit = 14;
+             * @param value The capacityUnit to set.
+             * @return This builder for chaining.
+             */
+            public Builder setCapacityUnit(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                capacityUnit_ = value;
+                bitField0_ |= 0x00002000;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string capacity_unit = 14;
+             * @return This builder for chaining.
+             */
+            public Builder clearCapacityUnit() {
+                capacityUnit_ = getDefaultInstance().getCapacityUnit();
+                bitField0_ = (bitField0_ & ~0x00002000);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string capacity_unit = 14;
+             * @param value The bytes for capacityUnit to set.
+             * @return This builder for chaining.
+             */
+            public Builder setCapacityUnitBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                capacityUnit_ = value;
+                bitField0_ |= 0x00002000;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object capacityValue_ = "";
+
+            /**
+             * string capacity_value = 15;
+             * @return The capacityValue.
+             */
+            public java.lang.String getCapacityValue() {
+                java.lang.Object ref = capacityValue_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    capacityValue_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string capacity_value = 15;
+             * @return The bytes for capacityValue.
+             */
+            public com.google.protobuf.ByteString getCapacityValueBytes() {
+                java.lang.Object ref = capacityValue_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    capacityValue_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string capacity_value = 15;
+             * @param value The capacityValue to set.
+             * @return This builder for chaining.
+             */
+            public Builder setCapacityValue(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                capacityValue_ = value;
+                bitField0_ |= 0x00004000;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string capacity_value = 15;
+             * @return This builder for chaining.
+             */
+            public Builder clearCapacityValue() {
+                capacityValue_ = getDefaultInstance().getCapacityValue();
+                bitField0_ = (bitField0_ & ~0x00004000);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string capacity_value = 15;
+             * @param value The bytes for capacityValue to set.
+             * @return This builder for chaining.
+             */
+            public Builder setCapacityValueBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                capacityValue_ = value;
+                bitField0_ |= 0x00004000;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object routeObjectiveFunction_ = "";
+
+            /**
+             * string route_objective_function = 16;
+             * @return The routeObjectiveFunction.
+             */
+            public java.lang.String getRouteObjectiveFunction() {
+                java.lang.Object ref = routeObjectiveFunction_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    routeObjectiveFunction_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string route_objective_function = 16;
+             * @return The bytes for routeObjectiveFunction.
+             */
+            public com.google.protobuf.ByteString getRouteObjectiveFunctionBytes() {
+                java.lang.Object ref = routeObjectiveFunction_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    routeObjectiveFunction_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string route_objective_function = 16;
+             * @param value The routeObjectiveFunction to set.
+             * @return This builder for chaining.
+             */
+            public Builder setRouteObjectiveFunction(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                routeObjectiveFunction_ = value;
+                bitField0_ |= 0x00008000;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string route_objective_function = 16;
+             * @return This builder for chaining.
+             */
+            public Builder clearRouteObjectiveFunction() {
+                routeObjectiveFunction_ = getDefaultInstance().getRouteObjectiveFunction();
+                bitField0_ = (bitField0_ & ~0x00008000);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string route_objective_function = 16;
+             * @param value The bytes for routeObjectiveFunction to set.
+             * @return This builder for chaining.
+             */
+            public Builder setRouteObjectiveFunctionBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                routeObjectiveFunction_ = value;
+                bitField0_ |= 0x00008000;
+                onChanged();
+                return this;
+            }
+
+            private java.lang.Object url_ = "";
+
+            /**
+             * string url = 17;
+             * @return The url.
+             */
+            public java.lang.String getUrl() {
+                java.lang.Object ref = url_;
+                if (!(ref instanceof java.lang.String)) {
+                    com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+                    java.lang.String s = bs.toStringUtf8();
+                    url_ = s;
+                    return s;
+                } else {
+                    return (java.lang.String) ref;
+                }
+            }
+
+            /**
+             * string url = 17;
+             * @return The bytes for url.
+             */
+            public com.google.protobuf.ByteString getUrlBytes() {
+                java.lang.Object ref = url_;
+                if (ref instanceof String) {
+                    com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+                    url_ = b;
+                    return b;
+                } else {
+                    return (com.google.protobuf.ByteString) ref;
+                }
+            }
+
+            /**
+             * string url = 17;
+             * @param value The url to set.
+             * @return This builder for chaining.
+             */
+            public Builder setUrl(java.lang.String value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                url_ = value;
+                bitField0_ |= 0x00010000;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string url = 17;
+             * @return This builder for chaining.
+             */
+            public Builder clearUrl() {
+                url_ = getDefaultInstance().getUrl();
+                bitField0_ = (bitField0_ & ~0x00010000);
+                onChanged();
+                return this;
+            }
+
+            /**
+             * string url = 17;
+             * @param value The bytes for url to set.
+             * @return This builder for chaining.
+             */
+            public Builder setUrlBytes(com.google.protobuf.ByteString value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                checkByteStringIsUtf8(value);
+                url_ = value;
+                bitField0_ |= 0x00010000;
+                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:tapi_lsp.TapiLspRuleSet)
+        }
+
+        // @@protoc_insertion_point(class_scope:tapi_lsp.TapiLspRuleSet)
+        private static final tapi_lsp.TapiLsp.TapiLspRuleSet DEFAULT_INSTANCE;
+
+        static {
+            DEFAULT_INSTANCE = new tapi_lsp.TapiLsp.TapiLspRuleSet();
+        }
+
+        public static tapi_lsp.TapiLsp.TapiLspRuleSet getDefaultInstance() {
+            return DEFAULT_INSTANCE;
+        }
+
+        private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+
+            @java.lang.Override
+            public TapiLspRuleSet parsePartialFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {
+                Builder builder = newBuilder();
+                try {
+                    builder.mergeFrom(input, extensionRegistry);
+                } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+                    throw e.setUnfinishedMessage(builder.buildPartial());
+                } catch (com.google.protobuf.UninitializedMessageException e) {
+                    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 tapi_lsp.TapiLsp.TapiLspRuleSet getDefaultInstanceForType() {
+            return DEFAULT_INSTANCE;
+        }
+    }
+
+    private static final com.google.protobuf.Descriptors.Descriptor internal_static_tapi_lsp_TapiLspRuleSet_descriptor;
+
+    private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_tapi_lsp_TapiLspRuleSet_fieldAccessorTable;
+
+    public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() {
+        return descriptor;
+    }
+
+    private static com.google.protobuf.Descriptors.FileDescriptor descriptor;
+
+    static {
+        java.lang.String[] descriptorData = { "\n\016tapi_lsp.proto\022\010tapi_lsp\"\220\003\n\016TapiLspRu" + "leSet\022\021\n\tinput_sip\030\001 \001(\t\022\022\n\noutput_sip\030\002" + " \001(\t\022\014\n\004uuid\030\003 \001(\t\022\n\n\002bw\030\004 \001(\t\022\023\n\013tenant" + "_uuid\030\005 \001(\t\022\033\n\023layer_protocol_name\030\006 \001(\t" + "\022 \n\030layer_protocol_qualifier\030\007 \001(\t\022\033\n\023lo" + "wer_frequency_mhz\030\010 \001(\t\022\033\n\023upper_frequen" + "cy_mhz\030\t \001(\t\022\026\n\016link_uuid_path\030\n \003(\t\022\023\n\013" + "granularity\030\013 \001(\t\022\021\n\tgrid_type\030\014 \001(\t\022\021\n\t" + "direction\030\r \001(\t\022\025\n\rcapacity_unit\030\016 \001(\t\022\026" + "\n\016capacity_value\030\017 \001(\t\022 \n\030route_objectiv" + "e_function\030\020 \001(\t\022\013\n\003url\030\021 \001(\tb\006proto3" };
+        descriptor = com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] {});
+        internal_static_tapi_lsp_TapiLspRuleSet_descriptor = getDescriptor().getMessageTypes().get(0);
+        internal_static_tapi_lsp_TapiLspRuleSet_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_tapi_lsp_TapiLspRuleSet_descriptor, new java.lang.String[] { "InputSip", "OutputSip", "Uuid", "Bw", "TenantUuid", "LayerProtocolName", "LayerProtocolQualifier", "LowerFrequencyMhz", "UpperFrequencyMhz", "LinkUuidPath", "Granularity", "GridType", "Direction", "CapacityUnit", "CapacityValue", "RouteObjectiveFunction", "Url" });
+    }
+    // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/src/ztp/target/kubernetes/kubernetes.yml b/src/ztp/target/kubernetes/kubernetes.yml
index 04c75050c..2d153068e 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: 905a409221c21205aba667ad34f7610681bd09c1
-    app.quarkus.io/build-timestamp: 2025-10-22 - 13:42:34 +0000
+    app.quarkus.io/commit-id: f6ca78538c88e1affff6dd8908e6f14379f5d9ac
+    app.quarkus.io/build-timestamp: 2025-10-27 - 16:23:04 +0000
     prometheus.io/scrape: "true"
     prometheus.io/path: /q/metrics
     prometheus.io/port: "8080"
@@ -17,10 +17,6 @@ metadata:
   name: ztpservice
 spec:
   ports:
-    - name: https
-      port: 443
-      protocol: TCP
-      targetPort: 8443
     - name: grpc
       port: 5050
       protocol: TCP
@@ -29,6 +25,10 @@ spec:
       port: 9192
       protocol: TCP
       targetPort: 8080
+    - name: https
+      port: 443
+      protocol: TCP
+      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: 905a409221c21205aba667ad34f7610681bd09c1
-    app.quarkus.io/build-timestamp: 2025-10-22 - 13:42:34 +0000
+    app.quarkus.io/commit-id: f6ca78538c88e1affff6dd8908e6f14379f5d9ac
+    app.quarkus.io/build-timestamp: 2025-10-27 - 16:23:04 +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: 905a409221c21205aba667ad34f7610681bd09c1
-        app.quarkus.io/build-timestamp: 2025-10-22 - 13:42:34 +0000
+        app.quarkus.io/commit-id: f6ca78538c88e1affff6dd8908e6f14379f5d9ac
+        app.quarkus.io/build-timestamp: 2025-10-27 - 16:23:04 +0000
         prometheus.io/scrape: "true"
         prometheus.io/path: /q/metrics
         prometheus.io/port: "8080"
@@ -75,10 +75,10 @@ spec:
               valueFrom:
                 fieldRef:
                   fieldPath: metadata.namespace
-            - name: DEVICE_SERVICE_HOST
-              value: deviceservice
             - name: CONTEXT_SERVICE_HOST
               value: contextservice
+            - name: DEVICE_SERVICE_HOST
+              value: deviceservice
           image: labs.etsi.org:5050/tfs/controller/ztp:0.2.0
           imagePullPolicy: Always
           livenessProbe:
@@ -93,15 +93,15 @@ spec:
             timeoutSeconds: 10
           name: ztpservice
           ports:
-            - containerPort: 8443
-              name: https
-              protocol: TCP
             - containerPort: 5050
               name: grpc
               protocol: TCP
             - containerPort: 8080
               name: http
               protocol: TCP
+            - containerPort: 8443
+              name: https
+              protocol: TCP
           readinessProbe:
             failureThreshold: 3
             httpGet:
-- 
GitLab


From 736d067d46861322884a46e425e65e695b254256 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Mon, 27 Oct 2025 16:31:56 +0000
Subject: [PATCH 025/111] Device component:

- Fix python dependencies
---
 src/device/Dockerfile | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/device/Dockerfile b/src/device/Dockerfile
index d85419128..e33f4e980 100644
--- a/src/device/Dockerfile
+++ b/src/device/Dockerfile
@@ -43,9 +43,9 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
     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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
-- 
GitLab


From f69f8fa1328e0b9266b475e22954828a9ad3abaa Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Mon, 27 Oct 2025 16:39:43 +0000
Subject: [PATCH 026/111] BGPLS Speaker Component:

- Corrected JRE dependency version
---
 src/bgpls_speaker/Dockerfile | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/bgpls_speaker/Dockerfile b/src/bgpls_speaker/Dockerfile
index a297ff910..1cf799a31 100644
--- a/src/bgpls_speaker/Dockerfile
+++ b/src/bgpls_speaker/Dockerfile
@@ -60,9 +60,9 @@ RUN python3 -m pip install --upgrade pip
 RUN python3 -m pip install --upgrade setuptools wheel
 RUN python3 -m pip install --upgrade pip-tools
 
-# Install OpenJDK-21
+# Install OpenJDK-17
 RUN apt-get update -y && \
-    apt-get install -y openjdk-21-jre && \
+    apt-get install -y openjdk-17-jre && \
     apt-get clean;
 
 # Get common Python packages
-- 
GitLab


From 599699c925a0da9132e8ed0aa077e747646ec25e Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Mon, 27 Oct 2025 16:52:34 +0000
Subject: [PATCH 027/111] Dockerfiles for images based on Python 3.9:

- Fixed versions of pip, setuptools, wheel, pip-tools, as there is an update on pip>25.2 forcing pep_517
---
 codex.sh                                                    | 5 +++++
 src/analytics/backend/Dockerfile                            | 6 +++---
 src/analytics/frontend/Dockerfile                           | 6 +++---
 src/automation/Dockerfile                                   | 6 +++---
 src/bgpls_speaker/Dockerfile                                | 6 +++---
 src/common/tools/rest_conf/server/Dockerfile                | 6 +++---
 src/dbscanserving/Dockerfile                                | 6 +++---
 src/dlt/connector/Dockerfile                                | 6 +++---
 src/dlt/mock_blockchain/Dockerfile                          | 6 +++---
 src/e2e_orchestrator/Dockerfile                             | 6 +++---
 src/forecaster/Dockerfile                                   | 6 +++---
 src/interdomain/Dockerfile                                  | 6 +++---
 src/kpi_manager/Dockerfile                                  | 6 +++---
 src/kpi_value_api/Dockerfile                                | 6 +++---
 src/kpi_value_writer/Dockerfile                             | 6 +++---
 src/l3_attackmitigator/Dockerfile                           | 6 +++---
 src/l3_centralizedattackdetector/Dockerfile                 | 6 +++---
 src/l3_distributedattackdetector/Dockerfile                 | 6 +++---
 src/load_generator/Dockerfile                               | 6 +++---
 src/monitoring/Dockerfile                                   | 6 +++---
 src/nbi/Dockerfile                                          | 6 +++---
 src/opticalattackdetector/Dockerfile                        | 6 +++---
 src/opticalattackmanager/Dockerfile                         | 6 +++---
 src/opticalattackmitigator/Dockerfile                       | 6 +++---
 src/opticalcontroller/Dockerfile                            | 6 +++---
 src/pathcomp/frontend/Dockerfile                            | 6 +++---
 src/qkd_app/Dockerfile                                      | 6 +++---
 src/qos_profile/Dockerfile                                  | 6 +++---
 src/simap_connector/Dockerfile                              | 6 +++---
 src/slice/Dockerfile                                        | 6 +++---
 src/telemetry/backend/Dockerfile                            | 6 +++---
 src/telemetry/frontend/Dockerfile                           | 6 +++---
 src/tests/ecoc22/Dockerfile                                 | 6 +++---
 src/tests/eucnc24/Dockerfile                                | 6 +++---
 src/tests/ofc22/Dockerfile                                  | 6 +++---
 src/tests/ofc24/Dockerfile                                  | 6 +++---
 src/tests/ofc25-camara-agg-net-controller/Dockerfile        | 6 +++---
 src/tests/ofc25-camara-e2e-controller/Dockerfile            | 6 +++---
 src/tests/ofc25/Dockerfile                                  | 6 +++---
 src/tests/qkd_end2end/Dockerfile                            | 6 +++---
 src/tests/ryu-openflow/Test.Dockerfile                      | 6 +++---
 src/tests/tools/mock_ietf_actn_sdn_ctrl/Dockerfile          | 6 +++---
 src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/Dockerfile         | 6 +++---
 src/tests/tools/mock_ietf_network_slice_sdn_ctrl/Dockerfile | 6 +++---
 src/tests/tools/mock_mw_sdn_ctrl/ssl_not_working/Dockerfile | 6 +++---
 src/tests/tools/mock_nce_ctrl/Dockerfile                    | 6 +++---
 src/tests/tools/mock_nce_fan_ctrl/Dockerfile                | 6 +++---
 src/tests/tools/mock_nce_t_ctrl/Dockerfile                  | 6 +++---
 src/tests/tools/mock_tfs_nbi_dependencies/Dockerfile        | 6 +++---
 src/tests/tools/simap_server/Dockerfile                     | 6 +++---
 src/tests/tools/traffic_changer/Dockerfile                  | 6 +++---
 src/vnt_manager/Dockerfile                                  | 6 +++---
 src/webui/Dockerfile                                        | 6 +++---
 src/ztp_server/Dockerfile                                   | 6 +++---
 54 files changed, 164 insertions(+), 159 deletions(-)
 create mode 100755 codex.sh

diff --git a/codex.sh b/codex.sh
new file mode 100755
index 000000000..d911ca9b5
--- /dev/null
+++ b/codex.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+export OPENAI_API_KEY="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"
+
+codex
diff --git a/src/analytics/backend/Dockerfile b/src/analytics/backend/Dockerfile
index 34e506f8e..316b70b6a 100644
--- a/src/analytics/backend/Dockerfile
+++ b/src/analytics/backend/Dockerfile
@@ -28,9 +28,9 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
     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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/analytics/frontend/Dockerfile b/src/analytics/frontend/Dockerfile
index a88fb3c5e..50edd0aae 100644
--- a/src/analytics/frontend/Dockerfile
+++ b/src/analytics/frontend/Dockerfile
@@ -28,9 +28,9 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
     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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/automation/Dockerfile b/src/automation/Dockerfile
index a8ebce336..03264745d 100644
--- a/src/automation/Dockerfile
+++ b/src/automation/Dockerfile
@@ -28,9 +28,9 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
     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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/bgpls_speaker/Dockerfile b/src/bgpls_speaker/Dockerfile
index 1cf799a31..316efca16 100644
--- a/src/bgpls_speaker/Dockerfile
+++ b/src/bgpls_speaker/Dockerfile
@@ -56,9 +56,9 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
     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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Install OpenJDK-17
 RUN apt-get update -y && \
diff --git a/src/common/tools/rest_conf/server/Dockerfile b/src/common/tools/rest_conf/server/Dockerfile
index 1dbe96c0a..6e87c0656 100644
--- a/src/common/tools/rest_conf/server/Dockerfile
+++ b/src/common/tools/rest_conf/server/Dockerfile
@@ -38,9 +38,9 @@ RUN ldconfig
 ENV PYTHONUNBUFFERED=0
 
 # 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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Create component sub-folders, get specific Python packages
 RUN mkdir -p /var/teraflow/restconf_server/
diff --git a/src/dbscanserving/Dockerfile b/src/dbscanserving/Dockerfile
index a7233cf65..87c6c6faf 100644
--- a/src/dbscanserving/Dockerfile
+++ b/src/dbscanserving/Dockerfile
@@ -28,9 +28,9 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
     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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/dlt/connector/Dockerfile b/src/dlt/connector/Dockerfile
index 53788da18..22d44a13d 100644
--- a/src/dlt/connector/Dockerfile
+++ b/src/dlt/connector/Dockerfile
@@ -28,9 +28,9 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
     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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/dlt/mock_blockchain/Dockerfile b/src/dlt/mock_blockchain/Dockerfile
index 14b63c9ab..92066f20b 100644
--- a/src/dlt/mock_blockchain/Dockerfile
+++ b/src/dlt/mock_blockchain/Dockerfile
@@ -28,9 +28,9 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
     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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/e2e_orchestrator/Dockerfile b/src/e2e_orchestrator/Dockerfile
index 483aebb79..ba3b57c3a 100644
--- a/src/e2e_orchestrator/Dockerfile
+++ b/src/e2e_orchestrator/Dockerfile
@@ -42,9 +42,9 @@ RUN python3 -m venv ${VIRTUAL_ENV}
 ENV PATH="${VIRTUAL_ENV}/bin:${PATH}"
 
 # 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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/forecaster/Dockerfile b/src/forecaster/Dockerfile
index f72ebaded..2cc6428f4 100644
--- a/src/forecaster/Dockerfile
+++ b/src/forecaster/Dockerfile
@@ -28,9 +28,9 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
     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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/interdomain/Dockerfile b/src/interdomain/Dockerfile
index ea99ce399..7e689bdd1 100644
--- a/src/interdomain/Dockerfile
+++ b/src/interdomain/Dockerfile
@@ -28,9 +28,9 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
     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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/kpi_manager/Dockerfile b/src/kpi_manager/Dockerfile
index 8bf1cedd6..3057534be 100644
--- a/src/kpi_manager/Dockerfile
+++ b/src/kpi_manager/Dockerfile
@@ -28,9 +28,9 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
     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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/kpi_value_api/Dockerfile b/src/kpi_value_api/Dockerfile
index 1386fcd49..c1bfb9ca7 100644
--- a/src/kpi_value_api/Dockerfile
+++ b/src/kpi_value_api/Dockerfile
@@ -28,9 +28,9 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
     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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/kpi_value_writer/Dockerfile b/src/kpi_value_writer/Dockerfile
index 9e6b4ff29..6f7f16a84 100644
--- a/src/kpi_value_writer/Dockerfile
+++ b/src/kpi_value_writer/Dockerfile
@@ -28,9 +28,9 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
     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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/l3_attackmitigator/Dockerfile b/src/l3_attackmitigator/Dockerfile
index 2c074d759..14002ada6 100644
--- a/src/l3_attackmitigator/Dockerfile
+++ b/src/l3_attackmitigator/Dockerfile
@@ -28,9 +28,9 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
     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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/l3_centralizedattackdetector/Dockerfile b/src/l3_centralizedattackdetector/Dockerfile
index a409449e3..acaa28b3d 100644
--- a/src/l3_centralizedattackdetector/Dockerfile
+++ b/src/l3_centralizedattackdetector/Dockerfile
@@ -28,9 +28,9 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
     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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/l3_distributedattackdetector/Dockerfile b/src/l3_distributedattackdetector/Dockerfile
index c41fbc869..64f862b8b 100644
--- a/src/l3_distributedattackdetector/Dockerfile
+++ b/src/l3_distributedattackdetector/Dockerfile
@@ -28,9 +28,9 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
     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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/load_generator/Dockerfile b/src/load_generator/Dockerfile
index ca70a3697..54d5d3c0e 100644
--- a/src/load_generator/Dockerfile
+++ b/src/load_generator/Dockerfile
@@ -28,9 +28,9 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
     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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/monitoring/Dockerfile b/src/monitoring/Dockerfile
index 9ed58954f..1689986b1 100644
--- a/src/monitoring/Dockerfile
+++ b/src/monitoring/Dockerfile
@@ -28,9 +28,9 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
     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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/nbi/Dockerfile b/src/nbi/Dockerfile
index e34aaa36d..1a08ddbe1 100644
--- a/src/nbi/Dockerfile
+++ b/src/nbi/Dockerfile
@@ -38,9 +38,9 @@ RUN ldconfig
 ENV PYTHONUNBUFFERED=0
 
 # 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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/opticalattackdetector/Dockerfile b/src/opticalattackdetector/Dockerfile
index 6af8457d6..dbd22ead2 100644
--- a/src/opticalattackdetector/Dockerfile
+++ b/src/opticalattackdetector/Dockerfile
@@ -42,9 +42,9 @@ RUN python3 -m venv ${VIRTUAL_ENV}
 ENV PATH="${VIRTUAL_ENV}/bin:${PATH}"
 
 # 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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/opticalattackmanager/Dockerfile b/src/opticalattackmanager/Dockerfile
index a9de40c48..7df184488 100644
--- a/src/opticalattackmanager/Dockerfile
+++ b/src/opticalattackmanager/Dockerfile
@@ -42,9 +42,9 @@ RUN python3 -m venv ${VIRTUAL_ENV}
 ENV PATH="${VIRTUAL_ENV}/bin:${PATH}"
 
 # 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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/opticalattackmitigator/Dockerfile b/src/opticalattackmitigator/Dockerfile
index 0cb66dfb0..997a363d5 100644
--- a/src/opticalattackmitigator/Dockerfile
+++ b/src/opticalattackmitigator/Dockerfile
@@ -41,9 +41,9 @@ RUN python3 -m venv ${VIRTUAL_ENV}
 ENV PATH="${VIRTUAL_ENV}/bin:${PATH}"
 
 # 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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/opticalcontroller/Dockerfile b/src/opticalcontroller/Dockerfile
index 7d5d87aa6..3459a9d2d 100644
--- a/src/opticalcontroller/Dockerfile
+++ b/src/opticalcontroller/Dockerfile
@@ -28,9 +28,9 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
     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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/pathcomp/frontend/Dockerfile b/src/pathcomp/frontend/Dockerfile
index 2f6d5a3bd..e7938768b 100644
--- a/src/pathcomp/frontend/Dockerfile
+++ b/src/pathcomp/frontend/Dockerfile
@@ -28,9 +28,9 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
     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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/qkd_app/Dockerfile b/src/qkd_app/Dockerfile
index e175fce7e..b66fe482d 100644
--- a/src/qkd_app/Dockerfile
+++ b/src/qkd_app/Dockerfile
@@ -28,9 +28,9 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
     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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/qos_profile/Dockerfile b/src/qos_profile/Dockerfile
index 3f51eaa8d..eceaaa848 100644
--- a/src/qos_profile/Dockerfile
+++ b/src/qos_profile/Dockerfile
@@ -28,9 +28,9 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
     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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/simap_connector/Dockerfile b/src/simap_connector/Dockerfile
index 35dd3abfb..f9f1da660 100644
--- a/src/simap_connector/Dockerfile
+++ b/src/simap_connector/Dockerfile
@@ -18,9 +18,9 @@ FROM python:3.9-slim
 ENV PYTHONUNBUFFERED=0
 
 # 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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/slice/Dockerfile b/src/slice/Dockerfile
index 2d4144468..54fcc06e2 100644
--- a/src/slice/Dockerfile
+++ b/src/slice/Dockerfile
@@ -28,9 +28,9 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
     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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/telemetry/backend/Dockerfile b/src/telemetry/backend/Dockerfile
index ac7f6ccd1..d595eed94 100644
--- a/src/telemetry/backend/Dockerfile
+++ b/src/telemetry/backend/Dockerfile
@@ -43,9 +43,9 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
     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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 RUN python3 -m pip install --upgrade scapy
 
 # Get common Python packages
diff --git a/src/telemetry/frontend/Dockerfile b/src/telemetry/frontend/Dockerfile
index dc90b7d16..b758a3f6c 100644
--- a/src/telemetry/frontend/Dockerfile
+++ b/src/telemetry/frontend/Dockerfile
@@ -28,9 +28,9 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
     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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/tests/ecoc22/Dockerfile b/src/tests/ecoc22/Dockerfile
index 3a7f9155b..57a39950c 100644
--- a/src/tests/ecoc22/Dockerfile
+++ b/src/tests/ecoc22/Dockerfile
@@ -28,9 +28,9 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
     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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/tests/eucnc24/Dockerfile b/src/tests/eucnc24/Dockerfile
index 9e1ab4d0a..cde6358c7 100644
--- a/src/tests/eucnc24/Dockerfile
+++ b/src/tests/eucnc24/Dockerfile
@@ -23,9 +23,9 @@ RUN apt-get --yes --quiet --quiet update && \
 ENV PYTHONUNBUFFERED=0
 
 # 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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/tests/ofc22/Dockerfile b/src/tests/ofc22/Dockerfile
index 07b18df0f..5fbf12922 100644
--- a/src/tests/ofc22/Dockerfile
+++ b/src/tests/ofc22/Dockerfile
@@ -28,9 +28,9 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
     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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/tests/ofc24/Dockerfile b/src/tests/ofc24/Dockerfile
index 67dbf52ca..ceb872e2a 100644
--- a/src/tests/ofc24/Dockerfile
+++ b/src/tests/ofc24/Dockerfile
@@ -28,9 +28,9 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
     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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/tests/ofc25-camara-agg-net-controller/Dockerfile b/src/tests/ofc25-camara-agg-net-controller/Dockerfile
index d6aedac80..ccab9299e 100644
--- a/src/tests/ofc25-camara-agg-net-controller/Dockerfile
+++ b/src/tests/ofc25-camara-agg-net-controller/Dockerfile
@@ -23,9 +23,9 @@ RUN apt-get --yes --quiet --quiet update && \
 ENV PYTHONUNBUFFERED=0
 
 # 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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/tests/ofc25-camara-e2e-controller/Dockerfile b/src/tests/ofc25-camara-e2e-controller/Dockerfile
index cdd1b16d1..bfb557dcc 100644
--- a/src/tests/ofc25-camara-e2e-controller/Dockerfile
+++ b/src/tests/ofc25-camara-e2e-controller/Dockerfile
@@ -23,9 +23,9 @@ RUN apt-get --yes --quiet --quiet update && \
 ENV PYTHONUNBUFFERED=0
 
 # 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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/tests/ofc25/Dockerfile b/src/tests/ofc25/Dockerfile
index a887e7e27..a93d1d2d8 100644
--- a/src/tests/ofc25/Dockerfile
+++ b/src/tests/ofc25/Dockerfile
@@ -23,9 +23,9 @@ RUN apt-get --yes --quiet --quiet update && \
 ENV PYTHONUNBUFFERED=0
 
 # 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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0's==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/tests/qkd_end2end/Dockerfile b/src/tests/qkd_end2end/Dockerfile
index 4486522b6..89b0a2fd1 100644
--- a/src/tests/qkd_end2end/Dockerfile
+++ b/src/tests/qkd_end2end/Dockerfile
@@ -23,9 +23,9 @@ RUN apt-get --yes --quiet --quiet update && \
 ENV PYTHONUNBUFFERED=0
 
 # 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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/tests/ryu-openflow/Test.Dockerfile b/src/tests/ryu-openflow/Test.Dockerfile
index 3564e3f2d..ea3d4bec3 100644
--- a/src/tests/ryu-openflow/Test.Dockerfile
+++ b/src/tests/ryu-openflow/Test.Dockerfile
@@ -23,9 +23,9 @@ RUN apt-get --yes --quiet --quiet update && \
 ENV PYTHONUNBUFFERED=0
 
 # 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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/tests/tools/mock_ietf_actn_sdn_ctrl/Dockerfile b/src/tests/tools/mock_ietf_actn_sdn_ctrl/Dockerfile
index d16762b16..1d4c3db08 100644
--- a/src/tests/tools/mock_ietf_actn_sdn_ctrl/Dockerfile
+++ b/src/tests/tools/mock_ietf_actn_sdn_ctrl/Dockerfile
@@ -18,9 +18,9 @@ FROM python:3.9-slim
 ENV PYTHONUNBUFFERED=0
 
 # 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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Create component sub-folders, and copy content
 RUN mkdir -p /var/teraflow/mock_ietf_actn_sdn_ctrl
diff --git a/src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/Dockerfile b/src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/Dockerfile
index b2ac55af4..e80d87145 100644
--- a/src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/Dockerfile
+++ b/src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/Dockerfile
@@ -18,9 +18,9 @@ FROM python:3.9-slim
 ENV PYTHONUNBUFFERED=0
 
 # 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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Create component sub-folders, and copy content
 RUN mkdir -p /var/teraflow/mock_ietf_l3vpn_sdn_ctrl
diff --git a/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/Dockerfile b/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/Dockerfile
index a624152de..44f2488f1 100644
--- a/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/Dockerfile
+++ b/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/Dockerfile
@@ -18,9 +18,9 @@ FROM python:3.9-slim
 ENV PYTHONUNBUFFERED=0
 
 # 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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Create component sub-folders, and copy content
 RUN mkdir -p /var/teraflow/mock_ietf_network_slice_sdn_ctrl
diff --git a/src/tests/tools/mock_mw_sdn_ctrl/ssl_not_working/Dockerfile b/src/tests/tools/mock_mw_sdn_ctrl/ssl_not_working/Dockerfile
index d428a28c4..dd45a16d9 100644
--- a/src/tests/tools/mock_mw_sdn_ctrl/ssl_not_working/Dockerfile
+++ b/src/tests/tools/mock_mw_sdn_ctrl/ssl_not_working/Dockerfile
@@ -18,9 +18,9 @@ FROM python:3.9-slim
 ENV PYTHONUNBUFFERED=0
 
 # 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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Create component sub-folders, and copy content
 RUN mkdir -p /var/teraflow/mock_mw_sdn_ctrl
diff --git a/src/tests/tools/mock_nce_ctrl/Dockerfile b/src/tests/tools/mock_nce_ctrl/Dockerfile
index 579bab536..8fe63387f 100644
--- a/src/tests/tools/mock_nce_ctrl/Dockerfile
+++ b/src/tests/tools/mock_nce_ctrl/Dockerfile
@@ -18,9 +18,9 @@ FROM python:3.9-slim
 ENV PYTHONUNBUFFERED=0
 
 # 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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Create component sub-folders, and copy content
 RUN mkdir -p /var/teraflow/mock_nce_ctrl
diff --git a/src/tests/tools/mock_nce_fan_ctrl/Dockerfile b/src/tests/tools/mock_nce_fan_ctrl/Dockerfile
index cf4dfd9ad..c16e884f5 100644
--- a/src/tests/tools/mock_nce_fan_ctrl/Dockerfile
+++ b/src/tests/tools/mock_nce_fan_ctrl/Dockerfile
@@ -39,9 +39,9 @@ RUN ldconfig
 ENV PYTHONUNBUFFERED=0
 
 # 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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get specific Python packages
 RUN mkdir -p /var/teraflow/
diff --git a/src/tests/tools/mock_nce_t_ctrl/Dockerfile b/src/tests/tools/mock_nce_t_ctrl/Dockerfile
index 60f7a7b06..84af03eef 100644
--- a/src/tests/tools/mock_nce_t_ctrl/Dockerfile
+++ b/src/tests/tools/mock_nce_t_ctrl/Dockerfile
@@ -38,9 +38,9 @@ RUN ldconfig
 ENV PYTHONUNBUFFERED=0
 
 # 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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get specific Python packages
 RUN mkdir -p /var/teraflow/
diff --git a/src/tests/tools/mock_tfs_nbi_dependencies/Dockerfile b/src/tests/tools/mock_tfs_nbi_dependencies/Dockerfile
index c041b8806..5fdfd99a6 100644
--- a/src/tests/tools/mock_tfs_nbi_dependencies/Dockerfile
+++ b/src/tests/tools/mock_tfs_nbi_dependencies/Dockerfile
@@ -28,9 +28,9 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
     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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/tests/tools/simap_server/Dockerfile b/src/tests/tools/simap_server/Dockerfile
index f47de61a8..c6bb56f43 100644
--- a/src/tests/tools/simap_server/Dockerfile
+++ b/src/tests/tools/simap_server/Dockerfile
@@ -38,9 +38,9 @@ RUN ldconfig
 ENV PYTHONUNBUFFERED=0
 
 # 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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Create component sub-folders, get specific Python packages
 RUN mkdir -p /var/teraflow/simap_server/
diff --git a/src/tests/tools/traffic_changer/Dockerfile b/src/tests/tools/traffic_changer/Dockerfile
index 9b590eb5e..268a06684 100644
--- a/src/tests/tools/traffic_changer/Dockerfile
+++ b/src/tests/tools/traffic_changer/Dockerfile
@@ -24,9 +24,9 @@ FROM python:3.9-slim
 ENV PYTHONUNBUFFERED=0
 
 # 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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get specific Python packages
 RUN mkdir -p /var/teraflow/
diff --git a/src/vnt_manager/Dockerfile b/src/vnt_manager/Dockerfile
index 13368dc9f..4d85495b7 100644
--- a/src/vnt_manager/Dockerfile
+++ b/src/vnt_manager/Dockerfile
@@ -42,9 +42,9 @@ RUN python3 -m venv ${VIRTUAL_ENV}
 ENV PATH="${VIRTUAL_ENV}/bin:${PATH}"
 
 # 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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/webui/Dockerfile b/src/webui/Dockerfile
index 167280d68..a386c46a1 100644
--- a/src/webui/Dockerfile
+++ b/src/webui/Dockerfile
@@ -44,9 +44,9 @@ RUN python3 -m venv ${VIRTUAL_ENV}
 ENV PATH="${VIRTUAL_ENV}/bin:${PATH}"
 
 # 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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/ztp_server/Dockerfile b/src/ztp_server/Dockerfile
index bd0dcf465..1bc93f786 100755
--- a/src/ztp_server/Dockerfile
+++ b/src/ztp_server/Dockerfile
@@ -28,9 +28,9 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
     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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
-- 
GitLab


From 8c9fd6d60ba536a0237c3b8bc78236b61289be52 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Mon, 27 Oct 2025 18:08:43 +0000
Subject: [PATCH 028/111] Refactor DSCM REST API to integrate Pluggables
 service

- Updated routes.py to implement GET, POST, and DELETE methods for managing pluggables.
- Introduced JSON to Proto conversion functions for creating and configuring pluggables.
- Enhanced error handling and logging for pluggable operations.
- Created new test cases for POST, GET, and DELETE operations on pluggables.
- Added mock web server setup for testing DSCM REST API.
- Implemented unit tests for JSON to Proto conversion functions.
- Added example payloads for hub and leaf configurations in test cases.
---
 scripts/run_tests_locally-nbi-dscm.sh         |  42 +-
 .../nbi_plugins/dscm_oc/__init__.py           |   6 +-
 .../rest_server/nbi_plugins/dscm_oc/error.py  |   4 +
 .../dscm_oc/json_to_proto_conversion.py       | 239 ++++++++++++
 .../rest_server/nbi_plugins/dscm_oc/routes.py | 192 +++++----
 src/nbi/tests/DSCM_MockWebServer.py           | 119 +++---
 src/nbi/tests/messages/dscm_messages.py       |  60 +++
 src/nbi/tests/test_dscm_restconf.py           | 367 +++++-------------
 src/nbi/tests/test_json_to_proto.py           | 178 +++++++++
 9 files changed, 830 insertions(+), 377 deletions(-)
 create mode 100644 src/nbi/service/rest_server/nbi_plugins/dscm_oc/json_to_proto_conversion.py
 create mode 100644 src/nbi/tests/messages/dscm_messages.py
 create mode 100644 src/nbi/tests/test_json_to_proto.py

diff --git a/scripts/run_tests_locally-nbi-dscm.sh b/scripts/run_tests_locally-nbi-dscm.sh
index 634939cfd..c43f2f171 100755
--- a/scripts/run_tests_locally-nbi-dscm.sh
+++ b/scripts/run_tests_locally-nbi-dscm.sh
@@ -1,8 +1,46 @@
 
 
+#!/bin/bash
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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`
 
+# Activate the dscm virtual environment
+source /home/ubuntu/dscm/bin/activate
+
 cd $PROJECTDIR/src
 
-python3 -m pytest --log-level=INFO --log-cli-level=INFO --verbose \
-    nbi/tests/test_dscm_restconf.py::test_patch_optical_channel_frequency
+echo "======================================"
+echo "Running NBI DSCM RESTCONF Tests"
+echo "======================================"
+
+# test DSCM NBI functions
+/home/ubuntu/dscm/bin/python -m pytest --log-level=INFO --log-cli-level=INFO --verbose \
+    nbi/tests/test_dscm_restconf.py::test_post_get_delete_leaf_optical_channel_frequency
+    # nbi/tests/test_dscm_restconf.py::test_post_hub_optical_channel_frequency \
+
+# # test JSON to Proto conversion functions
+# /home/ubuntu/dscm/bin/python -m pytest --log-level=INFO --log-cli-level=INFO --verbose \
+#     nbi/tests/test_json_to_proto.py::test_create_pluggable_request_hub_format \
+#     nbi/tests/test_json_to_proto.py::test_create_pluggable_request_leaf_format \
+#     nbi/tests/test_json_to_proto.py::test_configure_pluggable_request_hub_format \
+#     nbi/tests/test_json_to_proto.py::test_configure_pluggable_request_leaf_format \
+#     nbi/tests/test_json_to_proto.py::test_empty_payload
+
+
+echo ""
+echo "======================================"
+echo "Test execution completed"
+echo "======================================"
diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/__init__.py b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/__init__.py
index e72bb3f0f..1b8b4e36e 100644
--- a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/__init__.py
+++ b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/__init__.py
@@ -14,9 +14,9 @@
 
 
 from .routes import blueprint
-from nbi.service.rest_server.RestServer import RestServer
+from nbi.service.NbiApplication import NbiApplication
 
 # NBI service calls this in main.py file to register blueprints.
-def register_dscm_oc(rest_server : RestServer):
-    nbi_flask_app = rest_server.app
+def register_dscm_oc(nbi_application : NbiApplication):
+    nbi_flask_app = nbi_application.get_flask_app()
     nbi_flask_app.register_blueprint(blueprint, url_prefix='/restconf/data')
diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/error.py b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/error.py
index d438a854f..3b1873e8b 100644
--- a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/error.py
+++ b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/error.py
@@ -29,3 +29,7 @@ def yang_error(err_dict, status=400):
 def _bad_request(msg, path=None):
     return yang_error({"error-type": "protocol", "error-tag": "operation-failed",
                        "error-message": msg, **({"error-path": path} if path else {})}, status=400)
+
+def _not_found(msg, path=None):
+    return yang_error({"error-type": "application", "error-tag": "data-missing",
+                       "error-message": msg, **({"error-path": path} if path else {})}, status=404)
diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/json_to_proto_conversion.py b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/json_to_proto_conversion.py
new file mode 100644
index 000000000..28d8e508e
--- /dev/null
+++ b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/json_to_proto_conversion.py
@@ -0,0 +1,239 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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.
+
+"""
+Helper functions to convert JSON payload from RESTCONF to Pluggables proto messages.
+"""
+
+from typing import Dict, Any
+from common.proto import pluggables_pb2                                                                                   # pyright: ignore[reportAttributeAccessIssue]
+
+
+def json_to_get_pluggable_request(
+    device_uuid: str,
+    pluggable_index: int = -1,
+    view_level: pluggables_pb2.View = pluggables_pb2.VIEW_FULL                                                            # pyright: ignore[reportInvalidTypeForm]
+) -> pluggables_pb2.GetPluggableRequest:                                                                                  # pyright: ignore[reportInvalidTypeForm]
+    """
+    Create a GetPluggableRequest proto message.
+    Args:
+        device_uuid: UUID of the device
+        pluggable_index: Index of the pluggable
+        view_level: View level (VIEW_CONFIG, VIEW_STATE, VIEW_FULL, VIEW_UNSPECIFIED)
+    Returns:
+        GetPluggableRequest proto message
+    """
+    request = pluggables_pb2.GetPluggableRequest()
+    request.id.device.device_uuid.uuid = device_uuid                                                                      # type: ignore[attr-defined]
+    request.id.pluggable_index         = pluggable_index                                                                  # type: ignore[attr-defined]
+    request.view_level                 = view_level                                                                       # type: ignore[attr-defined]
+    return request
+
+
+def json_to_list_pluggables_request(
+    device_uuid: str,
+    view_level: pluggables_pb2.View = pluggables_pb2.VIEW_FULL                                                            # pyright: ignore[reportInvalidTypeForm]
+) -> pluggables_pb2.ListPluggablesRequest:                                                                                # pyright: ignore[reportInvalidTypeForm]
+    """
+    Create a ListPluggablesRequest proto message.
+    Args:
+        device_uuid: UUID of the device to filter by
+        view_level: View level (VIEW_CONFIG, VIEW_STATE, VIEW_FULL, VIEW_UNSPECIFIED)
+    Returns:
+        ListPluggablesRequest proto message
+    """
+    request = pluggables_pb2.ListPluggablesRequest()
+    request.device.device_uuid.uuid = device_uuid                                                                         # type: ignore[attr-defined]
+    request.view_level              = view_level                                                                          # type: ignore[attr-defined]
+    return request
+
+
+def json_to_delete_pluggable_request(
+    device_uuid: str,
+    pluggable_index: int = -1
+) -> pluggables_pb2.DeletePluggableRequest:                                                                               # pyright: ignore[reportInvalidTypeForm]
+    """
+    Create a DeletePluggableRequest proto message.
+    Args:
+        device_uuid: UUID of the device
+        pluggable_index: Index of the pluggable
+    Returns:
+        DeletePluggableRequest proto message
+    """
+    request = pluggables_pb2.DeletePluggableRequest()
+    request.id.device.device_uuid.uuid = device_uuid                                                                      # type: ignore[attr-defined]
+    request.id.pluggable_index         = pluggable_index                                                                  # type: ignore[attr-defined]
+    return request
+
+
+def json_to_create_pluggable_request(
+    device_uuid: str,
+    initial_config: Dict[str, Any],
+    preferred_pluggable_index: int = -1
+) -> pluggables_pb2.CreatePluggableRequest:                                                                               # pyright: ignore[reportInvalidTypeForm]
+    """
+    Convert JSON initial_config to CreatePluggableRequest proto message.
+    Args:
+        device_uuid: UUID of the device
+        initial_config: JSON initial_config from RESTCONF request
+        preferred_pluggable_index: Preferred pluggable slot index (-1 for auto)
+    Returns:
+        CreatePluggableRequest proto message
+    """
+    request = pluggables_pb2.CreatePluggableRequest()
+    request.device.device_uuid.uuid   = device_uuid                                                                       # type: ignore[attr-defined]
+    request.preferred_pluggable_index = preferred_pluggable_index                                                         # type: ignore[attr-defined]
+    
+    # If initial_config contains configuration, add it as initial_config
+    if initial_config:
+        request.initial_config.id.device.device_uuid.uuid = device_uuid                                                   # type: ignore[attr-defined]
+        request.initial_config.id.pluggable_index         = preferred_pluggable_index                                     # type: ignore[attr-defined]
+        
+        if "digital_subcarriers_groups" in initial_config:    # (HUB format)
+            _add_dsc_groups_from_hub_format(
+                request.initial_config, device_uuid, preferred_pluggable_index, initial_config)                           # type: ignore[attr-defined]
+        elif "channels" in initial_config:                    # (LEAF format)
+            _add_dsc_groups_from_leaf_format(
+                request.initial_config, device_uuid, preferred_pluggable_index, initial_config)                           # type: ignore[attr-defined]
+    return request
+
+
+def json_to_configure_pluggable_request(
+    device_uuid: str,
+    payload: Dict[str, Any],
+    pluggable_index: int = -1,
+    view_level: pluggables_pb2.View = pluggables_pb2.VIEW_FULL,                                                           # pyright: ignore[reportInvalidTypeForm]
+    apply_timeout_seconds: int = 30
+) -> pluggables_pb2.ConfigurePluggableRequest:                                                                            # pyright: ignore[reportInvalidTypeForm]
+    """
+    Convert JSON payload to ConfigurePluggableRequest proto message.
+    Args:
+        device_uuid: UUID of the device
+        pluggable_index: Index of the pluggable to configure
+        payload: JSON payload from RESTCONF request
+        view_level: View level for response
+        apply_timeout_seconds: Timeout in seconds for applying configuration
+    Returns:
+        ConfigurePluggableRequest proto message
+    """
+    request = pluggables_pb2.ConfigurePluggableRequest()
+    request.config.id.device.device_uuid.uuid = device_uuid                                                               # type: ignore[attr-defined]
+    request.config.id.pluggable_index         = pluggable_index                                                           # type: ignore[attr-defined]
+    request.view_level                        = view_level                                                                # type: ignore[attr-defined]
+    request.apply_timeout_seconds             = apply_timeout_seconds                                                     # type: ignore[attr-defined]
+    
+    if "digital_subcarriers_groups" in payload:     # (HUB format)
+        _add_dsc_groups_from_hub_format(
+            request.config, device_uuid, pluggable_index, payload)                                                        # type: ignore[attr-defined]
+    elif "channels" in payload:                     # (LEAF format)
+        _add_dsc_groups_from_leaf_format(
+            request.config, device_uuid, pluggable_index, payload)                                                        # type: ignore[attr-defined]
+    return request
+
+
+def _add_dsc_groups_from_hub_format(
+    config: pluggables_pb2.DigitalSubcarrierGroupConfig,                                                                  # pyright: ignore[reportInvalidTypeForm]
+    device_uuid: str,
+    pluggable_index: int,
+    payload: Dict[str, Any]
+) -> None:
+    """
+    Add DSC groups from HUB format JSON payload.
+    """
+    dsc_groups = payload.get("digital_subcarriers_groups", [])
+    
+    for group_data in dsc_groups:
+        group_id = group_data.get("group_id", 0)
+        
+        dsc_group = config.dsc_groups.add()                                                                               # type: ignore[attr-defined]
+        dsc_group.id.pluggable.device.device_uuid.uuid = device_uuid                                                      # type: ignore[attr-defined]
+        dsc_group.id.pluggable.pluggable_index         = pluggable_index                                                  # type: ignore[attr-defined]
+        dsc_group.id.group_index                       = group_id                                                         # type: ignore[attr-defined]
+        
+        # Set group parameters from payload
+        # For HUB, these are at the top level
+        dsc_group.group_capacity_gbps     = 400.0                                                                         # type: ignore[attr-defined]  # Default
+        dsc_group.subcarrier_spacing_mhz  = 75.0                                                                          # type: ignore[attr-defined]  # Default
+        
+        # Process digital subcarriers
+        subcarrier_list       = group_data.get("digital-subcarrier-id", [])
+        dsc_group.group_size  = len(subcarrier_list)                                                                      # type: ignore[attr-defined]
+        
+        for subcarrier_data in subcarrier_list:
+            subcarrier_id = subcarrier_data.get("subcarrier-id", 0)
+            is_active = subcarrier_data.get("active", False)
+            
+            subcarrier = dsc_group.subcarriers.add()                                                                      # type: ignore[attr-defined]
+            subcarrier.id.group.pluggable.device.device_uuid.uuid = device_uuid                                           # type: ignore[attr-defined]
+            subcarrier.id.group.pluggable.pluggable_index         = pluggable_index                                       # type: ignore[attr-defined]
+            subcarrier.id.group.group_index                       = group_id                                              # type: ignore[attr-defined]
+            subcarrier.id.subcarrier_index                        = subcarrier_id                                         # type: ignore[attr-defined]
+            subcarrier.active                                     = is_active                                             # type: ignore[attr-defined]
+            
+            # Set frequency and power from top-level payload
+            if "frequency" in payload:
+                subcarrier.center_frequency_hz = float(payload["frequency"]) * 1e6                                        # type: ignore[attr-defined]
+            
+            if "target_output_power" in payload:
+                subcarrier.target_output_power_dbm = float(payload["target_output_power"])                                # type: ignore[attr-defined]
+            
+            # Default symbol rate
+            subcarrier.symbol_rate_baud = 64000000000                                                                     # type: ignore[attr-defined]
+
+
+def _add_dsc_groups_from_leaf_format(
+    config: pluggables_pb2.DigitalSubcarrierGroupConfig,                                                                 # pyright: ignore[reportInvalidTypeForm]
+    device_uuid: str,
+    pluggable_index: int,
+    payload: Dict[str, Any]
+) -> None:
+    """
+    Add DSC groups from LEAF format JSON payload.
+    """
+    channels = payload.get("channels", [])
+    
+    for channel_idx, channel_data in enumerate(channels):
+        dsc_groups = channel_data.get("digital_subcarriers_groups", [])
+        
+        for group_data in dsc_groups:
+            group_id = group_data.get("group_id", channel_idx)
+            
+            # Create DSC group (protobuf repeated field operations)
+            dsc_group = config.dsc_groups.add()                                                                           # type: ignore[attr-defined]
+            dsc_group.id.pluggable.device.device_uuid.uuid = device_uuid                                                  # type: ignore[attr-defined]
+            dsc_group.id.pluggable.pluggable_index         = pluggable_index                                              # type: ignore[attr-defined]
+            dsc_group.id.group_index                       = group_id                                                     # type: ignore[attr-defined]
+            
+            # Set group parameters
+            dsc_group.group_capacity_gbps     = 400.0                                                                     # type: ignore[attr-defined]  # Default
+            dsc_group.subcarrier_spacing_mhz  = 75.0                                                                      # type: ignore[attr-defined]  # Default
+            dsc_group.group_size              = 1                                                                         # type: ignore[attr-defined]  # Default for LEAF
+            
+            # Create a single subcarrier for this channel
+            subcarrier = dsc_group.subcarriers.add()                                                                      # type: ignore[attr-defined]
+            subcarrier.id.group.pluggable.device.device_uuid.uuid = device_uuid                                           # type: ignore[attr-defined]
+            subcarrier.id.group.pluggable.pluggable_index         = pluggable_index                                       # type: ignore[attr-defined]
+            subcarrier.id.group.group_index                       = group_id                                              # type: ignore[attr-defined]
+            subcarrier.id.subcarrier_index                        = 0                                                     # type: ignore[attr-defined]
+            subcarrier.active                                     = True                                                  # type: ignore[attr-defined]  # Default for LEAF channels
+            
+            # Set frequency and power from channel data
+            if "frequency" in channel_data:
+                subcarrier.center_frequency_hz = float(channel_data["frequency"]) * 1e6                                   # type: ignore[attr-defined]  # MHz to Hz
+            
+            if "target_output_power" in channel_data:
+                subcarrier.target_output_power_dbm = float(channel_data["target_output_power"])                           # type: ignore[attr-defined]
+            
+            # Default symbol rate
+            subcarrier.symbol_rate_baud = 64000000000                                                                     # type: ignore[attr-defined]  # 64 GBaud
diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/routes.py b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/routes.py
index cd3a600ca..328ba0a8b 100644
--- a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/routes.py
+++ b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/routes.py
@@ -12,13 +12,26 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from flask import Blueprint, request, Response, abort
 import logging
-from .datastore import Store
-from .path_resolver import RestconfPath
-from .enforce_header import require_accept, require_content_type
-from .error import _bad_request, yang_json
-from .dscm import DscmPlugin
+from .datastore                                import Store
+from .enforce_header                           import require_accept, require_content_type
+from .error                                    import _bad_request, _not_found, yang_json
+from .json_to_proto_conversion                 import (
+    json_to_create_pluggable_request,
+    json_to_delete_pluggable_request,
+    json_to_get_pluggable_request,
+    json_to_list_pluggables_request,
+)
+from common.method_wrappers.ServiceExceptions  import (
+    ServiceException,
+    NotFoundException,
+    AlreadyExistsException,
+    InvalidArgumentException
+)
+from common.tools.grpc.Tools                   import grpc_message_to_json
+from flask                                     import Blueprint, request, Response, abort
+from pluggables.client.PluggablesClient        import PluggablesClient
+
 
 LOGGER = logging.getLogger(__name__)
 logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
@@ -47,7 +60,7 @@ def get_device_store(device_uuid=None):
         return Store(device_file)
     return store
 
-# Root endpoints (both prefixes)
+# Root endpoints (both prefixes) TODO: call list pluggables if device_uuid is given
 @blueprint.route("/device=/", methods=["GET"])
 @blueprint.route("/", methods=["GET"], defaults={'device_uuid': None})
 @require_accept([YANG_JSON])
@@ -61,67 +74,126 @@ def list_root(device_uuid=None):
 @require_accept([YANG_JSON])
 def rc_get(rc_path, device_uuid=None):
     LOGGER.info(f"GET request for path: {rc_path} on device UUID: {device_uuid}")
+    
+    if device_uuid is None:
+        return _bad_request("Device UUID must be specified for GET requests.", path=rc_path)
+    pluggables_client = PluggablesClient()
+
     try:
-        device_store = get_device_store(device_uuid)
-        p = RestconfPath(rc_path)
-        val = device_store.get(p.json_pointer())
-        if val is None:
-            abort(404)
-        return yang_json(val)
-    except KeyError:
-        abort(404)
+        get_request = json_to_get_pluggable_request(device_uuid)
+        pluggable = pluggables_client.GetPluggable(get_request)
+        LOGGER.info(f"Successfully retrieved pluggable for device {device_uuid}")
+        response_data = grpc_message_to_json(pluggable)
+        return yang_json(response_data)
+    
+    except NotFoundException as e:
+        LOGGER.warning(f"Pluggable not found for device {device_uuid}: {e.details}")
+        return _not_found(f"Pluggable not found: {e.details}", path=rc_path)
+    
     except Exception as e:
-        from werkzeug.exceptions import HTTPException
-        if isinstance(e, HTTPException):
-            raise e
-        return _bad_request(f"Internal error: {str(e)}", path=rc_path)
+        LOGGER.error(f"Unexpected error getting pluggable for device {device_uuid}: {str(e)}", exc_info=True)
+        return _bad_request(f"Failed to get pluggable: {str(e)}", path=rc_path)
+    
+    finally:
+            pluggables_client.close()
 
 @blueprint.route("/device=/", methods=["POST"])
 @require_accept([YANG_JSON])
 @require_content_type([YANG_JSON])
 def rc_post(rc_path, device_uuid=None):
-    device_store = get_device_store(device_uuid)
-    p = RestconfPath(rc_path)
+    if device_uuid is None:
+        return _bad_request("Device UUID must be specified for POST requests.", path=rc_path)
+    
     payload = request.get_json(force=True, silent=True)
     if payload is None:
-        return _bad_request("Invalid or empty JSON payload.", path=p.raw)
-
+        return _bad_request("Invalid or empty JSON payload.", path=rc_path)
+    
     try:
-        created = device_store.create(p.json_pointer(), payload)
-    except KeyError as e:
-        return _bad_request(str(e), path=p.raw)
-    except ValueError as e:
-        return _bad_request(str(e), path=p.raw)
-
-    return yang_json(created, status=201)
-
-@blueprint.route("/device=/", methods=["PUT"])
-@require_accept([YANG_JSON])
-@require_content_type([YANG_JSON])
-def rc_put(rc_path, device_uuid=None):
-    device_store = get_device_store(device_uuid)
-    p = RestconfPath(rc_path)
-    payload = request.get_json(force=True, silent=True)
-    if payload is None:
-        return _bad_request("Invalid or empty JSON payload.", path=p.raw)
-
-    try:
-        updated = device_store.replace(p.json_pointer(), payload)
-    except KeyError as e:
-        return _bad_request(str(e), path=p.raw)
-    return yang_json(updated, status=200)
+        create_request = json_to_create_pluggable_request(
+            device_uuid    = device_uuid,
+            initial_config = payload,
+        )
+        
+        pluggables_client = PluggablesClient()
+        try:
+            pluggable = pluggables_client.CreatePluggable(create_request)
+            LOGGER.info(f"Successfully created pluggable for device {device_uuid}")
+            response_data = grpc_message_to_json(pluggable)
+            
+            return yang_json(response_data, status=201)
+        finally:
+            pluggables_client.close()
+    
+    except AlreadyExistsException as e:
+        LOGGER.warning(f"Pluggable already exists for device {device_uuid}: {e.details}")
+        return _bad_request(f"Pluggable already exists: {e.details}", path=rc_path)
+    
+    except InvalidArgumentException as e:
+        LOGGER.warning(f"Invalid argument creating pluggable for device {device_uuid}: {e.details}")
+        return _bad_request(f"Invalid argument: {e.details}", path=rc_path)
+    
+    except Exception as e:
+        LOGGER.error(f"Unexpected error creating pluggable for device {device_uuid}: {str(e)}", exc_info=True)
+        return _bad_request(f"Failed to create pluggable: {str(e)}", path=rc_path)
 
-@blueprint.route("/device=/", methods=["PATCH"])
+@blueprint.route("/device=/", methods=["DELETE"])
 @require_accept([YANG_JSON])
-@require_content_type([YANG_JSON])
-def rc_patch(rc_path, device_uuid=None):
+def rc_delete(rc_path, device_uuid=None):
+    LOGGER.info(f"DELETE request for path: {rc_path} on device UUID: {device_uuid}")
+    
     if device_uuid is None:
-        return _bad_request("Device UUID must be specified for PATCH requests.", path=rc_path)
-    Pluggable = DscmPlugin(device_id=device_uuid)
-    response = Pluggable.Configure_pluaggable(request.get_json())
-    if not response:
-        return _bad_request("Failed to configure pluggable device.", path=rc_path)
-    return yang_json({"result": response}, status=200)
+        return _bad_request("Device UUID must be specified for DELETE requests.", path=rc_path)
+    
+    pluggables_client = PluggablesClient()
+    try:
+        # Delete specific pluggable
+        delete_request = json_to_delete_pluggable_request(device_uuid)
+        pluggables_client.DeletePluggable(delete_request)
+        LOGGER.info(f"Successfully deleted pluggable for device {device_uuid}")
+        return Response(status=204)
+        
+    except NotFoundException as e:
+        LOGGER.warning(f"Pluggable not found for device {device_uuid}: {e.details} (already deleted or never existed)")
+        # DELETE is idempotent - return 204 even if resource doesn't exist
+        return Response(status=204)
+    
+    except Exception as e:
+        LOGGER.error(f"Unexpected error deleting pluggable for device {device_uuid}: {str(e)}", exc_info=True)
+        return _bad_request(f"Failed to delete pluggable: {str(e)}", path=rc_path)
+
+    finally:
+        pluggables_client.close()
+
+# --------------------------------
+# The PUT and PATCH methods are not implemented for pluggables Service.
+# --------------------------------
+# @blueprint.route("/device=/", methods=["PUT"])
+# @require_accept([YANG_JSON])
+# @require_content_type([YANG_JSON])
+# def rc_put(rc_path, device_uuid=None):
+#     device_store = get_device_store(device_uuid)
+#     p = RestconfPath(rc_path)
+#     payload = request.get_json(force=True, silent=True)
+#     if payload is None:
+#         return _bad_request("Invalid or empty JSON payload.", path=p.raw)
+
+#     try:
+#         updated = device_store.replace(p.json_pointer(), payload)
+#     except KeyError as e:
+#         return _bad_request(str(e), path=p.raw)
+#     return yang_json(updated, status=200)
+
+# @blueprint.route("/device=/", methods=["PATCH"])
+# @require_accept([YANG_JSON])
+# @require_content_type([YANG_JSON])
+# def rc_patch(rc_path, device_uuid=None):
+#     if device_uuid is None:
+#         return _bad_request("Device UUID must be specified for PATCH requests.", path=rc_path)
+#     Pluggable = DscmPlugin(device_id=device_uuid)
+#     response = Pluggable.Configure_pluaggable(request.get_json())
+#     if not response:
+#         return _bad_request("Failed to configure pluggable device.", path=rc_path)
+#     return yang_json({"result": response}, status=200)
 
     # device_store = get_device_store(device_uuid)
     # p = RestconfPath(rc_path)
@@ -135,13 +207,3 @@ def rc_patch(rc_path, device_uuid=None):
     #     return _bad_request(str(e), path=p.raw)
     # return yang_json(merged, status=200)
 
-@blueprint.route("/device=/", methods=["DELETE"])
-@require_accept([YANG_JSON])
-def rc_delete(rc_path, device_uuid=None):
-    device_store = get_device_store(device_uuid)
-    p = RestconfPath(rc_path)
-    try:
-        device_store.delete(p.json_pointer())
-    except KeyError:
-        abort(404)
-    return Response(status=204)
diff --git a/src/nbi/tests/DSCM_MockWebServer.py b/src/nbi/tests/DSCM_MockWebServer.py
index 757753361..a5eb1ce01 100644
--- a/src/nbi/tests/DSCM_MockWebServer.py
+++ b/src/nbi/tests/DSCM_MockWebServer.py
@@ -12,50 +12,79 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import os, pytest, time
-from common.Constants import ServiceNameEnum
-from common.Settings import (
-    ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_HTTP,
-    get_env_var_name, get_service_baseurl_http, get_service_port_http
-)
-from nbi.service.rest_server.RestServer import RestServer
+
+import logging, threading, pytest, time
+from nbi.service.NbiApplication import NbiApplication
 from nbi.service.rest_server.nbi_plugins.dscm_oc import register_dscm_oc
-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
-
-
-LOCAL_HOST = '127.0.0.1'
-MOCKSERVICE_PORT = 10000
-NBI_SERVICE_PORT = MOCKSERVICE_PORT + get_service_port_http(ServiceNameEnum.NBI)    # avoid privileged ports
-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)
-
-@pytest.fixture(scope='session')
-def mock_service():
-    _service = MockService_Dependencies(MOCKSERVICE_PORT)
-    _service.configure_env_vars()
-    _service.start()
+from .Constants import LOCAL_HOST, NBI_SERVICE_PORT, NBI_SERVICE_PREFIX_URL
+
+
+LOGGER = logging.getLogger(__name__)
+
+class MockWebServer(threading.Thread):
+    def __init__(self):
+        super().__init__(daemon=True)
+
+        self.nbi_app = NbiApplication(base_url=NBI_SERVICE_PREFIX_URL)
+        register_dscm_oc(self.nbi_app)
+        self.nbi_app.dump_configuration()
+
+    def run(self):
+        try:
+            self.nbi_app._sio.run(
+                self.nbi_app.get_flask_app(),
+                host=LOCAL_HOST, port=NBI_SERVICE_PORT,
+                debug=True, use_reloader=False
+            )
+        except: # pylint: disable=bare-except
+            LOGGER.exception('[MockWebServer::run] Unhandled Exception')
+
+
+
+# import os, pytest, time
+# from common.Constants import ServiceNameEnum
+# from common.Settings import (
+#     ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_HTTP,
+#     get_env_var_name, get_service_baseurl_http, get_service_port_http
+# )
+# from nbi.service.rest_server.RestServer import RestServer
+# from nbi.service.rest_server.nbi_plugins.dscm_oc import register_dscm_oc
+# 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
+
+
+# LOCAL_HOST = '127.0.0.1'
+# MOCKSERVICE_PORT = 10000
+# NBI_SERVICE_PORT = MOCKSERVICE_PORT + get_service_port_http(ServiceNameEnum.NBI)    # avoid privileged ports
+# 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)
+
+# @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 : MockService_Dependencies):  # pylint: disable=redefined-outer-name, unused-argument
-    _rest_server = RestServer()
-    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)
-    register_dscm_oc(_rest_server)
-
-    _rest_server.start()
-    time.sleep(1) # bring time for the server to start
-    yield _rest_server
-    _rest_server.shutdown()
-    _rest_server.join()
+#     yield _service
+
+#     _service.stop()
+
+# @pytest.fixture(scope='session')
+# def nbi_service_rest(mock_service : MockService_Dependencies):  # pylint: disable=redefined-outer-name, unused-argument
+#     _rest_server = RestServer()
+#     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)
+#     register_dscm_oc(_rest_server)
+
+#     _rest_server.start()
+#     time.sleep(1) # bring time for the server to start
+#     yield _rest_server
+#     _rest_server.shutdown()
+#     _rest_server.join()
diff --git a/src/nbi/tests/messages/dscm_messages.py b/src/nbi/tests/messages/dscm_messages.py
new file mode 100644
index 000000000..34afe31e9
--- /dev/null
+++ b/src/nbi/tests/messages/dscm_messages.py
@@ -0,0 +1,60 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 get_hub_payload():
+    """Example HUB format payload."""
+    return {
+        "name"               : "channel-1",
+        "frequency"          : "195000000",
+        "target_output_power": "-3.0",
+        "operational_mode"   : "1",
+        "operation"          : "merge",
+        "digital_subcarriers_groups": [
+            { "group_id": 1, "digital-subcarrier-id": [{ "subcarrier-id": 1, "active": True}, ]},
+            { "group_id": 2, "digital-subcarrier-id": [{ "subcarrier-id": 2, "active": True}, ]},
+            { "group_id": 3, "digital-subcarrier-id": [{ "subcarrier-id": 3, "active": True}, ]},
+            { "group_id": 4, "digital-subcarrier-id": [{ "subcarrier-id": 4, "active": True}, ]},
+        ],
+    }
+
+
+def get_leaf_payload():
+    """Example LEAF format payload."""
+    return {
+        "operation": "merge",
+        "channels": [
+            {
+                "name"                      : "channel-1",
+                "frequency"                 : "195006250",
+                "target_output_power"       : "-99.0",
+                "operational_mode"          : "1",
+                "digital_subcarriers_groups": [{ "group_id": 1 }]
+            },
+            {
+                "name"                      : "channel-3",
+                "frequency"                 : "195018750",
+                "target_output_power"       : "-99.0",
+                "operational_mode"          : "1",
+                "digital_subcarriers_groups": [{ "group_id": 2 }]
+            },
+            {
+                "name"                      : "channel-5",
+                "frequency"                 : "195031250",
+                "target_output_power"       : "-99.0",
+                "operational_mode"          : "1",
+                "digital_subcarriers_groups": [{ "group_id": 3 }]
+            }
+        ]
+    }
\ No newline at end of file
diff --git a/src/nbi/tests/test_dscm_restconf.py b/src/nbi/tests/test_dscm_restconf.py
index d306c412e..c9b5804a4 100644
--- a/src/nbi/tests/test_dscm_restconf.py
+++ b/src/nbi/tests/test_dscm_restconf.py
@@ -12,29 +12,80 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-
-from nbi.service.rest_server import RestServer
-from typing import  Dict
-from urllib.parse import quote
-import pytest, time, logging, os
+from .DSCM_MockWebServer import nbi_service_rest
+from .messages.dscm_messages import get_hub_payload, get_leaf_payload
+from common.Constants import ServiceNameEnum
+from common.proto.context_pb2_grpc import add_ContextServiceServicer_to_server
+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.tools.service.GenericGrpcService import GenericGrpcService
+from pluggables.client.PluggablesClient import PluggablesClient
+from pluggables.service.PluggablesService import PluggablesService
+from typing import Union
+import grpc
+import logging
+import os, pytest
 import requests
-from .DSCM_MockWebServer import nbi_service_rest, mock_service
+
 
 LOGGER = logging.getLogger(__name__)
 LOGGER.setLevel(logging.DEBUG)
 
-# Test configuration
-BASE_URL = "http://192.168.202.254:80/restconf/data/"
-# BASE_URL = "http://127.0.0.1:18080/restconf/data/"
+BASE_URL = "http://127.0.0.1:18080/restconf/data/"
+HEADERS = { "Accept"      : "application/yang-data+json",
+            "Content-Type": "application/yang-data+json" }
+
+###########################
+# Tests Setup
+###########################
+
+LOCAL_HOST = '127.0.0.1'
+
+DSCMPLUGGABLE_SERVICE_PORT = get_service_port_grpc(ServiceNameEnum.DSCMPLUGGABLE)  # type: ignore
+os.environ[get_env_var_name(ServiceNameEnum.DSCMPLUGGABLE, ENVVAR_SUFIX_SERVICE_HOST     )] = str(LOCAL_HOST)
+os.environ[get_env_var_name(ServiceNameEnum.DSCMPLUGGABLE, ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(DSCMPLUGGABLE_SERVICE_PORT)
+
+class MockContextService(GenericGrpcService):
+    # Mock Service implementing Context to simplify unitary tests of DSCM pluggables
+
+    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)
+
+# This fixture will be requested by test cases and last during testing session
+@pytest.fixture(scope='session')
+def pluggables_service():
+    LOGGER.info('Initializing DscmPluggableService...')
+    _service = PluggablesService()
+    _service.start()
+
+    # yield the server, when test finishes, execution will resume to stop it
+    LOGGER.info('Yielding DscmPluggableService...')
+    yield _service
+
+    LOGGER.info('Terminating DscmPluggableService...')
+    _service.stop()
+
+    LOGGER.info('Terminated DscmPluggableService...')
+
+@pytest.fixture(scope='function')
+def dscm_pluggable_client(pluggables_service : PluggablesService):
+    LOGGER.info('Creating PluggablesClient...')
+    _client = PluggablesClient()
+
+    LOGGER.info('Yielding PluggablesClient...')
+    yield _client
 
+    LOGGER.info('Closing PluggablesClient...')
+    _client.close()
 
-HEADERS = {
-    "Accept": "application/yang-data+json",
-    "Content-Type": "application/yang-data+json"
-}
-RAW_DEVICE_ID = "T2.1/" # Only have a single value for hub
-# RAW_DEVICE_ID = "T1.3/" # Can be Changed to "T1.1/" and "T1.2" to test other leaves
-DEVICE_ID     = f"device={RAW_DEVICE_ID}"
+    LOGGER.info('Closed PluggablesClient...')
 
 @pytest.fixture(autouse=True)
 def log_each(request):
@@ -42,262 +93,54 @@ def log_each(request):
     yield
     LOGGER.info(f"<<<<<< END   {request.node.name} <<<<<<")
 
-def get_default_hub_set_config() -> Dict:
-    return { 
-        "name"               : "channel-1",
-        "frequency"          : "195000000",
-        "target_output_power": "-3.0",
-        "operational_mode"   : "1",
-        "operation"          : "merge",
-        "digital_subcarriers_groups": [
-            { "group_id": 1, "digital-subcarrier-id": [{ "subcarrier-id": 1, "active": True}, ]},
-            { "group_id": 2, "digital-subcarrier-id": [{ "subcarrier-id": 2, "active": True}, ]},
-            { "group_id": 3, "digital-subcarrier-id": [{ "subcarrier-id": 3, "active": True}, ]},
-            { "group_id": 4, "digital-subcarrier-id": [{ "subcarrier-id": 4, "active": True}, ]},
-        ],
-    }
-
-def get_default_config_leaf() -> Dict:
-    return { 
-        "operation": "merge",
-        "channels": 
-        [{
-                "name"                      : "channel-1",
-                "frequency"                 : "195006250",
-                "target_output_power"       : "-99.0",
-                "operational_mode"          : "1",
-                "digital_subcarriers_groups": [{ "group_id": 1 }]
-            },
-            {
-                "name"                      : "channel-3",
-                "frequency"                 : "195018750",
-                "target_output_power"       : "-99.0",
-                "operational_mode"          : "1",
-                "digital_subcarriers_groups": [{ "group_id": 1 }]
-            },
-            {
-                "name"                      : "channel-5",
-                "frequency"                 : "195031250",
-                "target_output_power"       : "-99.0",
-                "operational_mode"          : "1",
-                "digital_subcarriers_groups": [{ "group_id": 1 }]
-            }]
-    }
-
-def get_config_by_device_id(device_id: str) -> Dict:
-    if device_id == "T2.1":
-        return get_default_hub_set_config()
-    elif device_id in ["T1.1", "T1.2", "T1.3"]:
-        return get_default_config_leaf()
-    else:
-        raise ValueError("Unknown device_id")
-
-def test_patch_optical_channel_frequency(nbi_service_rest: RestServer):
+# Add here the test case of POST method to create a new device configuration
+def test_post_hub_optical_channel_frequency(nbi_service_rest, dscm_pluggable_client: PluggablesClient):
     """Test PATCH to update optical channel frequency."""
     # Use simple path with / and encode manually for component name
-    # TODO: What is the purpose of PATH variable here? as we have XML template for each device. with device_id we can get the template
     component_name = "optical-channel-1/1/1"
-    encoded_path = f"{DEVICE_ID}openconfig-platform:components/component={quote(component_name, safe='')}/optical-channel/config"
-    
-    # Get and save original values
-    # response = requests.get(f"{BASE_URL}{encoded_path}", headers={"Accept": "application/yang-data+json"})
-    # assert response.status_code == 200
-    # original = response.json()
+    device = "device=T1.1/"
+    encoded_path = f"{device}openconfig-platform:components/component=1/optical-channel/config"
     
     # Update frequency
-    # patch_data = { "frequency": 196150000, "target-output-power": 1.5 }
-    patch_data = get_config_by_device_id(RAW_DEVICE_ID.strip('/'))
-    response = requests.patch(f"{BASE_URL}{encoded_path}", 
-                            json=patch_data, 
+    post_data = get_hub_payload()
+    response = requests.post(f"{BASE_URL}{encoded_path}", 
+                            json=post_data, 
                             headers=HEADERS)
-    assert response.status_code == 200
-    
-    # # Verify update
-    # updated = response.json()
-    # assert updated["frequency"] == '195000000'
-    # assert updated["target_output_power"] == '-3.0'
-    
-    # # Restore original values
-    # restore_data = {
-    #     "frequency": original["frequency"],
-    #     "target-output-power": original["target-output-power"]
-    # }
-    
-    # response = requests.patch(f"{BASE_URL}{encoded_path}", 
-    #                         json=restore_data, 
-    #                         headers=HEADERS)
-    # assert response.status_code == 200
-    
-    # # Validate restoration
-    # restored = response.json()
-    # assert restored["frequency"] == original["frequency"]
-    # assert restored["target-output-power"] == original["target-output-power"]
-
-# def test_get_root_data(nbi_service_rest: RestServer):
-#     """Test GET {DEVICE_ID}restconf/data/ - should return top-level modules."""
-#     # response = requests.get(f"{BASE_URL}{DEVICE_ID}restconf/data/openconfig-terminal-device:terminal-device/logical-channels/channel=1", headers={"Accept": "application/yang-data+json"})
-#     response = requests.get(f"{BASE_URL}{DEVICE_ID}restconf/data/", headers={"Accept": "application/yang-data+json"})
-#     assert response.status_code == 200
-#     assert response.headers["Content-Type"] == "application/yang-data+json"
-    
-#     data = response.json()
-#     assert "openconfig-terminal-device:terminal-device" in data
-#     assert "openconfig-platform:components" in data
+    assert response.status_code == 201
 
-# def test_get_specific_device_config(nbi_service_rest: RestServer):
-#     # path = "http://127.0.0.1:8000/device=dscm-1/restconf/data/openconfig-terminal-device:terminal-device/logical-channels/channel=1"
-#     # path = "http://127.0.0.1:8000/restconf/data/openconfig-terminal-device:terminal-device/config"
-#     response = requests.get(f"{BASE_URL}{DEVICE_ID}restconf/data/openconfig-terminal-device:terminal-device/logical-channels/channel=1", headers={"Accept": "application/yang-data+json"})
 
-#     # response = requests.get(f"{path}", headers={"Accept": "application/yang-data+json"})
-    
-#     assert response.status_code == 200
-#     data = response.json()
-#     assert data["index"] == 1
-#     assert data["config"]["description"] == "Updated 100G client channel"
-#     assert data["state"]["link-state"] == "UP"
 
-# def test_get_logical_channels(nbi_service_rest: RestServer):
-#     """Test GET for logical channels list."""
-#     path = f"{DEVICE_ID}restconf/data/openconfig-terminal-device:terminal-device/logical-channels"
-#     response = requests.get(f"{BASE_URL}{path}", headers={"Accept": "application/yang-data+json"})
-    
-#     assert response.status_code == 200
-#     data = response.json()
-#     assert "channel" in data
-#     assert len(data["channel"]) >= 2  # Should have at least 2 channels from datastore
-
-# def test_get_specific_logical_channel(nbi_service_rest: RestServer):
-#     """Test GET for specific logical channel by index."""
-#     path = f"{DEVICE_ID}restconf/data/openconfig-terminal-device:terminal-device/logical-channels/channel=1"
-#     response = requests.get(f"{BASE_URL}{path}", headers={"Accept": "application/yang-data+json"})
-    
-#     assert response.status_code == 200
-#     data = response.json()
-#     assert data["index"] == 1
-#     assert data["config"]["description"] == "Updated 100G client channel"
-#     assert data["state"]["link-state"] == "UP"
-
-# def test_get_optical_channel_component(nbi_service_rest: RestServer):
-#     """Test GET for specific optical channel component."""
-#     # Use simple path with / and let requests handle URL encoding
-#     component_name = "optical-channel-1/1/1"
-#     encoded_path = f"{DEVICE_ID}restconf/data/openconfig-platform:components/component={quote(component_name, safe='')}"
-#     response = requests.get(f"{BASE_URL}{encoded_path}", headers={"Accept": "application/yang-data+json"})
-    
-#     assert response.status_code == 200
-#     data = response.json()
-#     assert data["name"] == "optical-channel-1/1/1"
-#     assert data["state"]["oper-status"] == "ACTIVE"
-#     assert "optical-channel" in data
-
-# def test_get_nonexistent_resource(nbi_service_rest: RestServer):
-#     """Test GET for non-existent resource returns 404."""
-#     path = "/data/openconfig-terminal-device:terminal-device/logical-channels/channel=999"
-#     response = requests.get(f"{BASE_URL}{path}", headers={"Accept": "application/yang-data+json"})
-    
-#     assert response.status_code == 404
-
-# def test_patch_logical_channel_config(nbi_service_rest: RestServer):
-#     """Test PATCH to update logical channel configuration."""
-#     path = f"{DEVICE_ID}restconf/data/openconfig-terminal-device:terminal-device/logical-channels/channel=1/config"
-    
-#     # First get and save original state
-#     response = requests.get(f"{BASE_URL}{path}", headers={"Accept": "application/yang-data+json"})
-#     assert response.status_code == 200
-#     original = response.json()
-    
-#     # Update description via PATCH
-#     patch_data = {
-#         "description": "Updated 100G client channel",
-#         "admin-state": "DISABLED"
-#     }
-    
-#     response = requests.patch(f"{BASE_URL}{path}", 
-#                             json=patch_data, 
-#                             headers=HEADERS)
-#     assert response.status_code == 200
-    
-#     # Verify the merge happened correctly
-#     updated = response.json()
-#     assert updated["description"] == "Updated 100G client channel"
-#     assert updated["admin-state"] == "DISABLED"
-#     assert updated["index"] == original["index"]  # Should preserve other fields
-#     assert updated["rate-class"] == original["rate-class"]
-    
-#     # Restore original values
-#     restore_data = {
-#         "description": original["description"],
-#         "admin-state": original["admin-state"]
-#     }
-    
-#     response = requests.patch(f"{BASE_URL}{path}", 
-#                             json=restore_data, 
-#                             headers=HEADERS)
-#     assert response.status_code == 200
+# Add a complete test case of POST, GET, DELETE methods to create, get and delete a new device configuration
+# - 1. POST to create a new device configuration
+# - 2. GET to retrieve the created device configuration
+# - 3. DELETE to remove the created device configuration
+# - 4. GET again to verify the device configuration has been deleted
+# - 5. Catch and handle exceptions appropriately assert the expected outcomes at each step
+# - Use assertions to validate the responses and states after each operation
+# - Use both hub and leaf device types for the test
+def test_post_get_delete_leaf_optical_channel_frequency(nbi_service_rest, dscm_pluggable_client: PluggablesClient):
+    """Test POST, GET, DELETE to manage optical channel frequency for leaf device."""
+    # Use simple path with / and encode manually for component name
+    device = "device=T1.2/"
+    encoded_path = f"{device}openconfig-platform:components/component=1/optical-channel/config"
     
-#     # Validate restoration
-#     restored = response.json()
-#     assert restored["description"] == original["description"]
-#     assert restored["admin-state"] == original["admin-state"]
+    # Step 1: POST to create a new device configuration
+    post_data = get_leaf_payload()
+    response = requests.post(f"{BASE_URL}{encoded_path}", 
+                            json=post_data, 
+                            headers=HEADERS)
+    assert response.status_code == 201
 
-# def test_delete_digital_subcarrier(nbi_service_rest: RestServer):
-#     """Test DELETE of a digital subcarrier from optical channel."""
-#     # Use simple path with / and encode component name
-#     component_name = "optical-channel-1/1/2"
-#     base_path = f"{DEVICE_ID}restconf/data/openconfig-platform:components/component={quote(component_name, safe='')}/optical-channel/config/digital-subcarriers-group=1"
-    
-#     # First get and save the subcarrier data
-#     response = requests.get(f"{BASE_URL}{base_path}", headers={"Accept": "application/yang-data+json"})
-#     assert response.status_code == 200
-#     original_data = response.json()
-    
-#     # Delete the second digital subcarriers group
-#     response = requests.delete(f"{BASE_URL}{base_path}", headers={"Accept": "application/yang-data+json"})
-#     assert response.status_code == 204
-    
-#     # Verify it's gone
-#     response = requests.get(f"{BASE_URL}{base_path}", headers={"Accept": "application/yang-data+json"})
-#     assert response.status_code == 404
-    
-#     # Restore the deleted data using PUT
-#     response = requests.put(f"{BASE_URL}{base_path}", 
-#                             json=original_data, 
-#                             headers=HEADERS)
-#     assert response.status_code in [200, 201]
-    
-#     # Validate restoration
-#     response = requests.get(f"{BASE_URL}{base_path}", headers={"Accept": "application/yang-data+json"})
-#     assert response.status_code == 200
-#     restored = response.json()
-#     assert restored == original_data
+    # Step 2: GET to retrieve the created device configuration
+    response = requests.get(f"{BASE_URL}{encoded_path}", headers={"Accept": "application/yang-data+json"})
+    assert response.status_code == 200
+    get_data = response.json()
+    assert get_data is not None
 
-# def test_delete_logical_channel_assignment(nbi_service_rest: RestServer):
-#     """Test DELETE of logical channel assignment."""
-#     path = f"{DEVICE_ID}restconf/data/openconfig-terminal-device:terminal-device/logical-channels/channel=1/logical-channel-assignments/assignment=1"
-    
-#     # Get and save original assignment data
-#     response = requests.get(f"{BASE_URL}{path}", headers={"Accept": "application/yang-data+json"})
-#     assert response.status_code == 200
-#     original_data = response.json()
-    
-#     # Delete the assignment
-#     response = requests.delete(f"{BASE_URL}{path}", headers={"Accept": "application/yang-data+json"})
-#     assert response.status_code == 204
-    
-#     # Verify deletion
-#     response = requests.get(f"{BASE_URL}{path}", headers={"Accept": "application/yang-data+json"})
-#     assert response.status_code == 404
-    
-#     # Restore the deleted assignment using PUT
-#     response = requests.put(f"{BASE_URL}{path}", 
-#                             json=original_data, 
-#                             headers=HEADERS)
-#     assert response.status_code in [200, 201]
-    
-#     # Validate restoration
-#     response = requests.get(f"{BASE_URL}{path}", headers={"Accept": "application/yang-data+json"})
-#     assert response.status_code == 200
-#     restored = response.json()
-#     assert restored == original_data
+    # Step 3: DELETE to remove the created device configuration
+    response = requests.delete(f"{BASE_URL}{encoded_path}", headers={"Accept": "application/yang-data+json"})
+    assert response.status_code == 204
 
+    # Step 4: GET again to verify the device configuration has been deleted
+    response = requests.get(f"{BASE_URL}{encoded_path}", headers={"Accept": "application/yang-data+json"})
+    assert response.status_code == 400  # Assuming 404 is returned for non-existing resource
diff --git a/src/nbi/tests/test_json_to_proto.py b/src/nbi/tests/test_json_to_proto.py
new file mode 100644
index 000000000..cb0bd7acf
--- /dev/null
+++ b/src/nbi/tests/test_json_to_proto.py
@@ -0,0 +1,178 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 pytest
+from nbi.service.rest_server.nbi_plugins.dscm_oc.json_to_proto_conversion import (
+    json_to_create_pluggable_request,
+    json_to_configure_pluggable_request
+)
+
+
+def get_hub_payload():
+    """Example HUB format payload."""
+    return {
+        "name"               : "channel-1",
+        "frequency"          : "195000000",
+        "target_output_power": "-3.0",
+        "operational_mode"   : "1",
+        "operation"          : "merge",
+        "digital_subcarriers_groups": [
+            { "group_id": 1, "digital-subcarrier-id": [{ "subcarrier-id": 1, "active": True}, ]},
+            { "group_id": 2, "digital-subcarrier-id": [{ "subcarrier-id": 2, "active": True}, ]},
+            { "group_id": 3, "digital-subcarrier-id": [{ "subcarrier-id": 3, "active": True}, ]},
+            { "group_id": 4, "digital-subcarrier-id": [{ "subcarrier-id": 4, "active": True}, ]},
+        ],
+    }
+
+def get_leaf_payload():
+    """Example LEAF format payload."""
+    return {
+        "channels": [
+            {
+                "name": "channel-1",
+                "frequency": "195006250",
+                "target_output_power": "-99.0",
+                "operational_mode": "1",
+                "digital_subcarriers_groups": [{"group_id": 1}]
+            },
+            {
+                "name": "channel-3",
+                "frequency": "195018750",
+                "target_output_power": "-99.0",
+                "operational_mode": "1",
+                "digital_subcarriers_groups": [{"group_id": 2}]
+            }
+        ]
+    }
+
+def test_create_pluggable_request_hub_format():
+    """Test conversion of HUB format to CreatePluggableRequest."""
+    device_uuid = "test-device-uuid-123"
+    payload     = get_hub_payload()
+    
+    request = json_to_create_pluggable_request(
+        device_uuid=device_uuid,
+        initial_config=payload,
+        preferred_pluggable_index=0
+    )
+    
+    # Verify device ID
+    assert request.device.device_uuid.uuid == device_uuid                                                                 # type: ignore[attr-defined]
+    assert request.preferred_pluggable_index == 0                                                                         # type: ignore[attr-defined]
+    
+    # Verify initial config
+    assert request.initial_config.id.device.device_uuid.uuid == device_uuid                                               # type: ignore[attr-defined]
+    assert request.initial_config.id.pluggable_index == 0                                                                 # type: ignore[attr-defined]
+    
+    # Verify DSC groups
+    assert len(request.initial_config.dsc_groups) == 4                                                                    # type: ignore[attr-defined]
+    
+    # Check first group
+    group1 = request.initial_config.dsc_groups[0]                                                                         # type: ignore[attr-defined]
+    assert group1.id.group_index == 1                                                                                     # type: ignore[attr-defined]
+    assert group1.group_size == 1                                                                                         # type: ignore[attr-defined]
+    assert len(group1.subcarriers) == 1                                                                                   # type: ignore[attr-defined]
+    assert group1.subcarriers[0].active is True                                                                           # type: ignore[attr-defined]
+
+
+def test_create_pluggable_request_leaf_format():
+    """Test conversion of LEAF format to CreatePluggableRequest."""
+    device_uuid = "test-device-uuid-456"
+    payload = get_leaf_payload()
+    
+    request = json_to_create_pluggable_request(
+        device_uuid=device_uuid,
+        initial_config=payload,
+        preferred_pluggable_index=-1
+    )
+    
+    # Verify device ID
+    assert request.device.device_uuid.uuid == device_uuid                                                                 # type: ignore[attr-defined]
+    assert request.preferred_pluggable_index == -1                                                                        # type: ignore[attr-defined]
+    
+    # Verify DSC groups (one per channel)
+    assert len(request.initial_config.dsc_groups) == 2                                                                    # type: ignore[attr-defined]
+    
+    # Check first channel group
+    group1 = request.initial_config.dsc_groups[0]                                                                         # type: ignore[attr-defined]
+    assert group1.id.group_index == 1                                                                                     # type: ignore[attr-defined]
+    assert group1.group_size == 1                                                                                         # type: ignore[attr-defined]
+    assert len(group1.subcarriers) == 1                                                                                   # type: ignore[attr-defined]
+    
+    # Verify frequency conversion (MHz to Hz)
+    subcarrier1 = group1.subcarriers[0]                                                                                   # type: ignore[attr-defined]
+    assert subcarrier1.center_frequency_hz == 195006250 * 1e6                                                             # type: ignore[attr-defined]
+
+
+def test_configure_pluggable_request_hub_format():
+    """Test conversion to ConfigurePluggableRequest with HUB format."""
+    device_uuid = "test-device-uuid-789"
+    pluggable_index = 1
+    payload = get_hub_payload()
+    
+    request = json_to_configure_pluggable_request(
+        device_uuid=device_uuid,
+        pluggable_index=pluggable_index,
+        payload=payload
+    )
+    
+    # Verify config ID
+    assert request.config.id.device.device_uuid.uuid == device_uuid                                                       # type: ignore[attr-defined]
+    assert request.config.id.pluggable_index == pluggable_index                                                           # type: ignore[attr-defined]
+    
+    # Verify timeout and view level
+    assert request.apply_timeout_seconds == 30                                                                            # type: ignore[attr-defined]
+    
+    # Verify DSC groups
+    assert len(request.config.dsc_groups) == 4                                                                            # type: ignore[attr-defined]
+
+
+def test_configure_pluggable_request_leaf_format():
+    """Test conversion to ConfigurePluggableRequest with LEAF format."""
+    device_uuid = "test-device-uuid-abc"
+    pluggable_index = 0
+    payload = get_leaf_payload()
+    
+    request = json_to_configure_pluggable_request(
+        device_uuid=device_uuid,
+        pluggable_index=pluggable_index,
+        payload=payload,
+        apply_timeout_seconds=60
+    )
+    
+    # Verify config ID
+    assert request.config.id.device.device_uuid.uuid == device_uuid                                                       # type: ignore[attr-defined]
+    assert request.config.id.pluggable_index == pluggable_index                                                           # type: ignore[attr-defined]
+    
+    # Verify custom timeout
+    assert request.apply_timeout_seconds == 60                                                                            # type: ignore[attr-defined]
+    
+    # Verify DSC groups (one per channel)
+    assert len(request.config.dsc_groups) == 2                                                                            # type: ignore[attr-defined]
+
+
+def test_empty_payload():
+    """Test handling of empty payload."""
+    device_uuid = "test-device-uuid-empty"
+    payload = {}
+    
+    request = json_to_create_pluggable_request(
+        device_uuid=device_uuid,
+        initial_config=payload,
+        preferred_pluggable_index=-1
+    )
+    
+    # Should create request with device ID but no initial config
+    assert request.device.device_uuid.uuid == device_uuid                                                                 # type: ignore[attr-defined]
+    assert request.preferred_pluggable_index == -1                                                                        # type: ignore[attr-defined]
-- 
GitLab


From a161b81ee4280daa0b20d574dc4c9e7c8eb979f1 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 28 Oct 2025 09:14:04 +0000
Subject: [PATCH 029/111] Pre-merge code cleanup

---
 codex.sh | 5 -----
 1 file changed, 5 deletions(-)
 delete mode 100755 codex.sh

diff --git a/codex.sh b/codex.sh
deleted file mode 100755
index d911ca9b5..000000000
--- a/codex.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/bash
-
-export OPENAI_API_KEY="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"
-
-codex
-- 
GitLab


From c68f0fc985a5bce1b2fe14d2cc82ebfb1a680416 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 28 Oct 2025 10:25:08 +0000
Subject: [PATCH 030/111] Policy and ZTP components:

- Rebuild gRPC/Proto files
---
 .../generated-sources/grpc/acl/Acl.java       |   56 +-
 .../grpc/context/ContextOuterClass.java       | 1622 +++++++++--------
 .../generated-sources/grpc/device/Device.java |   14 +-
 .../grpc/ip_link/IpLink.java                  |   14 +-
 .../grpc/monitoring/Monitoring.java           |  322 ++--
 .../generated-sources/grpc/policy/Policy.java |  140 +-
 .../grpc/policy/PolicyAction.java             |   28 +-
 .../grpc/policy/PolicyCondition.java          |   14 +-
 src/policy/target/kubernetes/kubernetes.yml   |   38 +-
 .../generated-sources/grpc/acl/Acl.java       |   56 +-
 .../grpc/context/ContextOuterClass.java       | 1622 +++++++++--------
 .../generated-sources/grpc/device/Device.java |   14 +-
 .../grpc/ip_link/IpLink.java                  |   14 +-
 .../grpc/monitoring/Monitoring.java           |  322 ++--
 .../generated-sources/grpc/ztp/Ztp.java       |   84 +-
 src/ztp/target/kubernetes/kubernetes.yml      |   40 +-
 16 files changed, 2165 insertions(+), 2235 deletions(-)

diff --git a/src/policy/target/generated-sources/grpc/acl/Acl.java b/src/policy/target/generated-sources/grpc/acl/Acl.java
index 64d70d842..037bd3858 100644
--- a/src/policy/target/generated-sources/grpc/acl/Acl.java
+++ b/src/policy/target/generated-sources/grpc/acl/Acl.java
@@ -397,8 +397,8 @@ public final class Acl {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:acl.AclMatch)
-    AclMatchOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface AclMatchOrBuilder extends // @@protoc_insertion_point(interface_extends:acl.AclMatch)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * uint32 dscp = 1;
@@ -476,9 +476,8 @@ public final class Acl {
     /**
      * Protobuf type {@code acl.AclMatch}
      */
-    public static final class // @@protoc_insertion_point(message_implements:acl.AclMatch)
-    AclMatch extends // @@protoc_insertion_point(message_implements:acl.AclMatch)
-    com.google.protobuf.GeneratedMessageV3 implements AclMatchOrBuilder {
+    public static final class AclMatch extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:acl.AclMatch)
+    AclMatchOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -920,9 +919,8 @@ public final class Acl {
         /**
          * Protobuf type {@code acl.AclMatch}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:acl.AclMatch)
-        Builder extends // @@protoc_insertion_point(builder_implements:acl.AclMatch)
-        com.google.protobuf.GeneratedMessageV3.Builder implements acl.Acl.AclMatchOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:acl.AclMatch)
+        acl.Acl.AclMatchOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return acl.Acl.internal_static_acl_AclMatch_descriptor;
@@ -1657,8 +1655,8 @@ public final class Acl {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:acl.AclAction)
-    AclActionOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface AclActionOrBuilder extends // @@protoc_insertion_point(interface_extends:acl.AclAction)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .acl.AclForwardActionEnum forward_action = 1;
@@ -1688,9 +1686,8 @@ public final class Acl {
     /**
      * Protobuf type {@code acl.AclAction}
      */
-    public static final class // @@protoc_insertion_point(message_implements:acl.AclAction)
-    AclAction extends // @@protoc_insertion_point(message_implements:acl.AclAction)
-    com.google.protobuf.GeneratedMessageV3 implements AclActionOrBuilder {
+    public static final class AclAction extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:acl.AclAction)
+    AclActionOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -1915,9 +1912,8 @@ public final class Acl {
         /**
          * Protobuf type {@code acl.AclAction}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:acl.AclAction)
-        Builder extends // @@protoc_insertion_point(builder_implements:acl.AclAction)
-        com.google.protobuf.GeneratedMessageV3.Builder implements acl.Acl.AclActionOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:acl.AclAction)
+        acl.Acl.AclActionOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return acl.Acl.internal_static_acl_AclAction_descriptor;
@@ -2237,8 +2233,8 @@ public final class Acl {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:acl.AclEntry)
-    AclEntryOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface AclEntryOrBuilder extends // @@protoc_insertion_point(interface_extends:acl.AclEntry)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * uint32 sequence_id = 1;
@@ -2296,9 +2292,8 @@ public final class Acl {
     /**
      * Protobuf type {@code acl.AclEntry}
      */
-    public static final class // @@protoc_insertion_point(message_implements:acl.AclEntry)
-    AclEntry extends // @@protoc_insertion_point(message_implements:acl.AclEntry)
-    com.google.protobuf.GeneratedMessageV3 implements AclEntryOrBuilder {
+    public static final class AclEntry extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:acl.AclEntry)
+    AclEntryOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -2619,9 +2614,8 @@ public final class Acl {
         /**
          * Protobuf type {@code acl.AclEntry}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:acl.AclEntry)
-        Builder extends // @@protoc_insertion_point(builder_implements:acl.AclEntry)
-        com.google.protobuf.GeneratedMessageV3.Builder implements acl.Acl.AclEntryOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:acl.AclEntry)
+        acl.Acl.AclEntryOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return acl.Acl.internal_static_acl_AclEntry_descriptor;
@@ -3206,8 +3200,8 @@ public final class Acl {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:acl.AclRuleSet)
-    AclRuleSetOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface AclRuleSetOrBuilder extends // @@protoc_insertion_point(interface_extends:acl.AclRuleSet)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * string name = 1;
@@ -3286,9 +3280,8 @@ public final class Acl {
     /**
      * Protobuf type {@code acl.AclRuleSet}
      */
-    public static final class // @@protoc_insertion_point(message_implements:acl.AclRuleSet)
-    AclRuleSet extends // @@protoc_insertion_point(message_implements:acl.AclRuleSet)
-    com.google.protobuf.GeneratedMessageV3 implements AclRuleSetOrBuilder {
+    public static final class AclRuleSet extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:acl.AclRuleSet)
+    AclRuleSetOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -3684,9 +3677,8 @@ public final class Acl {
         /**
          * Protobuf type {@code acl.AclRuleSet}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:acl.AclRuleSet)
-        Builder extends // @@protoc_insertion_point(builder_implements:acl.AclRuleSet)
-        com.google.protobuf.GeneratedMessageV3.Builder implements acl.Acl.AclRuleSetOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:acl.AclRuleSet)
+        acl.Acl.AclRuleSetOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return acl.Acl.internal_static_acl_AclRuleSet_descriptor;
diff --git a/src/policy/target/generated-sources/grpc/context/ContextOuterClass.java b/src/policy/target/generated-sources/grpc/context/ContextOuterClass.java
index b83c4bcf8..558aa9778 100644
--- a/src/policy/target/generated-sources/grpc/context/ContextOuterClass.java
+++ b/src/policy/target/generated-sources/grpc/context/ContextOuterClass.java
@@ -1378,6 +1378,119 @@ public final class ContextOuterClass {
         }
     }
 
+    /**
+     * Protobuf enum {@code context.AclDirectionEnum}
+     */
+    public enum AclDirectionEnum implements com.google.protobuf.ProtocolMessageEnum {
+
+        /**
+         * ACLDIRECTION_BOTH = 0;
+         */
+        ACLDIRECTION_BOTH(0),
+        /**
+         * ACLDIRECTION_INGRESS = 1;
+         */
+        ACLDIRECTION_INGRESS(1),
+        /**
+         * ACLDIRECTION_EGRESS = 2;
+         */
+        ACLDIRECTION_EGRESS(2),
+        UNRECOGNIZED(-1);
+
+        /**
+         * ACLDIRECTION_BOTH = 0;
+         */
+        public static final int ACLDIRECTION_BOTH_VALUE = 0;
+
+        /**
+         * ACLDIRECTION_INGRESS = 1;
+         */
+        public static final int ACLDIRECTION_INGRESS_VALUE = 1;
+
+        /**
+         * ACLDIRECTION_EGRESS = 2;
+         */
+        public static final int ACLDIRECTION_EGRESS_VALUE = 2;
+
+        public final int getNumber() {
+            if (this == UNRECOGNIZED) {
+                throw new java.lang.IllegalArgumentException("Can't get the number of an unknown enum value.");
+            }
+            return value;
+        }
+
+        /**
+         * @param value The numeric wire value of the corresponding enum entry.
+         * @return The enum associated with the given numeric wire value.
+         * @deprecated Use {@link #forNumber(int)} instead.
+         */
+        @java.lang.Deprecated
+        public static AclDirectionEnum valueOf(int value) {
+            return forNumber(value);
+        }
+
+        /**
+         * @param value The numeric wire value of the corresponding enum entry.
+         * @return The enum associated with the given numeric wire value.
+         */
+        public static AclDirectionEnum forNumber(int value) {
+            switch(value) {
+                case 0:
+                    return ACLDIRECTION_BOTH;
+                case 1:
+                    return ACLDIRECTION_INGRESS;
+                case 2:
+                    return ACLDIRECTION_EGRESS;
+                default:
+                    return null;
+            }
+        }
+
+        public static com.google.protobuf.Internal.EnumLiteMap internalGetValueMap() {
+            return internalValueMap;
+        }
+
+        private static final com.google.protobuf.Internal.EnumLiteMap internalValueMap = new com.google.protobuf.Internal.EnumLiteMap() {
+
+            public AclDirectionEnum findValueByNumber(int number) {
+                return AclDirectionEnum.forNumber(number);
+            }
+        };
+
+        public final com.google.protobuf.Descriptors.EnumValueDescriptor getValueDescriptor() {
+            if (this == UNRECOGNIZED) {
+                throw new java.lang.IllegalStateException("Can't get the descriptor of an unrecognized enum value.");
+            }
+            return getDescriptor().getValues().get(ordinal());
+        }
+
+        public final com.google.protobuf.Descriptors.EnumDescriptor getDescriptorForType() {
+            return getDescriptor();
+        }
+
+        public static final com.google.protobuf.Descriptors.EnumDescriptor getDescriptor() {
+            return context.ContextOuterClass.getDescriptor().getEnumTypes().get(8);
+        }
+
+        private static final AclDirectionEnum[] VALUES = values();
+
+        public static AclDirectionEnum valueOf(com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+            if (desc.getType() != getDescriptor()) {
+                throw new java.lang.IllegalArgumentException("EnumValueDescriptor is not for this type.");
+            }
+            if (desc.getIndex() == -1) {
+                return UNRECOGNIZED;
+            }
+            return VALUES[desc.getIndex()];
+        }
+
+        private final int value;
+
+        private AclDirectionEnum(int value) {
+            this.value = value;
+        }
+    }
+
     /**
      * 
      * ----- Constraint ----------------------------------------------------------------------------------------------------
@@ -1473,7 +1586,7 @@ public final class ContextOuterClass {
         }
 
         public static final com.google.protobuf.Descriptors.EnumDescriptor getDescriptor() {
-            return context.ContextOuterClass.getDescriptor().getEnumTypes().get(8);
+            return context.ContextOuterClass.getDescriptor().getEnumTypes().get(9);
         }
 
         private static final ConstraintActionEnum[] VALUES = values();
@@ -1652,7 +1765,7 @@ public final class ContextOuterClass {
         }
 
         public static final com.google.protobuf.Descriptors.EnumDescriptor getDescriptor() {
-            return context.ContextOuterClass.getDescriptor().getEnumTypes().get(9);
+            return context.ContextOuterClass.getDescriptor().getEnumTypes().get(10);
         }
 
         private static final IsolationLevelEnum[] VALUES = values();
@@ -1674,8 +1787,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Empty)
-    EmptyOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface EmptyOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Empty)
+    com.google.protobuf.MessageOrBuilder {
     }
 
     /**
@@ -1685,9 +1798,8 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.Empty}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Empty)
-    Empty extends // @@protoc_insertion_point(message_implements:context.Empty)
-    com.google.protobuf.GeneratedMessageV3 implements EmptyOrBuilder {
+    public static final class Empty extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Empty)
+    EmptyOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -1848,9 +1960,8 @@ public final class ContextOuterClass {
          *
          * Protobuf type {@code context.Empty}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Empty)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.Empty)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.EmptyOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Empty)
+        context.ContextOuterClass.EmptyOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Empty_descriptor;
@@ -2014,8 +2125,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Uuid)
-    UuidOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface UuidOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Uuid)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * string uuid = 1;
@@ -2033,9 +2144,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Uuid}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Uuid)
-    Uuid extends // @@protoc_insertion_point(message_implements:context.Uuid)
-    com.google.protobuf.GeneratedMessageV3 implements UuidOrBuilder {
+    public static final class Uuid extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Uuid)
+    UuidOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -2241,9 +2351,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Uuid}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Uuid)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.Uuid)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.UuidOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Uuid)
+        context.ContextOuterClass.UuidOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Uuid_descriptor;
@@ -2508,8 +2617,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Timestamp)
-    TimestampOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface TimestampOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Timestamp)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * double timestamp = 1;
@@ -2521,9 +2630,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Timestamp}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Timestamp)
-    Timestamp extends // @@protoc_insertion_point(message_implements:context.Timestamp)
-    com.google.protobuf.GeneratedMessageV3 implements TimestampOrBuilder {
+    public static final class Timestamp extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Timestamp)
+    TimestampOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -2703,9 +2811,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Timestamp}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Timestamp)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.Timestamp)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.TimestampOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Timestamp)
+        context.ContextOuterClass.TimestampOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Timestamp_descriptor;
@@ -2927,8 +3034,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Event)
-    EventOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface EventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Event)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Timestamp timestamp = 1;
@@ -2963,9 +3070,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Event}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Event)
-    Event extends // @@protoc_insertion_point(message_implements:context.Event)
-    com.google.protobuf.GeneratedMessageV3 implements EventOrBuilder {
+    public static final class Event extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Event)
+    EventOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -3202,9 +3308,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Event}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Event)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.Event)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.EventOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Event)
+        context.ContextOuterClass.EventOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Event_descriptor;
@@ -3587,8 +3692,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.AnyEvent)
-    AnyEventOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface AnyEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.AnyEvent)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ContextEvent context = 1;
@@ -3715,9 +3820,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.AnyEvent}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.AnyEvent)
-    AnyEvent extends // @@protoc_insertion_point(message_implements:context.AnyEvent)
-    com.google.protobuf.GeneratedMessageV3 implements AnyEventOrBuilder {
+    public static final class AnyEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.AnyEvent)
+    AnyEventOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -4284,9 +4388,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.AnyEvent}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.AnyEvent)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.AnyEvent)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.AnyEventOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.AnyEvent)
+        context.ContextOuterClass.AnyEventOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_AnyEvent_descriptor;
@@ -5602,8 +5705,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ContextId)
-    ContextIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ContextIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ContextId)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid context_uuid = 1;
@@ -5630,9 +5733,8 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.ContextId}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ContextId)
-    ContextId extends // @@protoc_insertion_point(message_implements:context.ContextId)
-    com.google.protobuf.GeneratedMessageV3 implements ContextIdOrBuilder {
+    public static final class ContextId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ContextId)
+    ContextIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -5839,9 +5941,8 @@ public final class ContextOuterClass {
          *
          * Protobuf type {@code context.ContextId}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ContextId)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.ContextId)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ContextIdOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ContextId)
+        context.ContextOuterClass.ContextIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ContextId_descriptor;
@@ -6151,8 +6252,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Context)
-    ContextOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ContextOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Context)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ContextId context_id = 1;
@@ -6279,9 +6380,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Context}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Context)
-    Context extends // @@protoc_insertion_point(message_implements:context.Context)
-    com.google.protobuf.GeneratedMessageV3 implements ContextOrBuilder {
+    public static final class Context extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Context)
+    ContextOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -6753,9 +6853,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Context}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Context)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.Context)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ContextOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Context)
+        context.ContextOuterClass.ContextOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Context_descriptor;
@@ -8163,8 +8262,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ContextIdList)
-    ContextIdListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ContextIdListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ContextIdList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.ContextId context_ids = 1;
@@ -8195,9 +8294,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ContextIdList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ContextIdList)
-    ContextIdList extends // @@protoc_insertion_point(message_implements:context.ContextIdList)
-    com.google.protobuf.GeneratedMessageV3 implements ContextIdListOrBuilder {
+    public static final class ContextIdList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ContextIdList)
+    ContextIdListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -8412,9 +8510,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ContextIdList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ContextIdList)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.ContextIdList)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ContextIdListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ContextIdList)
+        context.ContextOuterClass.ContextIdListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ContextIdList_descriptor;
@@ -8881,8 +8978,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ContextList)
-    ContextListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ContextListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ContextList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.Context contexts = 1;
@@ -8913,9 +9010,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ContextList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ContextList)
-    ContextList extends // @@protoc_insertion_point(message_implements:context.ContextList)
-    com.google.protobuf.GeneratedMessageV3 implements ContextListOrBuilder {
+    public static final class ContextList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ContextList)
+    ContextListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -9130,9 +9226,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ContextList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ContextList)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.ContextList)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ContextListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ContextList)
+        context.ContextOuterClass.ContextListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ContextList_descriptor;
@@ -9599,8 +9694,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ContextEvent)
-    ContextEventOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ContextEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ContextEvent)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Event event = 1;
@@ -9640,9 +9735,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ContextEvent}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ContextEvent)
-    ContextEvent extends // @@protoc_insertion_point(message_implements:context.ContextEvent)
-    com.google.protobuf.GeneratedMessageV3 implements ContextEventOrBuilder {
+    public static final class ContextEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ContextEvent)
+    ContextEventOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -9891,9 +9985,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ContextEvent}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ContextEvent)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.ContextEvent)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ContextEventOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ContextEvent)
+        context.ContextOuterClass.ContextEventOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ContextEvent_descriptor;
@@ -10339,8 +10432,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.TopologyId)
-    TopologyIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface TopologyIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.TopologyId)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ContextId context_id = 1;
@@ -10384,9 +10477,8 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.TopologyId}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.TopologyId)
-    TopologyId extends // @@protoc_insertion_point(message_implements:context.TopologyId)
-    com.google.protobuf.GeneratedMessageV3 implements TopologyIdOrBuilder {
+    public static final class TopologyId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.TopologyId)
+    TopologyIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -10639,9 +10731,8 @@ public final class ContextOuterClass {
          *
          * Protobuf type {@code context.TopologyId}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.TopologyId)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.TopologyId)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.TopologyIdOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.TopologyId)
+        context.ContextOuterClass.TopologyIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_TopologyId_descriptor;
@@ -11087,8 +11178,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Topology)
-    TopologyOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface TopologyOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Topology)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.TopologyId topology_id = 1;
@@ -11198,9 +11289,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Topology}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Topology)
-    Topology extends // @@protoc_insertion_point(message_implements:context.Topology)
-    com.google.protobuf.GeneratedMessageV3 implements TopologyOrBuilder {
+    public static final class Topology extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Topology)
+    TopologyOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -11626,9 +11716,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Topology}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Topology)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.Topology)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.TopologyOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Topology)
+        context.ContextOuterClass.TopologyOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Topology_descriptor;
@@ -12900,8 +12989,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.TopologyDetails)
-    TopologyDetailsOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface TopologyDetailsOrBuilder extends // @@protoc_insertion_point(interface_extends:context.TopologyDetails)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.TopologyId topology_id = 1;
@@ -13011,9 +13100,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.TopologyDetails}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.TopologyDetails)
-    TopologyDetails extends // @@protoc_insertion_point(message_implements:context.TopologyDetails)
-    com.google.protobuf.GeneratedMessageV3 implements TopologyDetailsOrBuilder {
+    public static final class TopologyDetails extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.TopologyDetails)
+    TopologyDetailsOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -13439,9 +13527,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.TopologyDetails}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.TopologyDetails)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.TopologyDetails)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.TopologyDetailsOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.TopologyDetails)
+        context.ContextOuterClass.TopologyDetailsOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_TopologyDetails_descriptor;
@@ -14713,8 +14800,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.TopologyIdList)
-    TopologyIdListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface TopologyIdListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.TopologyIdList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.TopologyId topology_ids = 1;
@@ -14745,9 +14832,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.TopologyIdList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.TopologyIdList)
-    TopologyIdList extends // @@protoc_insertion_point(message_implements:context.TopologyIdList)
-    com.google.protobuf.GeneratedMessageV3 implements TopologyIdListOrBuilder {
+    public static final class TopologyIdList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.TopologyIdList)
+    TopologyIdListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -14962,9 +15048,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.TopologyIdList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.TopologyIdList)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.TopologyIdList)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.TopologyIdListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.TopologyIdList)
+        context.ContextOuterClass.TopologyIdListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_TopologyIdList_descriptor;
@@ -15431,8 +15516,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.TopologyList)
-    TopologyListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface TopologyListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.TopologyList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.Topology topologies = 1;
@@ -15463,9 +15548,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.TopologyList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.TopologyList)
-    TopologyList extends // @@protoc_insertion_point(message_implements:context.TopologyList)
-    com.google.protobuf.GeneratedMessageV3 implements TopologyListOrBuilder {
+    public static final class TopologyList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.TopologyList)
+    TopologyListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -15680,9 +15764,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.TopologyList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.TopologyList)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.TopologyList)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.TopologyListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.TopologyList)
+        context.ContextOuterClass.TopologyListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_TopologyList_descriptor;
@@ -16149,8 +16232,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.TopologyEvent)
-    TopologyEventOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface TopologyEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.TopologyEvent)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Event event = 1;
@@ -16190,9 +16273,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.TopologyEvent}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.TopologyEvent)
-    TopologyEvent extends // @@protoc_insertion_point(message_implements:context.TopologyEvent)
-    com.google.protobuf.GeneratedMessageV3 implements TopologyEventOrBuilder {
+    public static final class TopologyEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.TopologyEvent)
+    TopologyEventOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -16441,9 +16523,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.TopologyEvent}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.TopologyEvent)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.TopologyEvent)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.TopologyEventOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.TopologyEvent)
+        context.ContextOuterClass.TopologyEventOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_TopologyEvent_descriptor;
@@ -16889,8 +16970,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.DeviceId)
-    DeviceIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface DeviceIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.DeviceId)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid device_uuid = 1;
@@ -16917,9 +16998,8 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.DeviceId}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.DeviceId)
-    DeviceId extends // @@protoc_insertion_point(message_implements:context.DeviceId)
-    com.google.protobuf.GeneratedMessageV3 implements DeviceIdOrBuilder {
+    public static final class DeviceId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.DeviceId)
+    DeviceIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -17126,9 +17206,8 @@ public final class ContextOuterClass {
          *
          * Protobuf type {@code context.DeviceId}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.DeviceId)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.DeviceId)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.DeviceIdOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.DeviceId)
+        context.ContextOuterClass.DeviceIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_DeviceId_descriptor;
@@ -17438,8 +17517,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Device)
-    DeviceOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface DeviceOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Device)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.DeviceId device_id = 1;
@@ -17646,9 +17725,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Device}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Device)
-    Device extends // @@protoc_insertion_point(message_implements:context.Device)
-    com.google.protobuf.GeneratedMessageV3 implements DeviceOrBuilder {
+    public static final class Device extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Device)
+    DeviceOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -18312,9 +18390,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Device}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Device)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.Device)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.DeviceOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Device)
+        context.ContextOuterClass.DeviceOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Device_descriptor;
@@ -20025,8 +20102,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Component)
-    ComponentOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ComponentOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Component)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid component_uuid = 1;
@@ -20142,9 +20219,8 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.Component}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Component)
-    Component extends // @@protoc_insertion_point(message_implements:context.Component)
-    com.google.protobuf.GeneratedMessageV3 implements ComponentOrBuilder {
+    public static final class Component extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Component)
+    ComponentOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -20614,9 +20690,8 @@ public final class ContextOuterClass {
          *
          * Protobuf type {@code context.Component}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Component)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.Component)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ComponentOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Component)
+        context.ContextOuterClass.ComponentOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Component_descriptor;
@@ -21394,8 +21469,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.DeviceConfig)
-    DeviceConfigOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface DeviceConfigOrBuilder extends // @@protoc_insertion_point(interface_extends:context.DeviceConfig)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.ConfigRule config_rules = 1;
@@ -21426,9 +21501,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.DeviceConfig}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.DeviceConfig)
-    DeviceConfig extends // @@protoc_insertion_point(message_implements:context.DeviceConfig)
-    com.google.protobuf.GeneratedMessageV3 implements DeviceConfigOrBuilder {
+    public static final class DeviceConfig extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.DeviceConfig)
+    DeviceConfigOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -21643,9 +21717,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.DeviceConfig}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.DeviceConfig)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.DeviceConfig)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.DeviceConfigOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.DeviceConfig)
+        context.ContextOuterClass.DeviceConfigOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_DeviceConfig_descriptor;
@@ -22112,8 +22185,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.DeviceIdList)
-    DeviceIdListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface DeviceIdListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.DeviceIdList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.DeviceId device_ids = 1;
@@ -22144,9 +22217,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.DeviceIdList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.DeviceIdList)
-    DeviceIdList extends // @@protoc_insertion_point(message_implements:context.DeviceIdList)
-    com.google.protobuf.GeneratedMessageV3 implements DeviceIdListOrBuilder {
+    public static final class DeviceIdList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.DeviceIdList)
+    DeviceIdListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -22361,9 +22433,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.DeviceIdList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.DeviceIdList)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.DeviceIdList)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.DeviceIdListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.DeviceIdList)
+        context.ContextOuterClass.DeviceIdListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_DeviceIdList_descriptor;
@@ -22830,8 +22901,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.DeviceList)
-    DeviceListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface DeviceListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.DeviceList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.Device devices = 1;
@@ -22862,9 +22933,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.DeviceList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.DeviceList)
-    DeviceList extends // @@protoc_insertion_point(message_implements:context.DeviceList)
-    com.google.protobuf.GeneratedMessageV3 implements DeviceListOrBuilder {
+    public static final class DeviceList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.DeviceList)
+    DeviceListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -23079,9 +23149,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.DeviceList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.DeviceList)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.DeviceList)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.DeviceListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.DeviceList)
+        context.ContextOuterClass.DeviceListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_DeviceList_descriptor;
@@ -23548,8 +23617,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.DeviceFilter)
-    DeviceFilterOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface DeviceFilterOrBuilder extends // @@protoc_insertion_point(interface_extends:context.DeviceFilter)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.DeviceIdList device_ids = 1;
@@ -23590,9 +23659,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.DeviceFilter}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.DeviceFilter)
-    DeviceFilter extends // @@protoc_insertion_point(message_implements:context.DeviceFilter)
-    com.google.protobuf.GeneratedMessageV3 implements DeviceFilterOrBuilder {
+    public static final class DeviceFilter extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.DeviceFilter)
+    DeviceFilterOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -23864,9 +23932,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.DeviceFilter}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.DeviceFilter)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.DeviceFilter)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.DeviceFilterOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.DeviceFilter)
+        context.ContextOuterClass.DeviceFilterOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_DeviceFilter_descriptor;
@@ -24320,8 +24387,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.DeviceEvent)
-    DeviceEventOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface DeviceEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.DeviceEvent)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Event event = 1;
@@ -24378,9 +24445,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.DeviceEvent}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.DeviceEvent)
-    DeviceEvent extends // @@protoc_insertion_point(message_implements:context.DeviceEvent)
-    com.google.protobuf.GeneratedMessageV3 implements DeviceEventOrBuilder {
+    public static final class DeviceEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.DeviceEvent)
+    DeviceEventOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -24675,9 +24741,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.DeviceEvent}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.DeviceEvent)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.DeviceEvent)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.DeviceEventOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.DeviceEvent)
+        context.ContextOuterClass.DeviceEventOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_DeviceEvent_descriptor;
@@ -25259,8 +25324,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.LinkId)
-    LinkIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface LinkIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.LinkId)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid link_uuid = 1;
@@ -25287,9 +25352,8 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.LinkId}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.LinkId)
-    LinkId extends // @@protoc_insertion_point(message_implements:context.LinkId)
-    com.google.protobuf.GeneratedMessageV3 implements LinkIdOrBuilder {
+    public static final class LinkId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.LinkId)
+    LinkIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -25496,9 +25560,8 @@ public final class ContextOuterClass {
          *
          * Protobuf type {@code context.LinkId}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.LinkId)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.LinkId)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.LinkIdOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.LinkId)
+        context.ContextOuterClass.LinkIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_LinkId_descriptor;
@@ -25808,8 +25871,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.LinkAttributes)
-    LinkAttributesOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface LinkAttributesOrBuilder extends // @@protoc_insertion_point(interface_extends:context.LinkAttributes)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * bool is_bidirectional = 1;
@@ -25833,9 +25896,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.LinkAttributes}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.LinkAttributes)
-    LinkAttributes extends // @@protoc_insertion_point(message_implements:context.LinkAttributes)
-    com.google.protobuf.GeneratedMessageV3 implements LinkAttributesOrBuilder {
+    public static final class LinkAttributes extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.LinkAttributes)
+    LinkAttributesOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -26061,9 +26123,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.LinkAttributes}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.LinkAttributes)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.LinkAttributes)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.LinkAttributesOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.LinkAttributes)
+        context.ContextOuterClass.LinkAttributesOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_LinkAttributes_descriptor;
@@ -26381,8 +26442,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Link)
-    LinkOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface LinkOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Link)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.LinkId link_id = 1;
@@ -26471,9 +26532,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Link}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Link)
-    Link extends // @@protoc_insertion_point(message_implements:context.Link)
-    com.google.protobuf.GeneratedMessageV3 implements LinkOrBuilder {
+    public static final class Link extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Link)
+    LinkOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -26863,9 +26923,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Link}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Link)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.Link)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.LinkOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Link)
+        context.ContextOuterClass.LinkOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Link_descriptor;
@@ -27768,8 +27827,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.LinkIdList)
-    LinkIdListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface LinkIdListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.LinkIdList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.LinkId link_ids = 1;
@@ -27800,9 +27859,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.LinkIdList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.LinkIdList)
-    LinkIdList extends // @@protoc_insertion_point(message_implements:context.LinkIdList)
-    com.google.protobuf.GeneratedMessageV3 implements LinkIdListOrBuilder {
+    public static final class LinkIdList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.LinkIdList)
+    LinkIdListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -28017,9 +28075,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.LinkIdList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.LinkIdList)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.LinkIdList)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.LinkIdListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.LinkIdList)
+        context.ContextOuterClass.LinkIdListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_LinkIdList_descriptor;
@@ -28486,8 +28543,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.LinkList)
-    LinkListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface LinkListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.LinkList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.Link links = 1;
@@ -28518,9 +28575,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.LinkList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.LinkList)
-    LinkList extends // @@protoc_insertion_point(message_implements:context.LinkList)
-    com.google.protobuf.GeneratedMessageV3 implements LinkListOrBuilder {
+    public static final class LinkList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.LinkList)
+    LinkListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -28735,9 +28791,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.LinkList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.LinkList)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.LinkList)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.LinkListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.LinkList)
+        context.ContextOuterClass.LinkListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_LinkList_descriptor;
@@ -29204,8 +29259,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.LinkEvent)
-    LinkEventOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface LinkEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.LinkEvent)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Event event = 1;
@@ -29245,9 +29300,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.LinkEvent}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.LinkEvent)
-    LinkEvent extends // @@protoc_insertion_point(message_implements:context.LinkEvent)
-    com.google.protobuf.GeneratedMessageV3 implements LinkEventOrBuilder {
+    public static final class LinkEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.LinkEvent)
+    LinkEventOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -29496,9 +29550,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.LinkEvent}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.LinkEvent)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.LinkEvent)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.LinkEventOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.LinkEvent)
+        context.ContextOuterClass.LinkEventOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_LinkEvent_descriptor;
@@ -29944,8 +29997,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ServiceId)
-    ServiceIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ServiceIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ServiceId)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ContextId context_id = 1;
@@ -29989,9 +30042,8 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.ServiceId}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ServiceId)
-    ServiceId extends // @@protoc_insertion_point(message_implements:context.ServiceId)
-    com.google.protobuf.GeneratedMessageV3 implements ServiceIdOrBuilder {
+    public static final class ServiceId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ServiceId)
+    ServiceIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -30244,9 +30296,8 @@ public final class ContextOuterClass {
          *
          * Protobuf type {@code context.ServiceId}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ServiceId)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.ServiceId)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceIdOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ServiceId)
+        context.ContextOuterClass.ServiceIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ServiceId_descriptor;
@@ -30692,8 +30743,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Service)
-    ServiceOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ServiceOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Service)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ServiceId service_id = 1;
@@ -30841,9 +30892,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Service}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Service)
-    Service extends // @@protoc_insertion_point(message_implements:context.Service)
-    com.google.protobuf.GeneratedMessageV3 implements ServiceOrBuilder {
+    public static final class Service extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Service)
+    ServiceOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -31383,9 +31433,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Service}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Service)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.Service)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Service)
+        context.ContextOuterClass.ServiceOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Service_descriptor;
@@ -32849,8 +32898,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ServiceStatus)
-    ServiceStatusOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ServiceStatusOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ServiceStatus)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ServiceStatusEnum service_status = 1;
@@ -32868,9 +32917,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ServiceStatus}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ServiceStatus)
-    ServiceStatus extends // @@protoc_insertion_point(message_implements:context.ServiceStatus)
-    com.google.protobuf.GeneratedMessageV3 implements ServiceStatusOrBuilder {
+    public static final class ServiceStatus extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ServiceStatus)
+    ServiceStatusOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -33061,9 +33109,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ServiceStatus}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ServiceStatus)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.ServiceStatus)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceStatusOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ServiceStatus)
+        context.ContextOuterClass.ServiceStatusOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ServiceStatus_descriptor;
@@ -33310,8 +33357,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ServiceConfig)
-    ServiceConfigOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ServiceConfigOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ServiceConfig)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.ConfigRule config_rules = 1;
@@ -33342,9 +33389,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ServiceConfig}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ServiceConfig)
-    ServiceConfig extends // @@protoc_insertion_point(message_implements:context.ServiceConfig)
-    com.google.protobuf.GeneratedMessageV3 implements ServiceConfigOrBuilder {
+    public static final class ServiceConfig extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ServiceConfig)
+    ServiceConfigOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -33559,9 +33605,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ServiceConfig}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ServiceConfig)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.ServiceConfig)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceConfigOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ServiceConfig)
+        context.ContextOuterClass.ServiceConfigOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ServiceConfig_descriptor;
@@ -34028,8 +34073,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ServiceIdList)
-    ServiceIdListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ServiceIdListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ServiceIdList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.ServiceId service_ids = 1;
@@ -34060,9 +34105,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ServiceIdList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ServiceIdList)
-    ServiceIdList extends // @@protoc_insertion_point(message_implements:context.ServiceIdList)
-    com.google.protobuf.GeneratedMessageV3 implements ServiceIdListOrBuilder {
+    public static final class ServiceIdList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ServiceIdList)
+    ServiceIdListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -34277,9 +34321,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ServiceIdList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ServiceIdList)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.ServiceIdList)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceIdListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ServiceIdList)
+        context.ContextOuterClass.ServiceIdListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ServiceIdList_descriptor;
@@ -34746,8 +34789,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ServiceList)
-    ServiceListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ServiceListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ServiceList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.Service services = 1;
@@ -34778,9 +34821,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ServiceList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ServiceList)
-    ServiceList extends // @@protoc_insertion_point(message_implements:context.ServiceList)
-    com.google.protobuf.GeneratedMessageV3 implements ServiceListOrBuilder {
+    public static final class ServiceList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ServiceList)
+    ServiceListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -34995,9 +35037,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ServiceList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ServiceList)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.ServiceList)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ServiceList)
+        context.ContextOuterClass.ServiceListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ServiceList_descriptor;
@@ -35464,8 +35505,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ServiceFilter)
-    ServiceFilterOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ServiceFilterOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ServiceFilter)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ServiceIdList service_ids = 1;
@@ -35506,9 +35547,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ServiceFilter}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ServiceFilter)
-    ServiceFilter extends // @@protoc_insertion_point(message_implements:context.ServiceFilter)
-    com.google.protobuf.GeneratedMessageV3 implements ServiceFilterOrBuilder {
+    public static final class ServiceFilter extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ServiceFilter)
+    ServiceFilterOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -35780,9 +35820,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ServiceFilter}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ServiceFilter)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.ServiceFilter)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceFilterOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ServiceFilter)
+        context.ContextOuterClass.ServiceFilterOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ServiceFilter_descriptor;
@@ -36236,8 +36275,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ServiceEvent)
-    ServiceEventOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ServiceEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ServiceEvent)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Event event = 1;
@@ -36277,9 +36316,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ServiceEvent}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ServiceEvent)
-    ServiceEvent extends // @@protoc_insertion_point(message_implements:context.ServiceEvent)
-    com.google.protobuf.GeneratedMessageV3 implements ServiceEventOrBuilder {
+    public static final class ServiceEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ServiceEvent)
+    ServiceEventOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -36528,9 +36566,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ServiceEvent}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ServiceEvent)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.ServiceEvent)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceEventOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ServiceEvent)
+        context.ContextOuterClass.ServiceEventOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ServiceEvent_descriptor;
@@ -36976,8 +37013,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.SliceId)
-    SliceIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface SliceIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.SliceId)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ContextId context_id = 1;
@@ -37021,9 +37058,8 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.SliceId}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.SliceId)
-    SliceId extends // @@protoc_insertion_point(message_implements:context.SliceId)
-    com.google.protobuf.GeneratedMessageV3 implements SliceIdOrBuilder {
+    public static final class SliceId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.SliceId)
+    SliceIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -37276,9 +37312,8 @@ public final class ContextOuterClass {
          *
          * Protobuf type {@code context.SliceId}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.SliceId)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.SliceId)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceIdOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.SliceId)
+        context.ContextOuterClass.SliceIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_SliceId_descriptor;
@@ -37724,8 +37759,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Slice)
-    SliceOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface SliceOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Slice)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.SliceId slice_id = 1;
@@ -37928,9 +37963,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Slice}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Slice)
-    Slice extends // @@protoc_insertion_point(message_implements:context.Slice)
-    com.google.protobuf.GeneratedMessageV3 implements SliceOrBuilder {
+    public static final class Slice extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Slice)
+    SliceOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -38598,9 +38632,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Slice}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Slice)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.Slice)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Slice)
+        context.ContextOuterClass.SliceOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Slice_descriptor;
@@ -40705,8 +40738,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.SliceOwner)
-    SliceOwnerOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface SliceOwnerOrBuilder extends // @@protoc_insertion_point(interface_extends:context.SliceOwner)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid owner_uuid = 1;
@@ -40741,9 +40774,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.SliceOwner}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.SliceOwner)
-    SliceOwner extends // @@protoc_insertion_point(message_implements:context.SliceOwner)
-    com.google.protobuf.GeneratedMessageV3 implements SliceOwnerOrBuilder {
+    public static final class SliceOwner extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.SliceOwner)
+    SliceOwnerOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -40995,9 +41027,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.SliceOwner}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.SliceOwner)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.SliceOwner)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceOwnerOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.SliceOwner)
+        context.ContextOuterClass.SliceOwnerOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_SliceOwner_descriptor;
@@ -41398,8 +41429,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.SliceStatus)
-    SliceStatusOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface SliceStatusOrBuilder extends // @@protoc_insertion_point(interface_extends:context.SliceStatus)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.SliceStatusEnum slice_status = 1;
@@ -41417,9 +41448,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.SliceStatus}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.SliceStatus)
-    SliceStatus extends // @@protoc_insertion_point(message_implements:context.SliceStatus)
-    com.google.protobuf.GeneratedMessageV3 implements SliceStatusOrBuilder {
+    public static final class SliceStatus extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.SliceStatus)
+    SliceStatusOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -41610,9 +41640,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.SliceStatus}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.SliceStatus)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.SliceStatus)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceStatusOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.SliceStatus)
+        context.ContextOuterClass.SliceStatusOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_SliceStatus_descriptor;
@@ -41859,8 +41888,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.SliceConfig)
-    SliceConfigOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface SliceConfigOrBuilder extends // @@protoc_insertion_point(interface_extends:context.SliceConfig)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.ConfigRule config_rules = 1;
@@ -41891,9 +41920,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.SliceConfig}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.SliceConfig)
-    SliceConfig extends // @@protoc_insertion_point(message_implements:context.SliceConfig)
-    com.google.protobuf.GeneratedMessageV3 implements SliceConfigOrBuilder {
+    public static final class SliceConfig extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.SliceConfig)
+    SliceConfigOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -42108,9 +42136,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.SliceConfig}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.SliceConfig)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.SliceConfig)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceConfigOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.SliceConfig)
+        context.ContextOuterClass.SliceConfigOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_SliceConfig_descriptor;
@@ -42577,8 +42604,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.SliceIdList)
-    SliceIdListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface SliceIdListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.SliceIdList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.SliceId slice_ids = 1;
@@ -42609,9 +42636,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.SliceIdList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.SliceIdList)
-    SliceIdList extends // @@protoc_insertion_point(message_implements:context.SliceIdList)
-    com.google.protobuf.GeneratedMessageV3 implements SliceIdListOrBuilder {
+    public static final class SliceIdList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.SliceIdList)
+    SliceIdListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -42826,9 +42852,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.SliceIdList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.SliceIdList)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.SliceIdList)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceIdListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.SliceIdList)
+        context.ContextOuterClass.SliceIdListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_SliceIdList_descriptor;
@@ -43295,8 +43320,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.SliceList)
-    SliceListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface SliceListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.SliceList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.Slice slices = 1;
@@ -43327,9 +43352,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.SliceList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.SliceList)
-    SliceList extends // @@protoc_insertion_point(message_implements:context.SliceList)
-    com.google.protobuf.GeneratedMessageV3 implements SliceListOrBuilder {
+    public static final class SliceList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.SliceList)
+    SliceListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -43544,9 +43568,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.SliceList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.SliceList)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.SliceList)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.SliceList)
+        context.ContextOuterClass.SliceListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_SliceList_descriptor;
@@ -44013,8 +44036,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.SliceFilter)
-    SliceFilterOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface SliceFilterOrBuilder extends // @@protoc_insertion_point(interface_extends:context.SliceFilter)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.SliceIdList slice_ids = 1;
@@ -44067,9 +44090,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.SliceFilter}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.SliceFilter)
-    SliceFilter extends // @@protoc_insertion_point(message_implements:context.SliceFilter)
-    com.google.protobuf.GeneratedMessageV3 implements SliceFilterOrBuilder {
+    public static final class SliceFilter extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.SliceFilter)
+    SliceFilterOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -44387,9 +44409,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.SliceFilter}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.SliceFilter)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.SliceFilter)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceFilterOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.SliceFilter)
+        context.ContextOuterClass.SliceFilterOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_SliceFilter_descriptor;
@@ -44939,8 +44960,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.SliceEvent)
-    SliceEventOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface SliceEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.SliceEvent)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Event event = 1;
@@ -44980,9 +45001,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.SliceEvent}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.SliceEvent)
-    SliceEvent extends // @@protoc_insertion_point(message_implements:context.SliceEvent)
-    com.google.protobuf.GeneratedMessageV3 implements SliceEventOrBuilder {
+    public static final class SliceEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.SliceEvent)
+    SliceEventOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -45231,9 +45251,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.SliceEvent}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.SliceEvent)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.SliceEvent)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceEventOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.SliceEvent)
+        context.ContextOuterClass.SliceEventOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_SliceEvent_descriptor;
@@ -45679,8 +45698,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ConnectionId)
-    ConnectionIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ConnectionIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionId)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid connection_uuid = 1;
@@ -45707,9 +45726,8 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.ConnectionId}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ConnectionId)
-    ConnectionId extends // @@protoc_insertion_point(message_implements:context.ConnectionId)
-    com.google.protobuf.GeneratedMessageV3 implements ConnectionIdOrBuilder {
+    public static final class ConnectionId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionId)
+    ConnectionIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -45916,9 +45934,8 @@ public final class ContextOuterClass {
          *
          * Protobuf type {@code context.ConnectionId}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionId)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.ConnectionId)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionIdOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionId)
+        context.ContextOuterClass.ConnectionIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConnectionId_descriptor;
@@ -46228,8 +46245,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L0)
-    ConnectionSettings_L0OrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ConnectionSettings_L0OrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L0)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * string lsp_symbolic_name = 1;
@@ -46247,9 +46264,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConnectionSettings_L0}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L0)
-    ConnectionSettings_L0 extends // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L0)
-    com.google.protobuf.GeneratedMessageV3 implements ConnectionSettings_L0OrBuilder {
+    public static final class ConnectionSettings_L0 extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L0)
+    ConnectionSettings_L0OrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -46455,9 +46471,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConnectionSettings_L0}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L0)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L0)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionSettings_L0OrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L0)
+        context.ContextOuterClass.ConnectionSettings_L0OrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConnectionSettings_L0_descriptor;
@@ -46722,8 +46737,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L2)
-    ConnectionSettings_L2OrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ConnectionSettings_L2OrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L2)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * string src_mac_address = 1;
@@ -46777,9 +46792,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConnectionSettings_L2}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L2)
-    ConnectionSettings_L2 extends // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L2)
-    com.google.protobuf.GeneratedMessageV3 implements ConnectionSettings_L2OrBuilder {
+    public static final class ConnectionSettings_L2 extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L2)
+    ConnectionSettings_L2OrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -47126,9 +47140,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConnectionSettings_L2}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L2)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L2)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionSettings_L2OrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L2)
+        context.ContextOuterClass.ConnectionSettings_L2OrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConnectionSettings_L2_descriptor;
@@ -47676,8 +47689,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L3)
-    ConnectionSettings_L3OrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ConnectionSettings_L3OrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L3)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * string src_ip_address = 1;
@@ -47725,9 +47738,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConnectionSettings_L3}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L3)
-    ConnectionSettings_L3 extends // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L3)
-    com.google.protobuf.GeneratedMessageV3 implements ConnectionSettings_L3OrBuilder {
+    public static final class ConnectionSettings_L3 extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L3)
+    ConnectionSettings_L3OrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -48051,9 +48063,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConnectionSettings_L3}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L3)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L3)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionSettings_L3OrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L3)
+        context.ContextOuterClass.ConnectionSettings_L3OrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConnectionSettings_L3_descriptor;
@@ -48553,8 +48564,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L4)
-    ConnectionSettings_L4OrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ConnectionSettings_L4OrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L4)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * uint32 src_port = 1;
@@ -48584,9 +48595,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConnectionSettings_L4}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L4)
-    ConnectionSettings_L4 extends // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L4)
-    com.google.protobuf.GeneratedMessageV3 implements ConnectionSettings_L4OrBuilder {
+    public static final class ConnectionSettings_L4 extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L4)
+    ConnectionSettings_L4OrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -48835,9 +48845,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConnectionSettings_L4}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L4)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L4)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionSettings_L4OrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L4)
+        context.ContextOuterClass.ConnectionSettings_L4OrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConnectionSettings_L4_descriptor;
@@ -49203,8 +49212,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ConnectionSettings)
-    ConnectionSettingsOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ConnectionSettingsOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionSettings)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ConnectionSettings_L0 l0 = 1;
@@ -49278,9 +49287,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConnectionSettings}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ConnectionSettings)
-    ConnectionSettings extends // @@protoc_insertion_point(message_implements:context.ConnectionSettings)
-    com.google.protobuf.GeneratedMessageV3 implements ConnectionSettingsOrBuilder {
+    public static final class ConnectionSettings extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionSettings)
+    ConnectionSettingsOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -49621,9 +49629,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConnectionSettings}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionSettings)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.ConnectionSettings)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionSettingsOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionSettings)
+        context.ContextOuterClass.ConnectionSettingsOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConnectionSettings_descriptor;
@@ -50341,8 +50348,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Connection)
-    ConnectionOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ConnectionOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Connection)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ConnectionId connection_id = 1;
@@ -50449,9 +50456,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Connection}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Connection)
-    Connection extends // @@protoc_insertion_point(message_implements:context.Connection)
-    com.google.protobuf.GeneratedMessageV3 implements ConnectionOrBuilder {
+    public static final class Connection extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Connection)
+    ConnectionOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -50862,9 +50868,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Connection}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Connection)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.Connection)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Connection)
+        context.ContextOuterClass.ConnectionOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Connection_descriptor;
@@ -52028,8 +52033,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ConnectionIdList)
-    ConnectionIdListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ConnectionIdListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionIdList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.ConnectionId connection_ids = 1;
@@ -52060,9 +52065,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConnectionIdList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ConnectionIdList)
-    ConnectionIdList extends // @@protoc_insertion_point(message_implements:context.ConnectionIdList)
-    com.google.protobuf.GeneratedMessageV3 implements ConnectionIdListOrBuilder {
+    public static final class ConnectionIdList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionIdList)
+    ConnectionIdListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -52277,9 +52281,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConnectionIdList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionIdList)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.ConnectionIdList)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionIdListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionIdList)
+        context.ContextOuterClass.ConnectionIdListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConnectionIdList_descriptor;
@@ -52746,8 +52749,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ConnectionList)
-    ConnectionListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ConnectionListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.Connection connections = 1;
@@ -52778,9 +52781,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConnectionList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ConnectionList)
-    ConnectionList extends // @@protoc_insertion_point(message_implements:context.ConnectionList)
-    com.google.protobuf.GeneratedMessageV3 implements ConnectionListOrBuilder {
+    public static final class ConnectionList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionList)
+    ConnectionListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -52995,9 +52997,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConnectionList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionList)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.ConnectionList)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionList)
+        context.ContextOuterClass.ConnectionListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConnectionList_descriptor;
@@ -53464,8 +53465,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ConnectionEvent)
-    ConnectionEventOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ConnectionEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionEvent)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Event event = 1;
@@ -53505,9 +53506,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConnectionEvent}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ConnectionEvent)
-    ConnectionEvent extends // @@protoc_insertion_point(message_implements:context.ConnectionEvent)
-    com.google.protobuf.GeneratedMessageV3 implements ConnectionEventOrBuilder {
+    public static final class ConnectionEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionEvent)
+    ConnectionEventOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -53756,9 +53756,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConnectionEvent}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionEvent)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.ConnectionEvent)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionEventOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionEvent)
+        context.ContextOuterClass.ConnectionEventOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConnectionEvent_descriptor;
@@ -54204,8 +54203,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.EndPointId)
-    EndPointIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface EndPointIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.EndPointId)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.TopologyId topology_id = 1;
@@ -54266,9 +54265,8 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.EndPointId}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.EndPointId)
-    EndPointId extends // @@protoc_insertion_point(message_implements:context.EndPointId)
-    com.google.protobuf.GeneratedMessageV3 implements EndPointIdOrBuilder {
+    public static final class EndPointId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.EndPointId)
+    EndPointIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -54567,9 +54565,8 @@ public final class ContextOuterClass {
          *
          * Protobuf type {@code context.EndPointId}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.EndPointId)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.EndPointId)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.EndPointIdOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.EndPointId)
+        context.ContextOuterClass.EndPointIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_EndPointId_descriptor;
@@ -55151,8 +55148,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.EndPoint)
-    EndPointOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface EndPointOrBuilder extends // @@protoc_insertion_point(interface_extends:context.EndPoint)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.EndPointId endpoint_id = 1;
@@ -55281,9 +55278,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.EndPoint}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.EndPoint)
-    EndPoint extends // @@protoc_insertion_point(message_implements:context.EndPoint)
-    com.google.protobuf.GeneratedMessageV3 implements EndPointOrBuilder {
+    public static final class EndPoint extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.EndPoint)
+    EndPointOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -55819,9 +55815,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.EndPoint}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.EndPoint)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.EndPoint)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.EndPointOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.EndPoint)
+        context.ContextOuterClass.EndPointOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_EndPoint_descriptor;
@@ -56804,8 +56799,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.EndPointName)
-    EndPointNameOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface EndPointNameOrBuilder extends // @@protoc_insertion_point(interface_extends:context.EndPointName)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.EndPointId endpoint_id = 1;
@@ -56864,9 +56859,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.EndPointName}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.EndPointName)
-    EndPointName extends // @@protoc_insertion_point(message_implements:context.EndPointName)
-    com.google.protobuf.GeneratedMessageV3 implements EndPointNameOrBuilder {
+    public static final class EndPointName extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.EndPointName)
+    EndPointNameOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -57216,9 +57210,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.EndPointName}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.EndPointName)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.EndPointName)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.EndPointNameOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.EndPointName)
+        context.ContextOuterClass.EndPointNameOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_EndPointName_descriptor;
@@ -57801,8 +57794,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.EndPointIdList)
-    EndPointIdListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface EndPointIdListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.EndPointIdList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.EndPointId endpoint_ids = 1;
@@ -57833,9 +57826,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.EndPointIdList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.EndPointIdList)
-    EndPointIdList extends // @@protoc_insertion_point(message_implements:context.EndPointIdList)
-    com.google.protobuf.GeneratedMessageV3 implements EndPointIdListOrBuilder {
+    public static final class EndPointIdList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.EndPointIdList)
+    EndPointIdListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -58050,9 +58042,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.EndPointIdList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.EndPointIdList)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.EndPointIdList)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.EndPointIdListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.EndPointIdList)
+        context.ContextOuterClass.EndPointIdListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_EndPointIdList_descriptor;
@@ -58519,8 +58510,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.EndPointNameList)
-    EndPointNameListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface EndPointNameListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.EndPointNameList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.EndPointName endpoint_names = 1;
@@ -58551,9 +58542,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.EndPointNameList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.EndPointNameList)
-    EndPointNameList extends // @@protoc_insertion_point(message_implements:context.EndPointNameList)
-    com.google.protobuf.GeneratedMessageV3 implements EndPointNameListOrBuilder {
+    public static final class EndPointNameList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.EndPointNameList)
+    EndPointNameListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -58768,9 +58758,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.EndPointNameList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.EndPointNameList)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.EndPointNameList)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.EndPointNameListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.EndPointNameList)
+        context.ContextOuterClass.EndPointNameListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_EndPointNameList_descriptor;
@@ -59237,8 +59226,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ConfigRule_Custom)
-    ConfigRule_CustomOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ConfigRule_CustomOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConfigRule_Custom)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * string resource_key = 1;
@@ -59268,9 +59257,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConfigRule_Custom}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ConfigRule_Custom)
-    ConfigRule_Custom extends // @@protoc_insertion_point(message_implements:context.ConfigRule_Custom)
-    com.google.protobuf.GeneratedMessageV3 implements ConfigRule_CustomOrBuilder {
+    public static final class ConfigRule_Custom extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConfigRule_Custom)
+    ConfigRule_CustomOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -59525,9 +59513,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConfigRule_Custom}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ConfigRule_Custom)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.ConfigRule_Custom)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConfigRule_CustomOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConfigRule_Custom)
+        context.ContextOuterClass.ConfigRule_CustomOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConfigRule_Custom_descriptor;
@@ -59883,8 +59870,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ConfigRule_ACL)
-    ConfigRule_ACLOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ConfigRule_ACLOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConfigRule_ACL)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.EndPointId endpoint_id = 1;
@@ -59904,19 +59891,31 @@ public final class ContextOuterClass {
         context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder();
 
         /**
-         * .acl.AclRuleSet rule_set = 2;
+         * .context.AclDirectionEnum direction = 2;
+         * @return The enum numeric value on the wire for direction.
+         */
+        int getDirectionValue();
+
+        /**
+         * .context.AclDirectionEnum direction = 2;
+         * @return The direction.
+         */
+        context.ContextOuterClass.AclDirectionEnum getDirection();
+
+        /**
+         * .acl.AclRuleSet rule_set = 3;
          * @return Whether the ruleSet field is set.
          */
         boolean hasRuleSet();
 
         /**
-         * .acl.AclRuleSet rule_set = 2;
+         * .acl.AclRuleSet rule_set = 3;
          * @return The ruleSet.
          */
         acl.Acl.AclRuleSet getRuleSet();
 
         /**
-         * .acl.AclRuleSet rule_set = 2;
+         * .acl.AclRuleSet rule_set = 3;
          */
         acl.Acl.AclRuleSetOrBuilder getRuleSetOrBuilder();
     }
@@ -59924,9 +59923,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConfigRule_ACL}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ConfigRule_ACL)
-    ConfigRule_ACL extends // @@protoc_insertion_point(message_implements:context.ConfigRule_ACL)
-    com.google.protobuf.GeneratedMessageV3 implements ConfigRule_ACLOrBuilder {
+    public static final class ConfigRule_ACL extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConfigRule_ACL)
+    ConfigRule_ACLOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -59936,6 +59934,7 @@ public final class ContextOuterClass {
         }
 
         private ConfigRule_ACL() {
+            direction_ = 0;
         }
 
         @java.lang.Override
@@ -59983,12 +59982,35 @@ public final class ContextOuterClass {
             return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
         }
 
-        public static final int RULE_SET_FIELD_NUMBER = 2;
+        public static final int DIRECTION_FIELD_NUMBER = 2;
+
+        private int direction_ = 0;
+
+        /**
+         * .context.AclDirectionEnum direction = 2;
+         * @return The enum numeric value on the wire for direction.
+         */
+        @java.lang.Override
+        public int getDirectionValue() {
+            return direction_;
+        }
+
+        /**
+         * .context.AclDirectionEnum direction = 2;
+         * @return The direction.
+         */
+        @java.lang.Override
+        public context.ContextOuterClass.AclDirectionEnum getDirection() {
+            context.ContextOuterClass.AclDirectionEnum result = context.ContextOuterClass.AclDirectionEnum.forNumber(direction_);
+            return result == null ? context.ContextOuterClass.AclDirectionEnum.UNRECOGNIZED : result;
+        }
+
+        public static final int RULE_SET_FIELD_NUMBER = 3;
 
         private acl.Acl.AclRuleSet ruleSet_;
 
         /**
-         * .acl.AclRuleSet rule_set = 2;
+         * .acl.AclRuleSet rule_set = 3;
          * @return Whether the ruleSet field is set.
          */
         @java.lang.Override
@@ -59997,7 +60019,7 @@ public final class ContextOuterClass {
         }
 
         /**
-         * .acl.AclRuleSet rule_set = 2;
+         * .acl.AclRuleSet rule_set = 3;
          * @return The ruleSet.
          */
         @java.lang.Override
@@ -60006,7 +60028,7 @@ public final class ContextOuterClass {
         }
 
         /**
-         * .acl.AclRuleSet rule_set = 2;
+         * .acl.AclRuleSet rule_set = 3;
          */
         @java.lang.Override
         public acl.Acl.AclRuleSetOrBuilder getRuleSetOrBuilder() {
@@ -60031,8 +60053,11 @@ public final class ContextOuterClass {
             if (endpointId_ != null) {
                 output.writeMessage(1, getEndpointId());
             }
+            if (direction_ != context.ContextOuterClass.AclDirectionEnum.ACLDIRECTION_BOTH.getNumber()) {
+                output.writeEnum(2, direction_);
+            }
             if (ruleSet_ != null) {
-                output.writeMessage(2, getRuleSet());
+                output.writeMessage(3, getRuleSet());
             }
             getUnknownFields().writeTo(output);
         }
@@ -60046,8 +60071,11 @@ public final class ContextOuterClass {
             if (endpointId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getEndpointId());
             }
+            if (direction_ != context.ContextOuterClass.AclDirectionEnum.ACLDIRECTION_BOTH.getNumber()) {
+                size += com.google.protobuf.CodedOutputStream.computeEnumSize(2, direction_);
+            }
             if (ruleSet_ != null) {
-                size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getRuleSet());
+                size += com.google.protobuf.CodedOutputStream.computeMessageSize(3, getRuleSet());
             }
             size += getUnknownFields().getSerializedSize();
             memoizedSize = size;
@@ -60069,6 +60097,8 @@ public final class ContextOuterClass {
                 if (!getEndpointId().equals(other.getEndpointId()))
                     return false;
             }
+            if (direction_ != other.direction_)
+                return false;
             if (hasRuleSet() != other.hasRuleSet())
                 return false;
             if (hasRuleSet()) {
@@ -60091,6 +60121,8 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + ENDPOINT_ID_FIELD_NUMBER;
                 hash = (53 * hash) + getEndpointId().hashCode();
             }
+            hash = (37 * hash) + DIRECTION_FIELD_NUMBER;
+            hash = (53 * hash) + direction_;
             if (hasRuleSet()) {
                 hash = (37 * hash) + RULE_SET_FIELD_NUMBER;
                 hash = (53 * hash) + getRuleSet().hashCode();
@@ -60175,9 +60207,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConfigRule_ACL}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ConfigRule_ACL)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.ConfigRule_ACL)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConfigRule_ACLOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConfigRule_ACL)
+        context.ContextOuterClass.ConfigRule_ACLOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConfigRule_ACL_descriptor;
@@ -60205,6 +60236,7 @@ public final class ContextOuterClass {
                     endpointIdBuilder_.dispose();
                     endpointIdBuilder_ = null;
                 }
+                direction_ = 0;
                 ruleSet_ = null;
                 if (ruleSetBuilder_ != null) {
                     ruleSetBuilder_.dispose();
@@ -60248,6 +60280,9 @@ public final class ContextOuterClass {
                     result.endpointId_ = endpointIdBuilder_ == null ? endpointId_ : endpointIdBuilder_.build();
                 }
                 if (((from_bitField0_ & 0x00000002) != 0)) {
+                    result.direction_ = direction_;
+                }
+                if (((from_bitField0_ & 0x00000004) != 0)) {
                     result.ruleSet_ = ruleSetBuilder_ == null ? ruleSet_ : ruleSetBuilder_.build();
                 }
             }
@@ -60268,6 +60303,9 @@ public final class ContextOuterClass {
                 if (other.hasEndpointId()) {
                     mergeEndpointId(other.getEndpointId());
                 }
+                if (other.direction_ != 0) {
+                    setDirectionValue(other.getDirectionValue());
+                }
                 if (other.hasRuleSet()) {
                     mergeRuleSet(other.getRuleSet());
                 }
@@ -60301,13 +60339,20 @@ public final class ContextOuterClass {
                                     break;
                                 }
                             // case 10
-                            case 18:
+                            case 16:
                                 {
-                                    input.readMessage(getRuleSetFieldBuilder().getBuilder(), extensionRegistry);
+                                    direction_ = input.readEnum();
                                     bitField0_ |= 0x00000002;
                                     break;
                                 }
-                            // case 18
+                            // case 16
+                            case 26:
+                                {
+                                    input.readMessage(getRuleSetFieldBuilder().getBuilder(), extensionRegistry);
+                                    bitField0_ |= 0x00000004;
+                                    break;
+                                }
+                            // case 26
                             default:
                                 {
                                     if (!super.parseUnknownField(input, extensionRegistry, tag)) {
@@ -60449,20 +60494,79 @@ public final class ContextOuterClass {
                 return endpointIdBuilder_;
             }
 
+            private int direction_ = 0;
+
+            /**
+             * .context.AclDirectionEnum direction = 2;
+             * @return The enum numeric value on the wire for direction.
+             */
+            @java.lang.Override
+            public int getDirectionValue() {
+                return direction_;
+            }
+
+            /**
+             * .context.AclDirectionEnum direction = 2;
+             * @param value The enum numeric value on the wire for direction to set.
+             * @return This builder for chaining.
+             */
+            public Builder setDirectionValue(int value) {
+                direction_ = value;
+                bitField0_ |= 0x00000002;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .context.AclDirectionEnum direction = 2;
+             * @return The direction.
+             */
+            @java.lang.Override
+            public context.ContextOuterClass.AclDirectionEnum getDirection() {
+                context.ContextOuterClass.AclDirectionEnum result = context.ContextOuterClass.AclDirectionEnum.forNumber(direction_);
+                return result == null ? context.ContextOuterClass.AclDirectionEnum.UNRECOGNIZED : result;
+            }
+
+            /**
+             * .context.AclDirectionEnum direction = 2;
+             * @param value The direction to set.
+             * @return This builder for chaining.
+             */
+            public Builder setDirection(context.ContextOuterClass.AclDirectionEnum value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                bitField0_ |= 0x00000002;
+                direction_ = value.getNumber();
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .context.AclDirectionEnum direction = 2;
+             * @return This builder for chaining.
+             */
+            public Builder clearDirection() {
+                bitField0_ = (bitField0_ & ~0x00000002);
+                direction_ = 0;
+                onChanged();
+                return this;
+            }
+
             private acl.Acl.AclRuleSet ruleSet_;
 
             private com.google.protobuf.SingleFieldBuilderV3 ruleSetBuilder_;
 
             /**
-             * .acl.AclRuleSet rule_set = 2;
+             * .acl.AclRuleSet rule_set = 3;
              * @return Whether the ruleSet field is set.
              */
             public boolean hasRuleSet() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return ((bitField0_ & 0x00000004) != 0);
             }
 
             /**
-             * .acl.AclRuleSet rule_set = 2;
+             * .acl.AclRuleSet rule_set = 3;
              * @return The ruleSet.
              */
             public acl.Acl.AclRuleSet getRuleSet() {
@@ -60474,7 +60578,7 @@ public final class ContextOuterClass {
             }
 
             /**
-             * .acl.AclRuleSet rule_set = 2;
+             * .acl.AclRuleSet rule_set = 3;
              */
             public Builder setRuleSet(acl.Acl.AclRuleSet value) {
                 if (ruleSetBuilder_ == null) {
@@ -60485,13 +60589,13 @@ public final class ContextOuterClass {
                 } else {
                     ruleSetBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
+                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
 
             /**
-             * .acl.AclRuleSet rule_set = 2;
+             * .acl.AclRuleSet rule_set = 3;
              */
             public Builder setRuleSet(acl.Acl.AclRuleSet.Builder builderForValue) {
                 if (ruleSetBuilder_ == null) {
@@ -60499,17 +60603,17 @@ public final class ContextOuterClass {
                 } else {
                     ruleSetBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
+                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
 
             /**
-             * .acl.AclRuleSet rule_set = 2;
+             * .acl.AclRuleSet rule_set = 3;
              */
             public Builder mergeRuleSet(acl.Acl.AclRuleSet value) {
                 if (ruleSetBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && ruleSet_ != null && ruleSet_ != acl.Acl.AclRuleSet.getDefaultInstance()) {
+                    if (((bitField0_ & 0x00000004) != 0) && ruleSet_ != null && ruleSet_ != acl.Acl.AclRuleSet.getDefaultInstance()) {
                         getRuleSetBuilder().mergeFrom(value);
                     } else {
                         ruleSet_ = value;
@@ -60517,16 +60621,16 @@ public final class ContextOuterClass {
                 } else {
                     ruleSetBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
+                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
 
             /**
-             * .acl.AclRuleSet rule_set = 2;
+             * .acl.AclRuleSet rule_set = 3;
              */
             public Builder clearRuleSet() {
-                bitField0_ = (bitField0_ & ~0x00000002);
+                bitField0_ = (bitField0_ & ~0x00000004);
                 ruleSet_ = null;
                 if (ruleSetBuilder_ != null) {
                     ruleSetBuilder_.dispose();
@@ -60537,16 +60641,16 @@ public final class ContextOuterClass {
             }
 
             /**
-             * .acl.AclRuleSet rule_set = 2;
+             * .acl.AclRuleSet rule_set = 3;
              */
             public acl.Acl.AclRuleSet.Builder getRuleSetBuilder() {
-                bitField0_ |= 0x00000002;
+                bitField0_ |= 0x00000004;
                 onChanged();
                 return getRuleSetFieldBuilder().getBuilder();
             }
 
             /**
-             * .acl.AclRuleSet rule_set = 2;
+             * .acl.AclRuleSet rule_set = 3;
              */
             public acl.Acl.AclRuleSetOrBuilder getRuleSetOrBuilder() {
                 if (ruleSetBuilder_ != null) {
@@ -60557,7 +60661,7 @@ public final class ContextOuterClass {
             }
 
             /**
-             * .acl.AclRuleSet rule_set = 2;
+             * .acl.AclRuleSet rule_set = 3;
              */
             private com.google.protobuf.SingleFieldBuilderV3 getRuleSetFieldBuilder() {
                 if (ruleSetBuilder_ == null) {
@@ -62317,9 +62421,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConfigRule_IP_LINK}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ConfigRule_IP_LINK)
-    ConfigRule_IP_LINK extends // @@protoc_insertion_point(message_implements:context.ConfigRule_IP_LINK)
-    com.google.protobuf.GeneratedMessageV3 implements ConfigRule_IP_LINKOrBuilder {
+    public static final class ConfigRule_IP_LINK extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConfigRule_IP_LINK)
+    ConfigRule_IP_LINKOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -62568,9 +62671,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConfigRule_IP_LINK}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ConfigRule_IP_LINK)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.ConfigRule_IP_LINK)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConfigRule_IP_LINKOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConfigRule_IP_LINK)
+        context.ContextOuterClass.ConfigRule_IP_LINKOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConfigRule_IP_LINK_descriptor;
@@ -63016,8 +63118,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ConfigRule)
-    ConfigRuleOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ConfigRuleOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConfigRule)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ConfigActionEnum action = 1;
@@ -63122,9 +63224,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConfigRule}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ConfigRule)
-    ConfigRule extends // @@protoc_insertion_point(message_implements:context.ConfigRule)
-    com.google.protobuf.GeneratedMessageV3 implements ConfigRuleOrBuilder {
+    public static final class ConfigRule extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConfigRule)
+    ConfigRuleOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -63623,9 +63724,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConfigRule}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ConfigRule)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.ConfigRule)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConfigRuleOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConfigRule)
+        context.ContextOuterClass.ConfigRuleOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConfigRule_descriptor;
@@ -64696,8 +64796,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Constraint_Custom)
-    Constraint_CustomOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface Constraint_CustomOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_Custom)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * string constraint_type = 1;
@@ -64727,9 +64827,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Constraint_Custom}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Constraint_Custom)
-    Constraint_Custom extends // @@protoc_insertion_point(message_implements:context.Constraint_Custom)
-    com.google.protobuf.GeneratedMessageV3 implements Constraint_CustomOrBuilder {
+    public static final class Constraint_Custom extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_Custom)
+    Constraint_CustomOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -64984,9 +65083,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Constraint_Custom}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_Custom)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.Constraint_Custom)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_CustomOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_Custom)
+        context.ContextOuterClass.Constraint_CustomOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Constraint_Custom_descriptor;
@@ -65342,8 +65440,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Constraint_Schedule)
-    Constraint_ScheduleOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface Constraint_ScheduleOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_Schedule)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * double start_timestamp = 1;
@@ -65361,9 +65459,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Constraint_Schedule}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Constraint_Schedule)
-    Constraint_Schedule extends // @@protoc_insertion_point(message_implements:context.Constraint_Schedule)
-    com.google.protobuf.GeneratedMessageV3 implements Constraint_ScheduleOrBuilder {
+    public static final class Constraint_Schedule extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_Schedule)
+    Constraint_ScheduleOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -65566,9 +65663,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Constraint_Schedule}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_Schedule)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.Constraint_Schedule)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_ScheduleOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_Schedule)
+        context.ContextOuterClass.Constraint_ScheduleOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Constraint_Schedule_descriptor;
@@ -65838,8 +65934,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.GPS_Position)
-    GPS_PositionOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface GPS_PositionOrBuilder extends // @@protoc_insertion_point(interface_extends:context.GPS_Position)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * float latitude = 1;
@@ -65857,9 +65953,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.GPS_Position}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.GPS_Position)
-    GPS_Position extends // @@protoc_insertion_point(message_implements:context.GPS_Position)
-    com.google.protobuf.GeneratedMessageV3 implements GPS_PositionOrBuilder {
+    public static final class GPS_Position extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.GPS_Position)
+    GPS_PositionOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -66062,9 +66157,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.GPS_Position}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.GPS_Position)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.GPS_Position)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.GPS_PositionOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.GPS_Position)
+        context.ContextOuterClass.GPS_PositionOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_GPS_Position_descriptor;
@@ -66334,8 +66428,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Location)
-    LocationOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface LocationOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Location)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * string region = 1;
@@ -66414,9 +66508,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Location}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Location)
-    Location extends // @@protoc_insertion_point(message_implements:context.Location)
-    com.google.protobuf.GeneratedMessageV3 implements LocationOrBuilder {
+    public static final class Location extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Location)
+    LocationOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -66877,9 +66970,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Location}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Location)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.Location)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.LocationOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Location)
+        context.ContextOuterClass.LocationOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Location_descriptor;
@@ -67574,8 +67666,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Constraint_EndPointLocation)
-    Constraint_EndPointLocationOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface Constraint_EndPointLocationOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_EndPointLocation)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.EndPointId endpoint_id = 1;
@@ -67615,9 +67707,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Constraint_EndPointLocation}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Constraint_EndPointLocation)
-    Constraint_EndPointLocation extends // @@protoc_insertion_point(message_implements:context.Constraint_EndPointLocation)
-    com.google.protobuf.GeneratedMessageV3 implements Constraint_EndPointLocationOrBuilder {
+    public static final class Constraint_EndPointLocation extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_EndPointLocation)
+    Constraint_EndPointLocationOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -67866,9 +67957,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Constraint_EndPointLocation}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_EndPointLocation)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.Constraint_EndPointLocation)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_EndPointLocationOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_EndPointLocation)
+        context.ContextOuterClass.Constraint_EndPointLocationOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Constraint_EndPointLocation_descriptor;
@@ -68314,8 +68404,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Constraint_EndPointPriority)
-    Constraint_EndPointPriorityOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface Constraint_EndPointPriorityOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_EndPointPriority)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.EndPointId endpoint_id = 1;
@@ -68344,9 +68434,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Constraint_EndPointPriority}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Constraint_EndPointPriority)
-    Constraint_EndPointPriority extends // @@protoc_insertion_point(message_implements:context.Constraint_EndPointPriority)
-    com.google.protobuf.GeneratedMessageV3 implements Constraint_EndPointPriorityOrBuilder {
+    public static final class Constraint_EndPointPriority extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_EndPointPriority)
+    Constraint_EndPointPriorityOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -68572,9 +68661,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Constraint_EndPointPriority}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_EndPointPriority)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.Constraint_EndPointPriority)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_EndPointPriorityOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_EndPointPriority)
+        context.ContextOuterClass.Constraint_EndPointPriorityOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Constraint_EndPointPriority_descriptor;
@@ -68932,8 +69020,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Latency)
-    Constraint_SLA_LatencyOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface Constraint_SLA_LatencyOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Latency)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * float e2e_latency_ms = 1;
@@ -68945,9 +69033,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Constraint_SLA_Latency}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Latency)
-    Constraint_SLA_Latency extends // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Latency)
-    com.google.protobuf.GeneratedMessageV3 implements Constraint_SLA_LatencyOrBuilder {
+    public static final class Constraint_SLA_Latency extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Latency)
+    Constraint_SLA_LatencyOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -69127,9 +69214,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Constraint_SLA_Latency}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Latency)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Latency)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_SLA_LatencyOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Latency)
+        context.ContextOuterClass.Constraint_SLA_LatencyOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Constraint_SLA_Latency_descriptor;
@@ -69351,8 +69437,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Capacity)
-    Constraint_SLA_CapacityOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface Constraint_SLA_CapacityOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Capacity)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * float capacity_gbps = 1;
@@ -69364,9 +69450,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Constraint_SLA_Capacity}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Capacity)
-    Constraint_SLA_Capacity extends // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Capacity)
-    com.google.protobuf.GeneratedMessageV3 implements Constraint_SLA_CapacityOrBuilder {
+    public static final class Constraint_SLA_Capacity extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Capacity)
+    Constraint_SLA_CapacityOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -69546,9 +69631,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Constraint_SLA_Capacity}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Capacity)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Capacity)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_SLA_CapacityOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Capacity)
+        context.ContextOuterClass.Constraint_SLA_CapacityOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Constraint_SLA_Capacity_descriptor;
@@ -69770,8 +69854,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Availability)
-    Constraint_SLA_AvailabilityOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface Constraint_SLA_AvailabilityOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Availability)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * uint32 num_disjoint_paths = 1;
@@ -69799,9 +69883,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Constraint_SLA_Availability}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Availability)
-    Constraint_SLA_Availability extends // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Availability)
-    com.google.protobuf.GeneratedMessageV3 implements Constraint_SLA_AvailabilityOrBuilder {
+    public static final class Constraint_SLA_Availability extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Availability)
+    Constraint_SLA_AvailabilityOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -70031,9 +70114,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Constraint_SLA_Availability}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Availability)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Availability)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_SLA_AvailabilityOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Availability)
+        context.ContextOuterClass.Constraint_SLA_AvailabilityOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Constraint_SLA_Availability_descriptor;
@@ -70363,8 +70445,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Isolation_level)
-    Constraint_SLA_Isolation_levelOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface Constraint_SLA_Isolation_levelOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Isolation_level)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.IsolationLevelEnum isolation_level = 1;
@@ -70402,9 +70484,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Constraint_SLA_Isolation_level}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Isolation_level)
-    Constraint_SLA_Isolation_level extends // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Isolation_level)
-    com.google.protobuf.GeneratedMessageV3 implements Constraint_SLA_Isolation_levelOrBuilder {
+    public static final class Constraint_SLA_Isolation_level extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Isolation_level)
+    Constraint_SLA_Isolation_levelOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -70650,9 +70731,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Constraint_SLA_Isolation_level}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Isolation_level)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Isolation_level)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_SLA_Isolation_levelOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Isolation_level)
+        context.ContextOuterClass.Constraint_SLA_Isolation_levelOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Constraint_SLA_Isolation_level_descriptor;
@@ -71014,8 +71094,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Constraint_Exclusions)
-    Constraint_ExclusionsOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface Constraint_ExclusionsOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_Exclusions)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * bool is_permanent = 1;
@@ -71102,9 +71182,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Constraint_Exclusions}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Constraint_Exclusions)
-    Constraint_Exclusions extends // @@protoc_insertion_point(message_implements:context.Constraint_Exclusions)
-    com.google.protobuf.GeneratedMessageV3 implements Constraint_ExclusionsOrBuilder {
+    public static final class Constraint_Exclusions extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_Exclusions)
+    Constraint_ExclusionsOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -71458,9 +71537,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Constraint_Exclusions}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_Exclusions)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.Constraint_Exclusions)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_ExclusionsOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_Exclusions)
+        context.ContextOuterClass.Constraint_ExclusionsOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Constraint_Exclusions_descriptor;
@@ -72553,8 +72631,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.QoSProfileId)
-    QoSProfileIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface QoSProfileIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.QoSProfileId)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid qos_profile_id = 1;
@@ -72577,9 +72655,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.QoSProfileId}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.QoSProfileId)
-    QoSProfileId extends // @@protoc_insertion_point(message_implements:context.QoSProfileId)
-    com.google.protobuf.GeneratedMessageV3 implements QoSProfileIdOrBuilder {
+    public static final class QoSProfileId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.QoSProfileId)
+    QoSProfileIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -72782,9 +72859,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.QoSProfileId}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.QoSProfileId)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.QoSProfileId)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.QoSProfileIdOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.QoSProfileId)
+        context.ContextOuterClass.QoSProfileIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_QoSProfileId_descriptor;
@@ -73094,8 +73170,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Constraint_QoSProfile)
-    Constraint_QoSProfileOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface Constraint_QoSProfileOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_QoSProfile)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.QoSProfileId qos_profile_id = 1;
@@ -73130,9 +73206,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Constraint_QoSProfile}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Constraint_QoSProfile)
-    Constraint_QoSProfile extends // @@protoc_insertion_point(message_implements:context.Constraint_QoSProfile)
-    com.google.protobuf.GeneratedMessageV3 implements Constraint_QoSProfileOrBuilder {
+    public static final class Constraint_QoSProfile extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_QoSProfile)
+    Constraint_QoSProfileOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -73384,9 +73459,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Constraint_QoSProfile}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_QoSProfile)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.Constraint_QoSProfile)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_QoSProfileOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_QoSProfile)
+        context.ContextOuterClass.Constraint_QoSProfileOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Constraint_QoSProfile_descriptor;
@@ -73787,8 +73861,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Constraint)
-    ConstraintOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ConstraintOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ConstraintActionEnum action = 1;
@@ -73978,9 +74052,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Constraint}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Constraint)
-    Constraint extends // @@protoc_insertion_point(message_implements:context.Constraint)
-    com.google.protobuf.GeneratedMessageV3 implements ConstraintOrBuilder {
+    public static final class Constraint extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint)
+    ConstraintOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -74734,9 +74807,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Constraint}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Constraint)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.Constraint)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConstraintOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint)
+        context.ContextOuterClass.ConstraintOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Constraint_descriptor;
@@ -76602,8 +76674,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.TeraFlowController)
-    TeraFlowControllerOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface TeraFlowControllerOrBuilder extends // @@protoc_insertion_point(interface_extends:context.TeraFlowController)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ContextId context_id = 1;
@@ -76648,9 +76720,8 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.TeraFlowController}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.TeraFlowController)
-    TeraFlowController extends // @@protoc_insertion_point(message_implements:context.TeraFlowController)
-    com.google.protobuf.GeneratedMessageV3 implements TeraFlowControllerOrBuilder {
+    public static final class TeraFlowController extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.TeraFlowController)
+    TeraFlowControllerOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -76929,9 +77000,8 @@ public final class ContextOuterClass {
          *
          * Protobuf type {@code context.TeraFlowController}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.TeraFlowController)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.TeraFlowController)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.TeraFlowControllerOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.TeraFlowController)
+        context.ContextOuterClass.TeraFlowControllerOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_TeraFlowController_descriptor;
@@ -77380,8 +77450,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.AuthenticationResult)
-    AuthenticationResultOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface AuthenticationResultOrBuilder extends // @@protoc_insertion_point(interface_extends:context.AuthenticationResult)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ContextId context_id = 1;
@@ -77410,9 +77480,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.AuthenticationResult}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.AuthenticationResult)
-    AuthenticationResult extends // @@protoc_insertion_point(message_implements:context.AuthenticationResult)
-    com.google.protobuf.GeneratedMessageV3 implements AuthenticationResultOrBuilder {
+    public static final class AuthenticationResult extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.AuthenticationResult)
+    AuthenticationResultOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -77638,9 +77707,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.AuthenticationResult}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.AuthenticationResult)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.AuthenticationResult)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.AuthenticationResultOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.AuthenticationResult)
+        context.ContextOuterClass.AuthenticationResultOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_AuthenticationResult_descriptor;
@@ -77998,8 +78066,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.OpticalConfigId)
-    OpticalConfigIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface OpticalConfigIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalConfigId)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * string opticalconfig_uuid = 1;
@@ -78021,9 +78089,8 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.OpticalConfigId}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.OpticalConfigId)
-    OpticalConfigId extends // @@protoc_insertion_point(message_implements:context.OpticalConfigId)
-    com.google.protobuf.GeneratedMessageV3 implements OpticalConfigIdOrBuilder {
+    public static final class OpticalConfigId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalConfigId)
+    OpticalConfigIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -78233,9 +78300,8 @@ public final class ContextOuterClass {
          *
          * Protobuf type {@code context.OpticalConfigId}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.OpticalConfigId)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.OpticalConfigId)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalConfigIdOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalConfigId)
+        context.ContextOuterClass.OpticalConfigIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_OpticalConfigId_descriptor;
@@ -78500,8 +78566,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.OpticalConfig)
-    OpticalConfigOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface OpticalConfigOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalConfig)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.OpticalConfigId opticalconfig_id = 1;
@@ -78553,9 +78619,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.OpticalConfig}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.OpticalConfig)
-    OpticalConfig extends // @@protoc_insertion_point(message_implements:context.OpticalConfig)
-    com.google.protobuf.GeneratedMessageV3 implements OpticalConfigOrBuilder {
+    public static final class OpticalConfig extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalConfig)
+    OpticalConfigOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -78853,9 +78918,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.OpticalConfig}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.OpticalConfig)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.OpticalConfig)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalConfigOrBuilder {
+        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;
@@ -79392,8 +79456,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.OpticalConfigList)
-    OpticalConfigListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface OpticalConfigListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalConfigList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.OpticalConfig opticalconfigs = 1;
@@ -79424,9 +79488,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.OpticalConfigList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.OpticalConfigList)
-    OpticalConfigList extends // @@protoc_insertion_point(message_implements:context.OpticalConfigList)
-    com.google.protobuf.GeneratedMessageV3 implements OpticalConfigListOrBuilder {
+    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;
 
@@ -79641,9 +79704,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.OpticalConfigList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.OpticalConfigList)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.OpticalConfigList)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalConfigListOrBuilder {
+        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;
@@ -80110,8 +80172,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.OpticalConfigEvent)
-    OpticalConfigEventOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface OpticalConfigEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalConfigEvent)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Event event = 1;
@@ -80151,9 +80213,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.OpticalConfigEvent}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.OpticalConfigEvent)
-    OpticalConfigEvent extends // @@protoc_insertion_point(message_implements:context.OpticalConfigEvent)
-    com.google.protobuf.GeneratedMessageV3 implements OpticalConfigEventOrBuilder {
+    public static final class OpticalConfigEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalConfigEvent)
+    OpticalConfigEventOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -80402,9 +80463,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.OpticalConfigEvent}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.OpticalConfigEvent)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.OpticalConfigEvent)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalConfigEventOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalConfigEvent)
+        context.ContextOuterClass.OpticalConfigEventOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_OpticalConfigEvent_descriptor;
@@ -80850,8 +80910,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.OpticalEndPointId)
-    OpticalEndPointIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface OpticalEndPointIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalEndPointId)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.DeviceId device_id = 2;
@@ -80891,9 +80951,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.OpticalEndPointId}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.OpticalEndPointId)
-    OpticalEndPointId extends // @@protoc_insertion_point(message_implements:context.OpticalEndPointId)
-    com.google.protobuf.GeneratedMessageV3 implements OpticalEndPointIdOrBuilder {
+    public static final class OpticalEndPointId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalEndPointId)
+    OpticalEndPointIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -81142,9 +81201,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.OpticalEndPointId}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.OpticalEndPointId)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.OpticalEndPointId)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalEndPointIdOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalEndPointId)
+        context.ContextOuterClass.OpticalEndPointIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_OpticalEndPointId_descriptor;
@@ -81590,8 +81648,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.OpticalLinkList)
-    OpticalLinkListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface OpticalLinkListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalLinkList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.OpticalLink optical_links = 1;
@@ -81622,9 +81680,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.OpticalLinkList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.OpticalLinkList)
-    OpticalLinkList extends // @@protoc_insertion_point(message_implements:context.OpticalLinkList)
-    com.google.protobuf.GeneratedMessageV3 implements OpticalLinkListOrBuilder {
+    public static final class OpticalLinkList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalLinkList)
+    OpticalLinkListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -81839,9 +81896,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.OpticalLinkList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.OpticalLinkList)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.OpticalLinkList)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalLinkListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalLinkList)
+        context.ContextOuterClass.OpticalLinkListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_OpticalLinkList_descriptor;
@@ -82308,8 +82364,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.OpticalLinkDetails)
-    OpticalLinkDetailsOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface OpticalLinkDetailsOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalLinkDetails)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * float length = 1;
@@ -82468,9 +82524,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.OpticalLinkDetails}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.OpticalLinkDetails)
-    OpticalLinkDetails extends // @@protoc_insertion_point(message_implements:context.OpticalLinkDetails)
-    com.google.protobuf.GeneratedMessageV3 implements OpticalLinkDetailsOrBuilder {
+    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;
 
@@ -83145,9 +83200,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.OpticalLinkDetails}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.OpticalLinkDetails)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.OpticalLinkDetails)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalLinkDetailsOrBuilder {
+        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;
@@ -84235,8 +84289,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.OpticalLink)
-    OpticalLinkOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface OpticalLinkOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalLink)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * string name = 1;
@@ -84313,9 +84367,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.OpticalLink}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.OpticalLink)
-    OpticalLink extends // @@protoc_insertion_point(message_implements:context.OpticalLink)
-    com.google.protobuf.GeneratedMessageV3 implements OpticalLinkOrBuilder {
+    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;
 
@@ -84671,9 +84724,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.OpticalLink}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.OpticalLink)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.OpticalLink)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalLinkOrBuilder {
+        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;
@@ -85503,8 +85555,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ChannelId)
-    ChannelIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ChannelIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ChannelId)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid channel_uuid = 1;
@@ -85527,9 +85579,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ChannelId}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ChannelId)
-    ChannelId extends // @@protoc_insertion_point(message_implements:context.ChannelId)
-    com.google.protobuf.GeneratedMessageV3 implements ChannelIdOrBuilder {
+    public static final class ChannelId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ChannelId)
+    ChannelIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -85732,9 +85783,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ChannelId}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ChannelId)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.ChannelId)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ChannelIdOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ChannelId)
+        context.ContextOuterClass.ChannelIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ChannelId_descriptor;
@@ -86044,8 +86094,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.OpticalBandId)
-    OpticalBandIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface OpticalBandIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalBandId)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid opticalband_uuid = 1;
@@ -86068,9 +86118,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.OpticalBandId}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.OpticalBandId)
-    OpticalBandId extends // @@protoc_insertion_point(message_implements:context.OpticalBandId)
-    com.google.protobuf.GeneratedMessageV3 implements OpticalBandIdOrBuilder {
+    public static final class OpticalBandId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalBandId)
+    OpticalBandIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -86273,9 +86322,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.OpticalBandId}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.OpticalBandId)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.OpticalBandId)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalBandIdOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalBandId)
+        context.ContextOuterClass.OpticalBandIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_OpticalBandId_descriptor;
@@ -86585,8 +86633,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.OpticalBand)
-    OpticalBandOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface OpticalBandOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalBand)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.OpticalBandId opticalband_id = 1;
@@ -86714,9 +86762,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.OpticalBand}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.OpticalBand)
-    OpticalBand extends // @@protoc_insertion_point(message_implements:context.OpticalBand)
-    com.google.protobuf.GeneratedMessageV3 implements OpticalBandOrBuilder {
+    public static final class OpticalBand extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalBand)
+    OpticalBandOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -87277,9 +87324,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.OpticalBand}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.OpticalBand)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.OpticalBand)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalBandOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalBand)
+        context.ContextOuterClass.OpticalBandOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_OpticalBand_descriptor;
@@ -88455,8 +88501,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.OpticalBandList)
-    OpticalBandListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface OpticalBandListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalBandList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.OpticalBand opticalbands = 1;
@@ -88487,9 +88533,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.OpticalBandList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.OpticalBandList)
-    OpticalBandList extends // @@protoc_insertion_point(message_implements:context.OpticalBandList)
-    com.google.protobuf.GeneratedMessageV3 implements OpticalBandListOrBuilder {
+    public static final class OpticalBandList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalBandList)
+    OpticalBandListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -88704,9 +88749,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.OpticalBandList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.OpticalBandList)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.OpticalBandList)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalBandListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalBandList)
+        context.ContextOuterClass.OpticalBandListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_OpticalBandList_descriptor;
@@ -89173,8 +89217,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ServiceConfigRule)
-    ServiceConfigRuleOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ServiceConfigRuleOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ServiceConfigRule)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ServiceId service_id = 1;
@@ -89214,9 +89258,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ServiceConfigRule}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ServiceConfigRule)
-    ServiceConfigRule extends // @@protoc_insertion_point(message_implements:context.ServiceConfigRule)
-    com.google.protobuf.GeneratedMessageV3 implements ServiceConfigRuleOrBuilder {
+    public static final class ServiceConfigRule extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ServiceConfigRule)
+    ServiceConfigRuleOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -89465,9 +89508,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ServiceConfigRule}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ServiceConfigRule)
-        Builder extends // @@protoc_insertion_point(builder_implements:context.ServiceConfigRule)
-        com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceConfigRuleOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ServiceConfigRule)
+        context.ContextOuterClass.ServiceConfigRuleOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ServiceConfigRule_descriptor;
@@ -90328,7 +90370,7 @@ public final class ContextOuterClass {
     private static com.google.protobuf.Descriptors.FileDescriptor descriptor;
 
     static {
-        java.lang.String[] descriptorData = { "\n\rcontext.proto\022\007context\032\031google/protobu" + "f/any.proto\032\tacl.proto\032\014ipowdm.proto\032\rip" + "_link.proto\032\026kpi_sample_types.proto\032\016tap" + "i_lsp.proto\"\007\n\005Empty\"\024\n\004Uuid\022\014\n\004uuid\030\001 \001" + "(\t\"\036\n\tTimestamp\022\021\n\ttimestamp\030\001 \001(\001\"Z\n\005Ev" + "ent\022%\n\ttimestamp\030\001 \001(\0132\022.context.Timesta" + "mp\022*\n\nevent_type\030\002 \001(\0162\026.context.EventTy" + "peEnum\"\265\002\n\010AnyEvent\022(\n\007context\030\001 \001(\0132\025.c" + "ontext.ContextEventH\000\022*\n\010topology\030\002 \001(\0132" + "\026.context.TopologyEventH\000\022&\n\006device\030\003 \001(" + "\0132\024.context.DeviceEventH\000\022\"\n\004link\030\004 \001(\0132" + "\022.context.LinkEventH\000\022(\n\007service\030\005 \001(\0132\025" + ".context.ServiceEventH\000\022$\n\005slice\030\006 \001(\0132\023" + ".context.SliceEventH\000\022.\n\nconnection\030\007 \001(" + "\0132\030.context.ConnectionEventH\000B\007\n\005event\"0" + "\n\tContextId\022#\n\014context_uuid\030\001 \001(\0132\r.cont" + "ext.Uuid\"\351\001\n\007Context\022&\n\ncontext_id\030\001 \001(\013" + "2\022.context.ContextId\022\014\n\004name\030\002 \001(\t\022)\n\014to" + "pology_ids\030\003 \003(\0132\023.context.TopologyId\022\'\n" + "\013service_ids\030\004 \003(\0132\022.context.ServiceId\022#" + "\n\tslice_ids\030\005 \003(\0132\020.context.SliceId\022/\n\nc" + "ontroller\030\006 \001(\0132\033.context.TeraFlowContro" + "ller\"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.context.Context\"U\n\014Con" + "textEvent\022\035\n\005event\030\001 \001(\0132\016.context.Event" + "\022&\n\ncontext_id\030\002 \001(\0132\022.context.ContextId" + "\"Z\n\nTopologyId\022&\n\ncontext_id\030\001 \001(\0132\022.con" + "text.ContextId\022$\n\rtopology_uuid\030\002 \001(\0132\r." + "context.Uuid\"\267\001\n\010Topology\022(\n\013topology_id" + "\030\001 \001(\0132\023.context.TopologyId\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.context.LinkId\022)\n\020o" + "ptical_link_ids\030\005 \003(\0132\017.context.LinkId\"\266" + "\001\n\017TopologyDetails\022(\n\013topology_id\030\001 \001(\0132" + "\023.context.TopologyId\022\014\n\004name\030\002 \001(\t\022 \n\007de" + "vices\030\003 \003(\0132\017.context.Device\022\034\n\005links\030\004 " + "\003(\0132\r.context.Link\022+\n\roptical_links\030\005 \003(" + "\0132\024.context.OpticalLink\";\n\016TopologyIdLis" + "t\022)\n\014topology_ids\030\001 \003(\0132\023.context.Topolo" + "gyId\"5\n\014TopologyList\022%\n\ntopologies\030\001 \003(\013" + "2\021.context.Topology\"X\n\rTopologyEvent\022\035\n\005" + "event\030\001 \001(\0132\016.context.Event\022(\n\013topology_" + "id\030\002 \001(\0132\023.context.TopologyId\".\n\010DeviceI" + "d\022\"\n\013device_uuid\030\001 \001(\0132\r.context.Uuid\"\372\002" + "\n\006Device\022$\n\tdevice_id\030\001 \001(\0132\021.context.De" + "viceId\022\014\n\004name\030\002 \001(\t\022\023\n\013device_type\030\003 \001(" + "\t\022,\n\rdevice_config\030\004 \001(\0132\025.context.Devic" + "eConfig\022G\n\031device_operational_status\030\005 \001" + "(\0162$.context.DeviceOperationalStatusEnum" + "\0221\n\016device_drivers\030\006 \003(\0162\031.context.Devic" + "eDriverEnum\022+\n\020device_endpoints\030\007 \003(\0132\021." + "context.EndPoint\022&\n\ncomponents\030\010 \003(\0132\022.c" + "ontext.Component\022(\n\rcontroller_id\030\t \001(\0132" + "\021.context.DeviceId\"\311\001\n\tComponent\022%\n\016comp" + "onent_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\nattributes\030\004 \003(\0132" + "\".context.Component.AttributesEntry\022\016\n\006p" + "arent\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\014DeviceConfig\022)" + "\n\014config_rules\030\001 \003(\0132\023.context.ConfigRul" + "e\"5\n\014DeviceIdList\022%\n\ndevice_ids\030\001 \003(\0132\021." + "context.DeviceId\".\n\nDeviceList\022 \n\007device" + "s\030\001 \003(\0132\017.context.Device\"\216\001\n\014DeviceFilte" + "r\022)\n\ndevice_ids\030\001 \001(\0132\025.context.DeviceId" + "List\022\031\n\021include_endpoints\030\002 \001(\010\022\034\n\024inclu" + "de_config_rules\030\003 \001(\010\022\032\n\022include_compone" + "nts\030\004 \001(\010\"\200\001\n\013DeviceEvent\022\035\n\005event\030\001 \001(\013" + "2\016.context.Event\022$\n\tdevice_id\030\002 \001(\0132\021.co" + "ntext.DeviceId\022,\n\rdevice_config\030\003 \001(\0132\025." + "context.DeviceConfig\"*\n\006LinkId\022 \n\tlink_u" + "uid\030\001 \001(\0132\r.context.Uuid\"c\n\016LinkAttribut" + "es\022\030\n\020is_bidirectional\030\001 \001(\010\022\033\n\023total_ca" + "pacity_gbps\030\002 \001(\002\022\032\n\022used_capacity_gbps\030" + "\003 \001(\002\"\275\001\n\004Link\022 \n\007link_id\030\001 \001(\0132\017.contex" + "t.LinkId\022\014\n\004name\030\002 \001(\t\022(\n\tlink_type\030\003 \001(" + "\0162\025.context.LinkTypeEnum\022.\n\021link_endpoin" + "t_ids\030\004 \003(\0132\023.context.EndPointId\022+\n\nattr" + "ibutes\030\005 \001(\0132\027.context.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.cont" + "ext.Link\"L\n\tLinkEvent\022\035\n\005event\030\001 \001(\0132\016.c" + "ontext.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.ServiceId\022\014\n\004name\030\002 \001" + "(\t\022.\n\014service_type\030\003 \001(\0162\030.context.Servi" + "ceTypeEnum\0221\n\024service_endpoint_ids\030\004 \003(\013" + "2\023.context.EndPointId\0220\n\023service_constra" + "ints\030\005 \003(\0132\023.context.Constraint\022.\n\016servi" + "ce_status\030\006 \001(\0132\026.context.ServiceStatus\022" + ".\n\016service_config\030\007 \001(\0132\026.context.Servic" + "eConfig\022%\n\ttimestamp\030\010 \001(\0132\022.context.Tim" + "estamp\"C\n\rServiceStatus\0222\n\016service_statu" + "s\030\001 \001(\0162\032.context.ServiceStatusEnum\":\n\rS" + "erviceConfig\022)\n\014config_rules\030\001 \003(\0132\023.con" + "text.ConfigRule\"8\n\rServiceIdList\022\'\n\013serv" + "ice_ids\030\001 \003(\0132\022.context.ServiceId\"1\n\013Ser" + "viceList\022\"\n\010services\030\001 \003(\0132\020.context.Ser" + "vice\"\225\001\n\rServiceFilter\022+\n\013service_ids\030\001 " + "\001(\0132\026.context.ServiceIdList\022\034\n\024include_e" + "ndpoint_ids\030\002 \001(\010\022\033\n\023include_constraints" + "\030\003 \001(\010\022\034\n\024include_config_rules\030\004 \001(\010\"U\n\014" + "ServiceEvent\022\035\n\005event\030\001 \001(\0132\016.context.Ev" + "ent\022&\n\nservice_id\030\002 \001(\0132\022.context.Servic" + "eId\"T\n\007SliceId\022&\n\ncontext_id\030\001 \001(\0132\022.con" + "text.ContextId\022!\n\nslice_uuid\030\002 \001(\0132\r.con" + "text.Uuid\"\240\003\n\005Slice\022\"\n\010slice_id\030\001 \001(\0132\020." + "context.SliceId\022\014\n\004name\030\002 \001(\t\022/\n\022slice_e" + "ndpoint_ids\030\003 \003(\0132\023.context.EndPointId\022." + "\n\021slice_constraints\030\004 \003(\0132\023.context.Cons" + "traint\022-\n\021slice_service_ids\030\005 \003(\0132\022.cont" + "ext.ServiceId\022,\n\022slice_subslice_ids\030\006 \003(" + "\0132\020.context.SliceId\022*\n\014slice_status\030\007 \001(" + "\0132\024.context.SliceStatus\022*\n\014slice_config\030" + "\010 \001(\0132\024.context.SliceConfig\022(\n\013slice_own" + "er\030\t \001(\0132\023.context.SliceOwner\022%\n\ttimesta" + "mp\030\n \001(\0132\022.context.Timestamp\"E\n\nSliceOwn" + "er\022!\n\nowner_uuid\030\001 \001(\0132\r.context.Uuid\022\024\n" + "\014owner_string\030\002 \001(\t\"=\n\013SliceStatus\022.\n\014sl" + "ice_status\030\001 \001(\0162\030.context.SliceStatusEn" + "um\"8\n\013SliceConfig\022)\n\014config_rules\030\001 \003(\0132" + "\023.context.ConfigRule\"2\n\013SliceIdList\022#\n\ts" + "lice_ids\030\001 \003(\0132\020.context.SliceId\"+\n\tSlic" + "eList\022\036\n\006slices\030\001 \003(\0132\016.context.Slice\"\312\001" + "\n\013SliceFilter\022\'\n\tslice_ids\030\001 \001(\0132\024.conte" + "xt.SliceIdList\022\034\n\024include_endpoint_ids\030\002" + " \001(\010\022\033\n\023include_constraints\030\003 \001(\010\022\033\n\023inc" + "lude_service_ids\030\004 \001(\010\022\034\n\024include_subsli" + "ce_ids\030\005 \001(\010\022\034\n\024include_config_rules\030\006 \001" + "(\010\"O\n\nSliceEvent\022\035\n\005event\030\001 \001(\0132\016.contex" + "t.Event\022\"\n\010slice_id\030\002 \001(\0132\020.context.Slic" + "eId\"6\n\014ConnectionId\022&\n\017connection_uuid\030\001" + " \001(\0132\r.context.Uuid\"2\n\025ConnectionSetting" + "s_L0\022\031\n\021lsp_symbolic_name\030\001 \001(\t\"\236\001\n\025Conn" + "ectionSettings_L2\022\027\n\017src_mac_address\030\001 \001" + "(\t\022\027\n\017dst_mac_address\030\002 \001(\t\022\022\n\nether_typ" + "e\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\025Conn" + "ectionSettings_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\025Connec" + "tionSettings_L4\022\020\n\010src_port\030\001 \001(\r\022\020\n\010dst" + "_port\030\002 \001(\r\022\021\n\ttcp_flags\030\003 \001(\r\022\013\n\003ttl\030\004 " + "\001(\r\"\304\001\n\022ConnectionSettings\022*\n\002l0\030\001 \001(\0132\036" + ".context.ConnectionSettings_L0\022*\n\002l2\030\002 \001" + "(\0132\036.context.ConnectionSettings_L2\022*\n\002l3" + "\030\003 \001(\0132\036.context.ConnectionSettings_L3\022*" + "\n\002l4\030\004 \001(\0132\036.context.ConnectionSettings_" + "L4\"\363\001\n\nConnection\022,\n\rconnection_id\030\001 \001(\013" + "2\025.context.ConnectionId\022&\n\nservice_id\030\002 " + "\001(\0132\022.context.ServiceId\0223\n\026path_hops_end" + "point_ids\030\003 \003(\0132\023.context.EndPointId\022+\n\017" + "sub_service_ids\030\004 \003(\0132\022.context.ServiceI" + "d\022-\n\010settings\030\005 \001(\0132\033.context.Connection" + "Settings\"A\n\020ConnectionIdList\022-\n\016connecti" + "on_ids\030\001 \003(\0132\025.context.ConnectionId\":\n\016C" + "onnectionList\022(\n\013connections\030\001 \003(\0132\023.con" + "text.Connection\"^\n\017ConnectionEvent\022\035\n\005ev" + "ent\030\001 \001(\0132\016.context.Event\022,\n\rconnection_" + "id\030\002 \001(\0132\025.context.ConnectionId\"\202\001\n\nEndP" + "ointId\022(\n\013topology_id\030\001 \001(\0132\023.context.To" + "pologyId\022$\n\tdevice_id\030\002 \001(\0132\021.context.De" + "viceId\022$\n\rendpoint_uuid\030\003 \001(\0132\r.context." + "Uuid\"\310\002\n\010EndPoint\022(\n\013endpoint_id\030\001 \001(\0132\023" + ".context.EndPointId\022\014\n\004name\030\002 \001(\t\022\025\n\rend" + "point_type\030\003 \001(\t\0229\n\020kpi_sample_types\030\004 \003" + "(\0162\037.kpi_sample_types.KpiSampleType\022,\n\021e" + "ndpoint_location\030\005 \001(\0132\021.context.Locatio" + "n\0229\n\014capabilities\030\006 \003(\0132#.context.EndPoi" + "nt.CapabilitiesEntry\032I\n\021CapabilitiesEntr" + "y\022\013\n\003key\030\001 \001(\t\022#\n\005value\030\002 \001(\0132\024.google.p" + "rotobuf.Any:\0028\001\"{\n\014EndPointName\022(\n\013endpo" + "int_id\030\001 \001(\0132\023.context.EndPointId\022\023\n\013dev" + "ice_name\030\002 \001(\t\022\025\n\rendpoint_name\030\003 \001(\t\022\025\n" + "\rendpoint_type\030\004 \001(\t\";\n\016EndPointIdList\022)" + "\n\014endpoint_ids\030\001 \003(\0132\023.context.EndPointI" + "d\"A\n\020EndPointNameList\022-\n\016endpoint_names\030" + "\001 \003(\0132\025.context.EndPointName\"A\n\021ConfigRu" + "le_Custom\022\024\n\014resource_key\030\001 \001(\t\022\026\n\016resou" + "rce_value\030\002 \001(\t\"]\n\016ConfigRule_ACL\022(\n\013end" + "point_id\030\001 \001(\0132\023.context.EndPointId\022!\n\010r" + "ule_set\030\002 \001(\0132\017.acl.AclRuleSet\"f\n\021Config" + "Rule_IPOWDM\022(\n\013endpoint_id\030\001 \001(\0132\023.conte" + "xt.EndPointId\022\'\n\010rule_set\030\002 \001(\0132\025.ipowdm" + ".IpowdmRuleSet\"k\n\023ConfigRule_TAPI_LSP\022(\n" + "\013endpoint_id\030\001 \001(\0132\023.context.EndPointId\022" + "*\n\010rule_set\030\002 \003(\0132\030.tapi_lsp.TapiLspRule" + "Set\"h\n\022ConfigRule_IP_LINK\022(\n\013endpoint_id" + "\030\001 \001(\0132\023.context.EndPointId\022(\n\010rule_set\030" + "\002 \001(\0132\026.ip_link.IpLinkRuleSet\"\254\002\n\nConfig" + "Rule\022)\n\006action\030\001 \001(\0162\031.context.ConfigAct" + "ionEnum\022,\n\006custom\030\002 \001(\0132\032.context.Config" + "Rule_CustomH\000\022&\n\003acl\030\003 \001(\0132\027.context.Con" + "figRule_ACLH\000\022.\n\007ip_link\030\004 \001(\0132\033.context" + ".ConfigRule_IP_LINKH\000\0220\n\010tapi_lsp\030\005 \001(\0132" + "\034.context.ConfigRule_TAPI_LSPH\000\022,\n\006ipowd" + "m\030\006 \001(\0132\032.context.ConfigRule_IPOWDMH\000B\r\n" + "\013config_rule\"F\n\021Constraint_Custom\022\027\n\017con" + "straint_type\030\001 \001(\t\022\030\n\020constraint_value\030\002" + " \001(\t\"E\n\023Constraint_Schedule\022\027\n\017start_tim" + "estamp\030\001 \001(\001\022\025\n\rduration_days\030\002 \001(\002\"3\n\014G" + "PS_Position\022\020\n\010latitude\030\001 \001(\002\022\021\n\tlongitu" + "de\030\002 \001(\002\"\204\001\n\010Location\022\020\n\006region\030\001 \001(\tH\000\022" + "-\n\014gps_position\030\002 \001(\0132\025.context.GPS_Posi" + "tionH\000\022\023\n\tinterface\030\003 \001(\tH\000\022\026\n\014circuit_p" + "ack\030\004 \001(\tH\000B\n\n\010location\"l\n\033Constraint_En" + "dPointLocation\022(\n\013endpoint_id\030\001 \001(\0132\023.co" + "ntext.EndPointId\022#\n\010location\030\002 \001(\0132\021.con" + "text.Location\"Y\n\033Constraint_EndPointPrio" + "rity\022(\n\013endpoint_id\030\001 \001(\0132\023.context.EndP" + "ointId\022\020\n\010priority\030\002 \001(\r\"0\n\026Constraint_S" + "LA_Latency\022\026\n\016e2e_latency_ms\030\001 \001(\002\"0\n\027Co" + "nstraint_SLA_Capacity\022\025\n\rcapacity_gbps\030\001" + " \001(\002\"c\n\033Constraint_SLA_Availability\022\032\n\022n" + "um_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\017isolation_level\030\001" + " \003(\0162\033.context.IsolationLevelEnum\"\242\001\n\025Co" + "nstraint_Exclusions\022\024\n\014is_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.EndPoin" + "tId\022!\n\010link_ids\030\004 \003(\0132\017.context.LinkId\"5" + "\n\014QoSProfileId\022%\n\016qos_profile_id\030\001 \001(\0132\r" + ".context.Uuid\"`\n\025Constraint_QoSProfile\022-" + "\n\016qos_profile_id\030\001 \001(\0132\025.context.QoSProf" + "ileId\022\030\n\020qos_profile_name\030\002 \001(\t\"\222\005\n\nCons" + "traint\022-\n\006action\030\001 \001(\0162\035.context.Constra" + "intActionEnum\022,\n\006custom\030\002 \001(\0132\032.context." + "Constraint_CustomH\000\0220\n\010schedule\030\003 \001(\0132\034." + "context.Constraint_ScheduleH\000\022A\n\021endpoin" + "t_location\030\004 \001(\0132$.context.Constraint_En" + "dPointLocationH\000\022A\n\021endpoint_priority\030\005 " + "\001(\0132$.context.Constraint_EndPointPriorit" + "yH\000\0228\n\014sla_capacity\030\006 \001(\0132 .context.Cons" + "traint_SLA_CapacityH\000\0226\n\013sla_latency\030\007 \001" + "(\0132\037.context.Constraint_SLA_LatencyH\000\022@\n" + "\020sla_availability\030\010 \001(\0132$.context.Constr" + "aint_SLA_AvailabilityH\000\022@\n\rsla_isolation" + "\030\t \001(\0132\'.context.Constraint_SLA_Isolatio" + "n_levelH\000\0224\n\nexclusions\030\n \001(\0132\036.context." + "Constraint_ExclusionsH\000\0225\n\013qos_profile\030\013" + " \001(\0132\036.context.Constraint_QoSProfileH\000B\014" + "\n\nconstraint\"^\n\022TeraFlowController\022&\n\nco" + "ntext_id\030\001 \001(\0132\022.context.ContextId\022\022\n\nip" + "_address\030\002 \001(\t\022\014\n\004port\030\003 \001(\r\"U\n\024Authenti" + "cationResult\022&\n\ncontext_id\030\001 \001(\0132\022.conte" + "xt.ContextId\022\025\n\rauthenticated\030\002 \001(\010\"-\n\017O" + "pticalConfigId\022\032\n\022opticalconfig_uuid\030\001 \001" + "(\t\"y\n\rOpticalConfig\0222\n\020opticalconfig_id\030" + "\001 \001(\0132\030.context.OpticalConfigId\022\016\n\006confi" + "g\030\002 \001(\t\022$\n\tdevice_id\030\003 \001(\0132\021.context.Dev" + "iceId\"C\n\021OpticalConfigList\022.\n\016opticalcon" + "figs\030\001 \003(\0132\026.context.OpticalConfig\"g\n\022Op" + "ticalConfigEvent\022\035\n\005event\030\001 \001(\0132\016.contex" + "t.Event\0222\n\020opticalconfig_id\030\002 \001(\0132\030.cont" + "ext.OpticalConfigId\"_\n\021OpticalEndPointId" + "\022$\n\tdevice_id\030\002 \001(\0132\021.context.DeviceId\022$" + "\n\rendpoint_uuid\030\003 \001(\0132\r.context.Uuid\">\n\017" + "OpticalLinkList\022+\n\roptical_links\030\001 \003(\0132\024" + ".context.OpticalLink\"\304\003\n\022OpticalLinkDeta" + "ils\022\016\n\006length\030\001 \001(\002\022\020\n\010src_port\030\002 \001(\t\022\020\n" + "\010dst_port\030\003 \001(\t\022\027\n\017local_peer_port\030\004 \001(\t" + "\022\030\n\020remote_peer_port\030\005 \001(\t\022\014\n\004used\030\006 \001(\010" + "\0228\n\007c_slots\030\007 \003(\0132\'.context.OpticalLinkD" + "etails.CSlotsEntry\0228\n\007l_slots\030\010 \003(\0132\'.co" + "ntext.OpticalLinkDetails.LSlotsEntry\0228\n\007" + "s_slots\030\t \003(\0132\'.context.OpticalLinkDetai" + "ls.SSlotsEntry\032-\n\013CSlotsEntry\022\013\n\003key\030\001 \001" + "(\t\022\r\n\005value\030\002 \001(\005:\0028\001\032-\n\013LSlotsEntry\022\013\n\003" + "key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\0028\001\032-\n\013SSlotsEn" + "try\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\0028\001\"\243\001\n\013" + "OpticalLink\022\014\n\004name\030\001 \001(\t\0224\n\017optical_det" + "ails\030\002 \001(\0132\033.context.OpticalLinkDetails\022" + " \n\007link_id\030\003 \001(\0132\017.context.LinkId\022.\n\021lin" + "k_endpoint_ids\030\004 \003(\0132\023.context.EndPointI" + "d\"0\n\tChannelId\022#\n\014channel_uuid\030\001 \001(\0132\r.c" + "ontext.Uuid\"8\n\rOpticalBandId\022\'\n\020opticalb" + "and_uuid\030\001 \001(\0132\r.context.Uuid\"\247\002\n\013Optica" + "lBand\022.\n\016opticalband_id\030\001 \001(\0132\026.context." + "OpticalBandId\022,\n\rconnection_id\030\002 \001(\0132\025.c" + "ontext.ConnectionId\022&\n\nchannel_id\030\003 \001(\0132" + "\022.context.ChannelId\022&\n\nservice_id\030\004 \001(\0132" + "\022.context.ServiceId\022#\n\007service\030\005 \001(\0132\020.c" + "ontext.ServiceH\000\022)\n\nconnection\030\006 \001(\0132\023.c" + "ontext.ConnectionH\000\022\021\n\007channel\030\007 \001(\tH\000B\007" + "\n\005field\"=\n\017OpticalBandList\022*\n\014opticalban" + "ds\030\001 \003(\0132\024.context.OpticalBand\"r\n\021Servic" + "eConfigRule\022&\n\nservice_id\030\001 \001(\0132\022.contex" + "t.ServiceId\0225\n\021configrule_custom\030\002 \001(\0132\032" + ".context.ConfigRule_Custom*j\n\rEventTypeE" + "num\022\027\n\023EVENTTYPE_UNDEFINED\020\000\022\024\n\020EVENTTYP" + "E_CREATE\020\001\022\024\n\020EVENTTYPE_UPDATE\020\002\022\024\n\020EVEN" + "TTYPE_REMOVE\020\003*\333\004\n\020DeviceDriverEnum\022\032\n\026D" + "EVICEDRIVER_UNDEFINED\020\000\022\033\n\027DEVICEDRIVER_" + "OPENCONFIG\020\001\022\036\n\032DEVICEDRIVER_TRANSPORT_A" + "PI\020\002\022\023\n\017DEVICEDRIVER_P4\020\003\022&\n\"DEVICEDRIVE" + "R_IETF_NETWORK_TOPOLOGY\020\004\022\033\n\027DEVICEDRIVE" + "R_ONF_TR_532\020\005\022\023\n\017DEVICEDRIVER_XR\020\006\022\033\n\027D" + "EVICEDRIVER_IETF_L2VPN\020\007\022 \n\034DEVICEDRIVER" + "_GNMI_OPENCONFIG\020\010\022\034\n\030DEVICEDRIVER_OPTIC" + "AL_TFS\020\t\022\032\n\026DEVICEDRIVER_IETF_ACTN\020\n\022\023\n\017" + "DEVICEDRIVER_OC\020\013\022\024\n\020DEVICEDRIVER_QKD\020\014\022" + "\033\n\027DEVICEDRIVER_IETF_L3VPN\020\r\022\033\n\027DEVICEDR" + "IVER_IETF_SLICE\020\016\022\024\n\020DEVICEDRIVER_NCE\020\017\022" + "\031\n\025DEVICEDRIVER_SMARTNIC\020\020\022\031\n\025DEVICEDRIV" + "ER_MORPHEUS\020\021\022\024\n\020DEVICEDRIVER_RYU\020\022\022#\n\037D" + "EVICEDRIVER_GNMI_NOKIA_SRLINUX\020\023\022\032\n\026DEVI" + "CEDRIVER_OPENROADM\020\024*\217\001\n\033DeviceOperation" + "alStatusEnum\022%\n!DEVICEOPERATIONALSTATUS_" + "UNDEFINED\020\000\022$\n DEVICEOPERATIONALSTATUS_D" + "ISABLED\020\001\022#\n\037DEVICEOPERATIONALSTATUS_ENA" + "BLED\020\002*\245\001\n\014LinkTypeEnum\022\024\n\020LINKTYPE_UNKN" + "OWN\020\000\022\023\n\017LINKTYPE_COPPER\020\001\022\022\n\016LINKTYPE_F" + "IBER\020\002\022\022\n\016LINKTYPE_RADIO\020\003\022\024\n\020LINKTYPE_V" + "IRTUAL\020\004\022\027\n\023LINKTYPE_MANAGEMENT\020\005\022\023\n\017LIN" + "KTYPE_REMOTE\020\006*\360\002\n\017ServiceTypeEnum\022\027\n\023SE" + "RVICETYPE_UNKNOWN\020\000\022\024\n\020SERVICETYPE_L3NM\020" + "\001\022\024\n\020SERVICETYPE_L2NM\020\002\022)\n%SERVICETYPE_T" + "API_CONNECTIVITY_SERVICE\020\003\022\022\n\016SERVICETYP" + "E_TE\020\004\022\023\n\017SERVICETYPE_E2E\020\005\022$\n SERVICETY" + "PE_OPTICAL_CONNECTIVITY\020\006\022\023\n\017SERVICETYPE" + "_QKD\020\007\022\024\n\020SERVICETYPE_L1NM\020\010\022\023\n\017SERVICET" + "YPE_INT\020\t\022\023\n\017SERVICETYPE_ACL\020\n\022\027\n\023SERVIC" + "ETYPE_IP_LINK\020\013\022\030\n\024SERVICETYPE_TAPI_LSP\020" + "\014\022\026\n\022SERVICETYPE_IPOWDM\020\r*\304\001\n\021ServiceSta" + "tusEnum\022\033\n\027SERVICESTATUS_UNDEFINED\020\000\022\031\n\025" + "SERVICESTATUS_PLANNED\020\001\022\030\n\024SERVICESTATUS" + "_ACTIVE\020\002\022\032\n\026SERVICESTATUS_UPDATING\020\003\022!\n" + "\035SERVICESTATUS_PENDING_REMOVAL\020\004\022\036\n\032SERV" + "ICESTATUS_SLA_VIOLATED\020\005*\251\001\n\017SliceStatus" + "Enum\022\031\n\025SLICESTATUS_UNDEFINED\020\000\022\027\n\023SLICE" + "STATUS_PLANNED\020\001\022\024\n\020SLICESTATUS_INIT\020\002\022\026" + "\n\022SLICESTATUS_ACTIVE\020\003\022\026\n\022SLICESTATUS_DE" + "INIT\020\004\022\034\n\030SLICESTATUS_SLA_VIOLATED\020\005*]\n\020" + "ConfigActionEnum\022\032\n\026CONFIGACTION_UNDEFIN" + "ED\020\000\022\024\n\020CONFIGACTION_SET\020\001\022\027\n\023CONFIGACTI" + "ON_DELETE\020\002*m\n\024ConstraintActionEnum\022\036\n\032C" + "ONSTRAINTACTION_UNDEFINED\020\000\022\030\n\024CONSTRAIN" + "TACTION_SET\020\001\022\033\n\027CONSTRAINTACTION_DELETE" + "\020\002*\203\002\n\022IsolationLevelEnum\022\020\n\014NO_ISOLATIO" + "N\020\000\022\026\n\022PHYSICAL_ISOLATION\020\001\022\025\n\021LOGICAL_I" + "SOLATION\020\002\022\025\n\021PROCESS_ISOLATION\020\003\022\035\n\031PHY" + "SICAL_MEMORY_ISOLATION\020\004\022\036\n\032PHYSICAL_NET" + "WORK_ISOLATION\020\005\022\036\n\032VIRTUAL_RESOURCE_ISO" + "LATION\020\006\022\037\n\033NETWORK_FUNCTIONS_ISOLATION\020" + "\007\022\025\n\021SERVICE_ISOLATION\020\0102\274\035\n\016ContextServ" + "ice\022:\n\016ListContextIds\022\016.context.Empty\032\026." + "context.ContextIdList\"\000\0226\n\014ListContexts\022" + "\016.context.Empty\032\024.context.ContextList\"\000\022" + "4\n\nGetContext\022\022.context.ContextId\032\020.cont" + "ext.Context\"\000\0224\n\nSetContext\022\020.context.Co" + "ntext\032\022.context.ContextId\"\000\0225\n\rRemoveCon" + "text\022\022.context.ContextId\032\016.context.Empty" + "\"\000\022=\n\020GetContextEvents\022\016.context.Empty\032\025" + ".context.ContextEvent\"\0000\001\022@\n\017ListTopolog" + "yIds\022\022.context.ContextId\032\027.context.Topol" + "ogyIdList\"\000\022=\n\016ListTopologies\022\022.context." + "ContextId\032\025.context.TopologyList\"\000\0227\n\013Ge" + "tTopology\022\023.context.TopologyId\032\021.context" + ".Topology\"\000\022E\n\022GetTopologyDetails\022\023.cont" + "ext.TopologyId\032\030.context.TopologyDetails" + "\"\000\0227\n\013SetTopology\022\021.context.Topology\032\023.c" + "ontext.TopologyId\"\000\0227\n\016RemoveTopology\022\023." + "context.TopologyId\032\016.context.Empty\"\000\022?\n\021" + "GetTopologyEvents\022\016.context.Empty\032\026.cont" + "ext.TopologyEvent\"\0000\001\0228\n\rListDeviceIds\022\016" + ".context.Empty\032\025.context.DeviceIdList\"\000\022" + "4\n\013ListDevices\022\016.context.Empty\032\023.context" + ".DeviceList\"\000\0221\n\tGetDevice\022\021.context.Dev" + "iceId\032\017.context.Device\"\000\0221\n\tSetDevice\022\017." + "context.Device\032\021.context.DeviceId\"\000\0223\n\014R" + "emoveDevice\022\021.context.DeviceId\032\016.context" + ".Empty\"\000\022;\n\017GetDeviceEvents\022\016.context.Em" + "pty\032\024.context.DeviceEvent\"\0000\001\022<\n\014SelectD" + "evice\022\025.context.DeviceFilter\032\023.context.D" + "eviceList\"\000\022I\n\021ListEndPointNames\022\027.conte" + "xt.EndPointIdList\032\031.context.EndPointName" + "List\"\000\0224\n\013ListLinkIds\022\016.context.Empty\032\023." + "context.LinkIdList\"\000\0220\n\tListLinks\022\016.cont" + "ext.Empty\032\021.context.LinkList\"\000\022+\n\007GetLin" + "k\022\017.context.LinkId\032\r.context.Link\"\000\022+\n\007S" + "etLink\022\r.context.Link\032\017.context.LinkId\"\000" + "\022/\n\nRemoveLink\022\017.context.LinkId\032\016.contex" + "t.Empty\"\000\0227\n\rGetLinkEvents\022\016.context.Emp" + "ty\032\022.context.LinkEvent\"\0000\001\022>\n\016ListServic" + "eIds\022\022.context.ContextId\032\026.context.Servi" + "ceIdList\"\000\022:\n\014ListServices\022\022.context.Con" + "textId\032\024.context.ServiceList\"\000\0224\n\nGetSer" + "vice\022\022.context.ServiceId\032\020.context.Servi" + "ce\"\000\0224\n\nSetService\022\020.context.Service\032\022.c" + "ontext.ServiceId\"\000\0226\n\014UnsetService\022\020.con" + "text.Service\032\022.context.ServiceId\"\000\0225\n\rRe" + "moveService\022\022.context.ServiceId\032\016.contex" + "t.Empty\"\000\022=\n\020GetServiceEvents\022\016.context." + "Empty\032\025.context.ServiceEvent\"\0000\001\022?\n\rSele" + "ctService\022\026.context.ServiceFilter\032\024.cont" + "ext.ServiceList\"\000\022:\n\014ListSliceIds\022\022.cont" + "ext.ContextId\032\024.context.SliceIdList\"\000\0226\n", "\nListSlices\022\022.context.ContextId\032\022.contex" + "t.SliceList\"\000\022.\n\010GetSlice\022\020.context.Slic" + "eId\032\016.context.Slice\"\000\022.\n\010SetSlice\022\016.cont" + "ext.Slice\032\020.context.SliceId\"\000\0220\n\nUnsetSl" + "ice\022\016.context.Slice\032\020.context.SliceId\"\000\022" + "1\n\013RemoveSlice\022\020.context.SliceId\032\016.conte" + "xt.Empty\"\000\0229\n\016GetSliceEvents\022\016.context.E" + "mpty\032\023.context.SliceEvent\"\0000\001\0229\n\013SelectS" + "lice\022\024.context.SliceFilter\032\022.context.Sli" + "ceList\"\000\022D\n\021ListConnectionIds\022\022.context." + "ServiceId\032\031.context.ConnectionIdList\"\000\022@" + "\n\017ListConnections\022\022.context.ServiceId\032\027." + "context.ConnectionList\"\000\022=\n\rGetConnectio" + "n\022\025.context.ConnectionId\032\023.context.Conne" + "ction\"\000\022=\n\rSetConnection\022\023.context.Conne" + "ction\032\025.context.ConnectionId\"\000\022;\n\020Remove" + "Connection\022\025.context.ConnectionId\032\016.cont" + "ext.Empty\"\000\022C\n\023GetConnectionEvents\022\016.con" + "text.Empty\032\030.context.ConnectionEvent\"\0000\001" + "\0225\n\014GetAllEvents\022\016.context.Empty\032\021.conte" + "xt.AnyEvent\"\0000\001\022@\n\020GetOpticalConfig\022\016.co" + "ntext.Empty\032\032.context.OpticalConfigList\"" + "\000\022F\n\020SetOpticalConfig\022\026.context.OpticalC" + "onfig\032\030.context.OpticalConfigId\"\000\022I\n\023Upd" + "ateOpticalConfig\022\026.context.OpticalConfig" + "\032\030.context.OpticalConfigId\"\000\022I\n\023SelectOp" + "ticalConfig\022\030.context.OpticalConfigId\032\026." + "context.OpticalConfig\"\000\022A\n\023DeleteOptical" + "Config\022\030.context.OpticalConfigId\032\016.conte" + "xt.Empty\"\000\022@\n\024DeleteOpticalChannel\022\026.con" + "text.OpticalConfig\032\016.context.Empty\"\000\0228\n\016" + "SetOpticalLink\022\024.context.OpticalLink\032\016.c" + "ontext.Empty\"\000\0229\n\016GetOpticalLink\022\017.conte" + "xt.LinkId\032\024.context.OpticalLink\"\000\0226\n\021Del" + "eteOpticalLink\022\017.context.LinkId\032\016.contex" + "t.Empty\"\000\022@\n\022GetOpticalLinkList\022\016.contex" + "t.Empty\032\030.context.OpticalLinkList\"\000\022<\n\016G" + "etOpticalBand\022\016.context.Empty\032\030.context." + "OpticalBandList\"\000\022C\n\021SelectOpticalBand\022\026" + ".context.OpticalBandId\032\024.context.Optical" + "Band\"\000\022G\n\027DeleteServiceConfigRule\022\032.cont" + "ext.ServiceConfigRule\032\016.context.Empty\"\000b" + "\006proto3" };
+        java.lang.String[] descriptorData = { "\n\rcontext.proto\022\007context\032\031google/protobu" + "f/any.proto\032\tacl.proto\032\014ipowdm.proto\032\rip" + "_link.proto\032\026kpi_sample_types.proto\032\016tap" + "i_lsp.proto\"\007\n\005Empty\"\024\n\004Uuid\022\014\n\004uuid\030\001 \001" + "(\t\"\036\n\tTimestamp\022\021\n\ttimestamp\030\001 \001(\001\"Z\n\005Ev" + "ent\022%\n\ttimestamp\030\001 \001(\0132\022.context.Timesta" + "mp\022*\n\nevent_type\030\002 \001(\0162\026.context.EventTy" + "peEnum\"\265\002\n\010AnyEvent\022(\n\007context\030\001 \001(\0132\025.c" + "ontext.ContextEventH\000\022*\n\010topology\030\002 \001(\0132" + "\026.context.TopologyEventH\000\022&\n\006device\030\003 \001(" + "\0132\024.context.DeviceEventH\000\022\"\n\004link\030\004 \001(\0132" + "\022.context.LinkEventH\000\022(\n\007service\030\005 \001(\0132\025" + ".context.ServiceEventH\000\022$\n\005slice\030\006 \001(\0132\023" + ".context.SliceEventH\000\022.\n\nconnection\030\007 \001(" + "\0132\030.context.ConnectionEventH\000B\007\n\005event\"0" + "\n\tContextId\022#\n\014context_uuid\030\001 \001(\0132\r.cont" + "ext.Uuid\"\351\001\n\007Context\022&\n\ncontext_id\030\001 \001(\013" + "2\022.context.ContextId\022\014\n\004name\030\002 \001(\t\022)\n\014to" + "pology_ids\030\003 \003(\0132\023.context.TopologyId\022\'\n" + "\013service_ids\030\004 \003(\0132\022.context.ServiceId\022#" + "\n\tslice_ids\030\005 \003(\0132\020.context.SliceId\022/\n\nc" + "ontroller\030\006 \001(\0132\033.context.TeraFlowContro" + "ller\"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.context.Context\"U\n\014Con" + "textEvent\022\035\n\005event\030\001 \001(\0132\016.context.Event" + "\022&\n\ncontext_id\030\002 \001(\0132\022.context.ContextId" + "\"Z\n\nTopologyId\022&\n\ncontext_id\030\001 \001(\0132\022.con" + "text.ContextId\022$\n\rtopology_uuid\030\002 \001(\0132\r." + "context.Uuid\"\267\001\n\010Topology\022(\n\013topology_id" + "\030\001 \001(\0132\023.context.TopologyId\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.context.LinkId\022)\n\020o" + "ptical_link_ids\030\005 \003(\0132\017.context.LinkId\"\266" + "\001\n\017TopologyDetails\022(\n\013topology_id\030\001 \001(\0132" + "\023.context.TopologyId\022\014\n\004name\030\002 \001(\t\022 \n\007de" + "vices\030\003 \003(\0132\017.context.Device\022\034\n\005links\030\004 " + "\003(\0132\r.context.Link\022+\n\roptical_links\030\005 \003(" + "\0132\024.context.OpticalLink\";\n\016TopologyIdLis" + "t\022)\n\014topology_ids\030\001 \003(\0132\023.context.Topolo" + "gyId\"5\n\014TopologyList\022%\n\ntopologies\030\001 \003(\013" + "2\021.context.Topology\"X\n\rTopologyEvent\022\035\n\005" + "event\030\001 \001(\0132\016.context.Event\022(\n\013topology_" + "id\030\002 \001(\0132\023.context.TopologyId\".\n\010DeviceI" + "d\022\"\n\013device_uuid\030\001 \001(\0132\r.context.Uuid\"\372\002" + "\n\006Device\022$\n\tdevice_id\030\001 \001(\0132\021.context.De" + "viceId\022\014\n\004name\030\002 \001(\t\022\023\n\013device_type\030\003 \001(" + "\t\022,\n\rdevice_config\030\004 \001(\0132\025.context.Devic" + "eConfig\022G\n\031device_operational_status\030\005 \001" + "(\0162$.context.DeviceOperationalStatusEnum" + "\0221\n\016device_drivers\030\006 \003(\0162\031.context.Devic" + "eDriverEnum\022+\n\020device_endpoints\030\007 \003(\0132\021." + "context.EndPoint\022&\n\ncomponents\030\010 \003(\0132\022.c" + "ontext.Component\022(\n\rcontroller_id\030\t \001(\0132" + "\021.context.DeviceId\"\311\001\n\tComponent\022%\n\016comp" + "onent_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\nattributes\030\004 \003(\0132" + "\".context.Component.AttributesEntry\022\016\n\006p" + "arent\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\014DeviceConfig\022)" + "\n\014config_rules\030\001 \003(\0132\023.context.ConfigRul" + "e\"5\n\014DeviceIdList\022%\n\ndevice_ids\030\001 \003(\0132\021." + "context.DeviceId\".\n\nDeviceList\022 \n\007device" + "s\030\001 \003(\0132\017.context.Device\"\216\001\n\014DeviceFilte" + "r\022)\n\ndevice_ids\030\001 \001(\0132\025.context.DeviceId" + "List\022\031\n\021include_endpoints\030\002 \001(\010\022\034\n\024inclu" + "de_config_rules\030\003 \001(\010\022\032\n\022include_compone" + "nts\030\004 \001(\010\"\200\001\n\013DeviceEvent\022\035\n\005event\030\001 \001(\013" + "2\016.context.Event\022$\n\tdevice_id\030\002 \001(\0132\021.co" + "ntext.DeviceId\022,\n\rdevice_config\030\003 \001(\0132\025." + "context.DeviceConfig\"*\n\006LinkId\022 \n\tlink_u" + "uid\030\001 \001(\0132\r.context.Uuid\"c\n\016LinkAttribut" + "es\022\030\n\020is_bidirectional\030\001 \001(\010\022\033\n\023total_ca" + "pacity_gbps\030\002 \001(\002\022\032\n\022used_capacity_gbps\030" + "\003 \001(\002\"\275\001\n\004Link\022 \n\007link_id\030\001 \001(\0132\017.contex" + "t.LinkId\022\014\n\004name\030\002 \001(\t\022(\n\tlink_type\030\003 \001(" + "\0162\025.context.LinkTypeEnum\022.\n\021link_endpoin" + "t_ids\030\004 \003(\0132\023.context.EndPointId\022+\n\nattr" + "ibutes\030\005 \001(\0132\027.context.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.cont" + "ext.Link\"L\n\tLinkEvent\022\035\n\005event\030\001 \001(\0132\016.c" + "ontext.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.ServiceId\022\014\n\004name\030\002 \001" + "(\t\022.\n\014service_type\030\003 \001(\0162\030.context.Servi" + "ceTypeEnum\0221\n\024service_endpoint_ids\030\004 \003(\013" + "2\023.context.EndPointId\0220\n\023service_constra" + "ints\030\005 \003(\0132\023.context.Constraint\022.\n\016servi" + "ce_status\030\006 \001(\0132\026.context.ServiceStatus\022" + ".\n\016service_config\030\007 \001(\0132\026.context.Servic" + "eConfig\022%\n\ttimestamp\030\010 \001(\0132\022.context.Tim" + "estamp\"C\n\rServiceStatus\0222\n\016service_statu" + "s\030\001 \001(\0162\032.context.ServiceStatusEnum\":\n\rS" + "erviceConfig\022)\n\014config_rules\030\001 \003(\0132\023.con" + "text.ConfigRule\"8\n\rServiceIdList\022\'\n\013serv" + "ice_ids\030\001 \003(\0132\022.context.ServiceId\"1\n\013Ser" + "viceList\022\"\n\010services\030\001 \003(\0132\020.context.Ser" + "vice\"\225\001\n\rServiceFilter\022+\n\013service_ids\030\001 " + "\001(\0132\026.context.ServiceIdList\022\034\n\024include_e" + "ndpoint_ids\030\002 \001(\010\022\033\n\023include_constraints" + "\030\003 \001(\010\022\034\n\024include_config_rules\030\004 \001(\010\"U\n\014" + "ServiceEvent\022\035\n\005event\030\001 \001(\0132\016.context.Ev" + "ent\022&\n\nservice_id\030\002 \001(\0132\022.context.Servic" + "eId\"T\n\007SliceId\022&\n\ncontext_id\030\001 \001(\0132\022.con" + "text.ContextId\022!\n\nslice_uuid\030\002 \001(\0132\r.con" + "text.Uuid\"\240\003\n\005Slice\022\"\n\010slice_id\030\001 \001(\0132\020." + "context.SliceId\022\014\n\004name\030\002 \001(\t\022/\n\022slice_e" + "ndpoint_ids\030\003 \003(\0132\023.context.EndPointId\022." + "\n\021slice_constraints\030\004 \003(\0132\023.context.Cons" + "traint\022-\n\021slice_service_ids\030\005 \003(\0132\022.cont" + "ext.ServiceId\022,\n\022slice_subslice_ids\030\006 \003(" + "\0132\020.context.SliceId\022*\n\014slice_status\030\007 \001(" + "\0132\024.context.SliceStatus\022*\n\014slice_config\030" + "\010 \001(\0132\024.context.SliceConfig\022(\n\013slice_own" + "er\030\t \001(\0132\023.context.SliceOwner\022%\n\ttimesta" + "mp\030\n \001(\0132\022.context.Timestamp\"E\n\nSliceOwn" + "er\022!\n\nowner_uuid\030\001 \001(\0132\r.context.Uuid\022\024\n" + "\014owner_string\030\002 \001(\t\"=\n\013SliceStatus\022.\n\014sl" + "ice_status\030\001 \001(\0162\030.context.SliceStatusEn" + "um\"8\n\013SliceConfig\022)\n\014config_rules\030\001 \003(\0132" + "\023.context.ConfigRule\"2\n\013SliceIdList\022#\n\ts" + "lice_ids\030\001 \003(\0132\020.context.SliceId\"+\n\tSlic" + "eList\022\036\n\006slices\030\001 \003(\0132\016.context.Slice\"\312\001" + "\n\013SliceFilter\022\'\n\tslice_ids\030\001 \001(\0132\024.conte" + "xt.SliceIdList\022\034\n\024include_endpoint_ids\030\002" + " \001(\010\022\033\n\023include_constraints\030\003 \001(\010\022\033\n\023inc" + "lude_service_ids\030\004 \001(\010\022\034\n\024include_subsli" + "ce_ids\030\005 \001(\010\022\034\n\024include_config_rules\030\006 \001" + "(\010\"O\n\nSliceEvent\022\035\n\005event\030\001 \001(\0132\016.contex" + "t.Event\022\"\n\010slice_id\030\002 \001(\0132\020.context.Slic" + "eId\"6\n\014ConnectionId\022&\n\017connection_uuid\030\001" + " \001(\0132\r.context.Uuid\"2\n\025ConnectionSetting" + "s_L0\022\031\n\021lsp_symbolic_name\030\001 \001(\t\"\236\001\n\025Conn" + "ectionSettings_L2\022\027\n\017src_mac_address\030\001 \001" + "(\t\022\027\n\017dst_mac_address\030\002 \001(\t\022\022\n\nether_typ" + "e\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\025Conn" + "ectionSettings_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\025Connec" + "tionSettings_L4\022\020\n\010src_port\030\001 \001(\r\022\020\n\010dst" + "_port\030\002 \001(\r\022\021\n\ttcp_flags\030\003 \001(\r\022\013\n\003ttl\030\004 " + "\001(\r\"\304\001\n\022ConnectionSettings\022*\n\002l0\030\001 \001(\0132\036" + ".context.ConnectionSettings_L0\022*\n\002l2\030\002 \001" + "(\0132\036.context.ConnectionSettings_L2\022*\n\002l3" + "\030\003 \001(\0132\036.context.ConnectionSettings_L3\022*" + "\n\002l4\030\004 \001(\0132\036.context.ConnectionSettings_" + "L4\"\363\001\n\nConnection\022,\n\rconnection_id\030\001 \001(\013" + "2\025.context.ConnectionId\022&\n\nservice_id\030\002 " + "\001(\0132\022.context.ServiceId\0223\n\026path_hops_end" + "point_ids\030\003 \003(\0132\023.context.EndPointId\022+\n\017" + "sub_service_ids\030\004 \003(\0132\022.context.ServiceI" + "d\022-\n\010settings\030\005 \001(\0132\033.context.Connection" + "Settings\"A\n\020ConnectionIdList\022-\n\016connecti" + "on_ids\030\001 \003(\0132\025.context.ConnectionId\":\n\016C" + "onnectionList\022(\n\013connections\030\001 \003(\0132\023.con" + "text.Connection\"^\n\017ConnectionEvent\022\035\n\005ev" + "ent\030\001 \001(\0132\016.context.Event\022,\n\rconnection_" + "id\030\002 \001(\0132\025.context.ConnectionId\"\202\001\n\nEndP" + "ointId\022(\n\013topology_id\030\001 \001(\0132\023.context.To" + "pologyId\022$\n\tdevice_id\030\002 \001(\0132\021.context.De" + "viceId\022$\n\rendpoint_uuid\030\003 \001(\0132\r.context." + "Uuid\"\310\002\n\010EndPoint\022(\n\013endpoint_id\030\001 \001(\0132\023" + ".context.EndPointId\022\014\n\004name\030\002 \001(\t\022\025\n\rend" + "point_type\030\003 \001(\t\0229\n\020kpi_sample_types\030\004 \003" + "(\0162\037.kpi_sample_types.KpiSampleType\022,\n\021e" + "ndpoint_location\030\005 \001(\0132\021.context.Locatio" + "n\0229\n\014capabilities\030\006 \003(\0132#.context.EndPoi" + "nt.CapabilitiesEntry\032I\n\021CapabilitiesEntr" + "y\022\013\n\003key\030\001 \001(\t\022#\n\005value\030\002 \001(\0132\024.google.p" + "rotobuf.Any:\0028\001\"{\n\014EndPointName\022(\n\013endpo" + "int_id\030\001 \001(\0132\023.context.EndPointId\022\023\n\013dev" + "ice_name\030\002 \001(\t\022\025\n\rendpoint_name\030\003 \001(\t\022\025\n" + "\rendpoint_type\030\004 \001(\t\";\n\016EndPointIdList\022)" + "\n\014endpoint_ids\030\001 \003(\0132\023.context.EndPointI" + "d\"A\n\020EndPointNameList\022-\n\016endpoint_names\030" + "\001 \003(\0132\025.context.EndPointName\"A\n\021ConfigRu" + "le_Custom\022\024\n\014resource_key\030\001 \001(\t\022\026\n\016resou" + "rce_value\030\002 \001(\t\"\213\001\n\016ConfigRule_ACL\022(\n\013en" + "dpoint_id\030\001 \001(\0132\023.context.EndPointId\022,\n\t" + "direction\030\002 \001(\0162\031.context.AclDirectionEn" + "um\022!\n\010rule_set\030\003 \001(\0132\017.acl.AclRuleSet\"f\n" + "\021ConfigRule_IPOWDM\022(\n\013endpoint_id\030\001 \001(\0132" + "\023.context.EndPointId\022\'\n\010rule_set\030\002 \001(\0132\025" + ".ipowdm.IpowdmRuleSet\"k\n\023ConfigRule_TAPI" + "_LSP\022(\n\013endpoint_id\030\001 \001(\0132\023.context.EndP" + "ointId\022*\n\010rule_set\030\002 \003(\0132\030.tapi_lsp.Tapi" + "LspRuleSet\"h\n\022ConfigRule_IP_LINK\022(\n\013endp" + "oint_id\030\001 \001(\0132\023.context.EndPointId\022(\n\010ru" + "le_set\030\002 \001(\0132\026.ip_link.IpLinkRuleSet\"\254\002\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\000\022.\n\007ip_link\030\004 \001(\0132\033." + "context.ConfigRule_IP_LINKH\000\0220\n\010tapi_lsp" + "\030\005 \001(\0132\034.context.ConfigRule_TAPI_LSPH\000\022," + "\n\006ipowdm\030\006 \001(\0132\032.context.ConfigRule_IPOW" + "DMH\000B\r\n\013config_rule\"F\n\021Constraint_Custom" + "\022\027\n\017constraint_type\030\001 \001(\t\022\030\n\020constraint_" + "value\030\002 \001(\t\"E\n\023Constraint_Schedule\022\027\n\017st" + "art_timestamp\030\001 \001(\001\022\025\n\rduration_days\030\002 \001" + "(\002\"3\n\014GPS_Position\022\020\n\010latitude\030\001 \001(\002\022\021\n\t" + "longitude\030\002 \001(\002\"\204\001\n\010Location\022\020\n\006region\030\001" + " \001(\tH\000\022-\n\014gps_position\030\002 \001(\0132\025.context.G" + "PS_PositionH\000\022\023\n\tinterface\030\003 \001(\tH\000\022\026\n\014ci" + "rcuit_pack\030\004 \001(\tH\000B\n\n\010location\"l\n\033Constr" + "aint_EndPointLocation\022(\n\013endpoint_id\030\001 \001" + "(\0132\023.context.EndPointId\022#\n\010location\030\002 \001(" + "\0132\021.context.Location\"Y\n\033Constraint_EndPo" + "intPriority\022(\n\013endpoint_id\030\001 \001(\0132\023.conte" + "xt.EndPointId\022\020\n\010priority\030\002 \001(\r\"0\n\026Const" + "raint_SLA_Latency\022\026\n\016e2e_latency_ms\030\001 \001(" + "\002\"0\n\027Constraint_SLA_Capacity\022\025\n\rcapacity" + "_gbps\030\001 \001(\002\"c\n\033Constraint_SLA_Availabili" + "ty\022\032\n\022num_disjoint_paths\030\001 \001(\r\022\022\n\nall_ac" + "tive\030\002 \001(\010\022\024\n\014availability\030\003 \001(\002\"V\n\036Cons" + "traint_SLA_Isolation_level\0224\n\017isolation_" + "level\030\001 \003(\0162\033.context.IsolationLevelEnum" + "\"\242\001\n\025Constraint_Exclusions\022\024\n\014is_permane" + "nt\030\001 \001(\010\022%\n\ndevice_ids\030\002 \003(\0132\021.context.D" + "eviceId\022)\n\014endpoint_ids\030\003 \003(\0132\023.context." + "EndPointId\022!\n\010link_ids\030\004 \003(\0132\017.context.L" + "inkId\"5\n\014QoSProfileId\022%\n\016qos_profile_id\030" + "\001 \001(\0132\r.context.Uuid\"`\n\025Constraint_QoSPr" + "ofile\022-\n\016qos_profile_id\030\001 \001(\0132\025.context." + "QoSProfileId\022\030\n\020qos_profile_name\030\002 \001(\t\"\222" + "\005\n\nConstraint\022-\n\006action\030\001 \001(\0162\035.context." + "ConstraintActionEnum\022,\n\006custom\030\002 \001(\0132\032.c" + "ontext.Constraint_CustomH\000\0220\n\010schedule\030\003" + " \001(\0132\034.context.Constraint_ScheduleH\000\022A\n\021" + "endpoint_location\030\004 \001(\0132$.context.Constr" + "aint_EndPointLocationH\000\022A\n\021endpoint_prio" + "rity\030\005 \001(\0132$.context.Constraint_EndPoint" + "PriorityH\000\0228\n\014sla_capacity\030\006 \001(\0132 .conte" + "xt.Constraint_SLA_CapacityH\000\0226\n\013sla_late" + "ncy\030\007 \001(\0132\037.context.Constraint_SLA_Laten" + "cyH\000\022@\n\020sla_availability\030\010 \001(\0132$.context" + ".Constraint_SLA_AvailabilityH\000\022@\n\rsla_is" + "olation\030\t \001(\0132\'.context.Constraint_SLA_I" + "solation_levelH\000\0224\n\nexclusions\030\n \001(\0132\036.c" + "ontext.Constraint_ExclusionsH\000\0225\n\013qos_pr" + "ofile\030\013 \001(\0132\036.context.Constraint_QoSProf" + "ileH\000B\014\n\nconstraint\"^\n\022TeraFlowControlle" + "r\022&\n\ncontext_id\030\001 \001(\0132\022.context.ContextI" + "d\022\022\n\nip_address\030\002 \001(\t\022\014\n\004port\030\003 \001(\r\"U\n\024A" + "uthenticationResult\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_u" + "uid\030\001 \001(\t\"y\n\rOpticalConfig\0222\n\020opticalcon" + "fig_id\030\001 \001(\0132\030.context.OpticalConfigId\022\016" + "\n\006config\030\002 \001(\t\022$\n\tdevice_id\030\003 \001(\0132\021.cont" + "ext.DeviceId\"C\n\021OpticalConfigList\022.\n\016opt" + "icalconfigs\030\001 \003(\0132\026.context.OpticalConfi" + "g\"g\n\022OpticalConfigEvent\022\035\n\005event\030\001 \001(\0132\016" + ".context.Event\0222\n\020opticalconfig_id\030\002 \001(\013" + "2\030.context.OpticalConfigId\"_\n\021OpticalEnd" + "PointId\022$\n\tdevice_id\030\002 \001(\0132\021.context.Dev" + "iceId\022$\n\rendpoint_uuid\030\003 \001(\0132\r.context.U" + "uid\">\n\017OpticalLinkList\022+\n\roptical_links\030" + "\001 \003(\0132\024.context.OpticalLink\"\304\003\n\022OpticalL" + "inkDetails\022\016\n\006length\030\001 \001(\002\022\020\n\010src_port\030\002" + " \001(\t\022\020\n\010dst_port\030\003 \001(\t\022\027\n\017local_peer_por" + "t\030\004 \001(\t\022\030\n\020remote_peer_port\030\005 \001(\t\022\014\n\004use" + "d\030\006 \001(\010\0228\n\007c_slots\030\007 \003(\0132\'.context.Optic" + "alLinkDetails.CSlotsEntry\0228\n\007l_slots\030\010 \003" + "(\0132\'.context.OpticalLinkDetails.LSlotsEn" + "try\0228\n\007s_slots\030\t \003(\0132\'.context.OpticalLi" + "nkDetails.SSlotsEntry\032-\n\013CSlotsEntry\022\013\n\003" + "key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\0028\001\032-\n\013LSlotsEn" + "try\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\0028\001\032-\n\013S" + "SlotsEntry\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\002" + "8\001\"\243\001\n\013OpticalLink\022\014\n\004name\030\001 \001(\t\0224\n\017opti" + "cal_details\030\002 \001(\0132\033.context.OpticalLinkD" + "etails\022 \n\007link_id\030\003 \001(\0132\017.context.LinkId" + "\022.\n\021link_endpoint_ids\030\004 \003(\0132\023.context.En" + "dPointId\"0\n\tChannelId\022#\n\014channel_uuid\030\001 " + "\001(\0132\r.context.Uuid\"8\n\rOpticalBandId\022\'\n\020o" + "pticalband_uuid\030\001 \001(\0132\r.context.Uuid\"\247\002\n" + "\013OpticalBand\022.\n\016opticalband_id\030\001 \001(\0132\026.c" + "ontext.OpticalBandId\022,\n\rconnection_id\030\002 " + "\001(\0132\025.context.ConnectionId\022&\n\nchannel_id" + "\030\003 \001(\0132\022.context.ChannelId\022&\n\nservice_id" + "\030\004 \001(\0132\022.context.ServiceId\022#\n\007service\030\005 " + "\001(\0132\020.context.ServiceH\000\022)\n\nconnection\030\006 " + "\001(\0132\023.context.ConnectionH\000\022\021\n\007channel\030\007 " + "\001(\tH\000B\007\n\005field\"=\n\017OpticalBandList\022*\n\014opt" + "icalbands\030\001 \003(\0132\024.context.OpticalBand\"r\n" + "\021ServiceConfigRule\022&\n\nservice_id\030\001 \001(\0132\022" + ".context.ServiceId\0225\n\021configrule_custom\030" + "\002 \001(\0132\032.context.ConfigRule_Custom*j\n\rEve" + "ntTypeEnum\022\027\n\023EVENTTYPE_UNDEFINED\020\000\022\024\n\020E" + "VENTTYPE_CREATE\020\001\022\024\n\020EVENTTYPE_UPDATE\020\002\022" + "\024\n\020EVENTTYPE_REMOVE\020\003*\333\004\n\020DeviceDriverEn" + "um\022\032\n\026DEVICEDRIVER_UNDEFINED\020\000\022\033\n\027DEVICE" + "DRIVER_OPENCONFIG\020\001\022\036\n\032DEVICEDRIVER_TRAN" + "SPORT_API\020\002\022\023\n\017DEVICEDRIVER_P4\020\003\022&\n\"DEVI" + "CEDRIVER_IETF_NETWORK_TOPOLOGY\020\004\022\033\n\027DEVI" + "CEDRIVER_ONF_TR_532\020\005\022\023\n\017DEVICEDRIVER_XR" + "\020\006\022\033\n\027DEVICEDRIVER_IETF_L2VPN\020\007\022 \n\034DEVIC" + "EDRIVER_GNMI_OPENCONFIG\020\010\022\034\n\030DEVICEDRIVE" + "R_OPTICAL_TFS\020\t\022\032\n\026DEVICEDRIVER_IETF_ACT" + "N\020\n\022\023\n\017DEVICEDRIVER_OC\020\013\022\024\n\020DEVICEDRIVER" + "_QKD\020\014\022\033\n\027DEVICEDRIVER_IETF_L3VPN\020\r\022\033\n\027D" + "EVICEDRIVER_IETF_SLICE\020\016\022\024\n\020DEVICEDRIVER" + "_NCE\020\017\022\031\n\025DEVICEDRIVER_SMARTNIC\020\020\022\031\n\025DEV" + "ICEDRIVER_MORPHEUS\020\021\022\024\n\020DEVICEDRIVER_RYU" + "\020\022\022#\n\037DEVICEDRIVER_GNMI_NOKIA_SRLINUX\020\023\022" + "\032\n\026DEVICEDRIVER_OPENROADM\020\024*\217\001\n\033DeviceOp" + "erationalStatusEnum\022%\n!DEVICEOPERATIONAL" + "STATUS_UNDEFINED\020\000\022$\n DEVICEOPERATIONALS" + "TATUS_DISABLED\020\001\022#\n\037DEVICEOPERATIONALSTA" + "TUS_ENABLED\020\002*\245\001\n\014LinkTypeEnum\022\024\n\020LINKTY" + "PE_UNKNOWN\020\000\022\023\n\017LINKTYPE_COPPER\020\001\022\022\n\016LIN" + "KTYPE_FIBER\020\002\022\022\n\016LINKTYPE_RADIO\020\003\022\024\n\020LIN" + "KTYPE_VIRTUAL\020\004\022\027\n\023LINKTYPE_MANAGEMENT\020\005" + "\022\023\n\017LINKTYPE_REMOTE\020\006*\360\002\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\022\023\n\017SERV" + "ICETYPE_QKD\020\007\022\024\n\020SERVICETYPE_L1NM\020\010\022\023\n\017S" + "ERVICETYPE_INT\020\t\022\023\n\017SERVICETYPE_ACL\020\n\022\027\n" + "\023SERVICETYPE_IP_LINK\020\013\022\030\n\024SERVICETYPE_TA" + "PI_LSP\020\014\022\026\n\022SERVICETYPE_IPOWDM\020\r*\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*\\\n\020AclDirectionEnum\022\025" + "\n\021ACLDIRECTION_BOTH\020\000\022\030\n\024ACLDIRECTION_IN" + "GRESS\020\001\022\027\n\023ACLDIRECTION_EGRESS\020\002*m\n\024Cons" + "traintActionEnum\022\036\n\032CONSTRAINTACTION_UND" + "EFINED\020\000\022\030\n\024CONSTRAINTACTION_SET\020\001\022\033\n\027CO" + "NSTRAINTACTION_DELETE\020\002*\203\002\n\022IsolationLev" + "elEnum\022\020\n\014NO_ISOLATION\020\000\022\026\n\022PHYSICAL_ISO" + "LATION\020\001\022\025\n\021LOGICAL_ISOLATION\020\002\022\025\n\021PROCE" + "SS_ISOLATION\020\003\022\035\n\031PHYSICAL_MEMORY_ISOLAT" + "ION\020\004\022\036\n\032PHYSICAL_NETWORK_ISOLATION\020\005\022\036\n" + "\032VIRTUAL_RESOURCE_ISOLATION\020\006\022\037\n\033NETWORK" + "_FUNCTIONS_ISOLATION\020\007\022\025\n\021SERVICE_ISOLAT" + "ION\020\0102\274\035\n\016ContextService\022:\n\016ListContextI" + "ds\022\016.context.Empty\032\026.context.ContextIdLi" + "st\"\000\0226\n\014ListContexts\022\016.context.Empty\032\024.c" + "ontext.ContextList\"\000\0224\n\nGetContext\022\022.con" + "text.ContextId\032\020.context.Context\"\000\0224\n\nSe" + "tContext\022\020.context.Context\032\022.context.Con" + "textId\"\000\0225\n\rRemoveContext\022\022.context.Cont" + "extId\032\016.context.Empty\"\000\022=\n\020GetContextEve" + "nts\022\016.context.Empty\032\025.context.ContextEve" + "nt\"\0000\001\022@\n\017ListTopologyIds\022\022.context.Cont" + "extId\032\027.context.TopologyIdList\"\000\022=\n\016List" + "Topologies\022\022.context.ContextId\032\025.context" + ".TopologyList\"\000\0227\n\013GetTopology\022\023.context" + ".TopologyId\032\021.context.Topology\"\000\022E\n\022GetT" + "opologyDetails\022\023.context.TopologyId\032\030.co" + "ntext.TopologyDetails\"\000\0227\n\013SetTopology\022\021" + ".context.Topology\032\023.context.TopologyId\"\000" + "\0227\n\016RemoveTopology\022\023.context.TopologyId\032" + "\016.context.Empty\"\000\022?\n\021GetTopologyEvents\022\016" + ".context.Empty\032\026.context.TopologyEvent\"\000" + "0\001\0228\n\rListDeviceIds\022\016.context.Empty\032\025.co" + "ntext.DeviceIdList\"\000\0224\n\013ListDevices\022\016.co" + "ntext.Empty\032\023.context.DeviceList\"\000\0221\n\tGe" + "tDevice\022\021.context.DeviceId\032\017.context.Dev" + "ice\"\000\0221\n\tSetDevice\022\017.context.Device\032\021.co" + "ntext.DeviceId\"\000\0223\n\014RemoveDevice\022\021.conte" + "xt.DeviceId\032\016.context.Empty\"\000\022;\n\017GetDevi" + "ceEvents\022\016.context.Empty\032\024.context.Devic" + "eEvent\"\0000\001\022<\n\014SelectDevice\022\025.context.Dev" + "iceFilter\032\023.context.DeviceList\"\000\022I\n\021List" + "EndPointNames\022\027.context.EndPointIdList\032\031" + ".context.EndPointNameList\"\000\0224\n\013ListLinkI" + "ds\022\016.context.Empty\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.Li" + "nk\032\017.context.LinkId\"\000\022/\n\nRemoveLink\022\017.co" + "ntext.LinkId\032\016.context.Empty\"\000\0227\n\rGetLin" + "kEvents\022\016.context.Empty\032\022.context.LinkEv" + "ent\"\0000\001\022>\n\016ListServiceIds\022\022.context.Cont" + "extId\032\026.context.ServiceIdList\"\000\022:\n\014ListS" + "ervices\022\022.context.ContextId\032\024.context.Se" + "rviceList\"\000\0224\n\nGetService\022\022.context.Serv" + "iceId\032\020.context.Service\"\000\0224\n\nSetService\022" + "\020.context.Service\032\022.context.ServiceId\"\000\022" + "6\n\014UnsetService\022\020.context.Service\032\022.cont" + "ext.ServiceId\"\000\0225\n\rRemoveService\022\022.conte" + "xt.ServiceId\032\016.context.Empty\"\000\022=\n\020GetSer" + "viceEvents\022\016.context.Empty\032\025.context.Ser", "viceEvent\"\0000\001\022?\n\rSelectService\022\026.context" + ".ServiceFilter\032\024.context.ServiceList\"\000\022:" + "\n\014ListSliceIds\022\022.context.ContextId\032\024.con" + "text.SliceIdList\"\000\0226\n\nListSlices\022\022.conte" + "xt.ContextId\032\022.context.SliceList\"\000\022.\n\010Ge" + "tSlice\022\020.context.SliceId\032\016.context.Slice" + "\"\000\022.\n\010SetSlice\022\016.context.Slice\032\020.context" + ".SliceId\"\000\0220\n\nUnsetSlice\022\016.context.Slice" + "\032\020.context.SliceId\"\000\0221\n\013RemoveSlice\022\020.co" + "ntext.SliceId\032\016.context.Empty\"\000\0229\n\016GetSl" + "iceEvents\022\016.context.Empty\032\023.context.Slic" + "eEvent\"\0000\001\0229\n\013SelectSlice\022\024.context.Slic" + "eFilter\032\022.context.SliceList\"\000\022D\n\021ListCon" + "nectionIds\022\022.context.ServiceId\032\031.context" + ".ConnectionIdList\"\000\022@\n\017ListConnections\022\022" + ".context.ServiceId\032\027.context.ConnectionL" + "ist\"\000\022=\n\rGetConnection\022\025.context.Connect" + "ionId\032\023.context.Connection\"\000\022=\n\rSetConne" + "ction\022\023.context.Connection\032\025.context.Con" + "nectionId\"\000\022;\n\020RemoveConnection\022\025.contex" + "t.ConnectionId\032\016.context.Empty\"\000\022C\n\023GetC" + "onnectionEvents\022\016.context.Empty\032\030.contex" + "t.ConnectionEvent\"\0000\001\0225\n\014GetAllEvents\022\016." + "context.Empty\032\021.context.AnyEvent\"\0000\001\022@\n\020" + "GetOpticalConfig\022\016.context.Empty\032\032.conte" + "xt.OpticalConfigList\"\000\022F\n\020SetOpticalConf" + "ig\022\026.context.OpticalConfig\032\030.context.Opt" + "icalConfigId\"\000\022I\n\023UpdateOpticalConfig\022\026." + "context.OpticalConfig\032\030.context.OpticalC" + "onfigId\"\000\022I\n\023SelectOpticalConfig\022\030.conte" + "xt.OpticalConfigId\032\026.context.OpticalConf" + "ig\"\000\022A\n\023DeleteOpticalConfig\022\030.context.Op" + "ticalConfigId\032\016.context.Empty\"\000\022@\n\024Delet" + "eOpticalChannel\022\026.context.OpticalConfig\032" + "\016.context.Empty\"\000\0228\n\016SetOpticalLink\022\024.co" + "ntext.OpticalLink\032\016.context.Empty\"\000\0229\n\016G" + "etOpticalLink\022\017.context.LinkId\032\024.context" + ".OpticalLink\"\000\0226\n\021DeleteOpticalLink\022\017.co" + "ntext.LinkId\032\016.context.Empty\"\000\022@\n\022GetOpt" + "icalLinkList\022\016.context.Empty\032\030.context.O" + "pticalLinkList\"\000\022<\n\016GetOpticalBand\022\016.con" + "text.Empty\032\030.context.OpticalBandList\"\000\022C" + "\n\021SelectOpticalBand\022\026.context.OpticalBan" + "dId\032\024.context.OpticalBand\"\000\022G\n\027DeleteSer" + "viceConfigRule\022\032.context.ServiceConfigRu" + "le\032\016.context.Empty\"\000b\006proto3" };
         descriptor = com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] { com.google.protobuf.AnyProto.getDescriptor(), acl.Acl.getDescriptor(), ipowdm.Ipowdm.getDescriptor(), ip_link.IpLink.getDescriptor(), kpi_sample_types.KpiSampleTypes.getDescriptor(), tapi_lsp.TapiLsp.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[] {});
@@ -90461,7 +90503,7 @@ public final class ContextOuterClass {
         internal_static_context_ConfigRule_Custom_descriptor = getDescriptor().getMessageTypes().get(62);
         internal_static_context_ConfigRule_Custom_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_ConfigRule_Custom_descriptor, new java.lang.String[] { "ResourceKey", "ResourceValue" });
         internal_static_context_ConfigRule_ACL_descriptor = getDescriptor().getMessageTypes().get(63);
-        internal_static_context_ConfigRule_ACL_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_ConfigRule_ACL_descriptor, new java.lang.String[] { "EndpointId", "RuleSet" });
+        internal_static_context_ConfigRule_ACL_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_ConfigRule_ACL_descriptor, new java.lang.String[] { "EndpointId", "Direction", "RuleSet" });
         internal_static_context_ConfigRule_IPOWDM_descriptor = getDescriptor().getMessageTypes().get(64);
         internal_static_context_ConfigRule_IPOWDM_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_ConfigRule_IPOWDM_descriptor, new java.lang.String[] { "EndpointId", "RuleSet" });
         internal_static_context_ConfigRule_TAPI_LSP_descriptor = getDescriptor().getMessageTypes().get(65);
diff --git a/src/policy/target/generated-sources/grpc/device/Device.java b/src/policy/target/generated-sources/grpc/device/Device.java
index 51f0b742d..87c434732 100644
--- a/src/policy/target/generated-sources/grpc/device/Device.java
+++ b/src/policy/target/generated-sources/grpc/device/Device.java
@@ -14,8 +14,8 @@ public final class Device {
         registerAllExtensions((com.google.protobuf.ExtensionRegistryLite) registry);
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:device.MonitoringSettings)
-    MonitoringSettingsOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface MonitoringSettingsOrBuilder extends // @@protoc_insertion_point(interface_extends:device.MonitoringSettings)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * 
@@ -91,9 +91,8 @@ public final class Device {
     /**
      * Protobuf type {@code device.MonitoringSettings}
      */
-    public static final class // @@protoc_insertion_point(message_implements:device.MonitoringSettings)
-    MonitoringSettings extends // @@protoc_insertion_point(message_implements:device.MonitoringSettings)
-    com.google.protobuf.GeneratedMessageV3 implements MonitoringSettingsOrBuilder {
+    public static final class MonitoringSettings extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:device.MonitoringSettings)
+    MonitoringSettingsOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -412,9 +411,8 @@ public final class Device {
         /**
          * Protobuf type {@code device.MonitoringSettings}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:device.MonitoringSettings)
-        Builder extends // @@protoc_insertion_point(builder_implements:device.MonitoringSettings)
-        com.google.protobuf.GeneratedMessageV3.Builder implements device.Device.MonitoringSettingsOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:device.MonitoringSettings)
+        device.Device.MonitoringSettingsOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return device.Device.internal_static_device_MonitoringSettings_descriptor;
diff --git a/src/policy/target/generated-sources/grpc/ip_link/IpLink.java b/src/policy/target/generated-sources/grpc/ip_link/IpLink.java
index f8ed44bf2..865a27401 100644
--- a/src/policy/target/generated-sources/grpc/ip_link/IpLink.java
+++ b/src/policy/target/generated-sources/grpc/ip_link/IpLink.java
@@ -14,8 +14,8 @@ public final class IpLink {
         registerAllExtensions((com.google.protobuf.ExtensionRegistryLite) registry);
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:ip_link.IpLinkRuleSet)
-    IpLinkRuleSetOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface IpLinkRuleSetOrBuilder extends // @@protoc_insertion_point(interface_extends:ip_link.IpLinkRuleSet)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * string ip = 1;
@@ -57,9 +57,8 @@ public final class IpLink {
     /**
      * Protobuf type {@code ip_link.IpLinkRuleSet}
      */
-    public static final class // @@protoc_insertion_point(message_implements:ip_link.IpLinkRuleSet)
-    IpLinkRuleSet extends // @@protoc_insertion_point(message_implements:ip_link.IpLinkRuleSet)
-    com.google.protobuf.GeneratedMessageV3 implements IpLinkRuleSetOrBuilder {
+    public static final class IpLinkRuleSet extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:ip_link.IpLinkRuleSet)
+    IpLinkRuleSetOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -363,9 +362,8 @@ public final class IpLink {
         /**
          * Protobuf type {@code ip_link.IpLinkRuleSet}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:ip_link.IpLinkRuleSet)
-        Builder extends // @@protoc_insertion_point(builder_implements:ip_link.IpLinkRuleSet)
-        com.google.protobuf.GeneratedMessageV3.Builder implements ip_link.IpLink.IpLinkRuleSetOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:ip_link.IpLinkRuleSet)
+        ip_link.IpLink.IpLinkRuleSetOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return ip_link.IpLink.internal_static_ip_link_IpLinkRuleSet_descriptor;
diff --git a/src/policy/target/generated-sources/grpc/monitoring/Monitoring.java b/src/policy/target/generated-sources/grpc/monitoring/Monitoring.java
index ed1f1a40e..8394fe275 100644
--- a/src/policy/target/generated-sources/grpc/monitoring/Monitoring.java
+++ b/src/policy/target/generated-sources/grpc/monitoring/Monitoring.java
@@ -14,8 +14,8 @@ public final class Monitoring {
         registerAllExtensions((com.google.protobuf.ExtensionRegistryLite) registry);
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.KpiDescriptor)
-    KpiDescriptorOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface KpiDescriptorOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.KpiDescriptor)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.KpiId kpi_id = 1;
@@ -189,9 +189,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.KpiDescriptor}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.KpiDescriptor)
-    KpiDescriptor extends // @@protoc_insertion_point(message_implements:monitoring.KpiDescriptor)
-    com.google.protobuf.GeneratedMessageV3 implements KpiDescriptorOrBuilder {
+    public static final class KpiDescriptor extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.KpiDescriptor)
+    KpiDescriptorOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -811,9 +810,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.KpiDescriptor}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.KpiDescriptor)
-        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.KpiDescriptor)
-        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.KpiDescriptorOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.KpiDescriptor)
+        monitoring.Monitoring.KpiDescriptorOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_KpiDescriptor_descriptor;
@@ -2396,8 +2394,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.MonitorKpiRequest)
-    MonitorKpiRequestOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface MonitorKpiRequestOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.MonitorKpiRequest)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.KpiId kpi_id = 1;
@@ -2436,9 +2434,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.MonitorKpiRequest}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.MonitorKpiRequest)
-    MonitorKpiRequest extends // @@protoc_insertion_point(message_implements:monitoring.MonitorKpiRequest)
-    com.google.protobuf.GeneratedMessageV3 implements MonitorKpiRequestOrBuilder {
+    public static final class MonitorKpiRequest extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.MonitorKpiRequest)
+    MonitorKpiRequestOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -2691,9 +2688,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.MonitorKpiRequest}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.MonitorKpiRequest)
-        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.MonitorKpiRequest)
-        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.MonitorKpiRequestOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.MonitorKpiRequest)
+        monitoring.Monitoring.MonitorKpiRequestOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_MonitorKpiRequest_descriptor;
@@ -3111,8 +3107,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.KpiQuery)
-    KpiQueryOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface KpiQueryOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.KpiQuery)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .monitoring.KpiId kpi_ids = 1;
@@ -3217,9 +3213,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.KpiQuery}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.KpiQuery)
-    KpiQuery extends // @@protoc_insertion_point(message_implements:monitoring.KpiQuery)
-    com.google.protobuf.GeneratedMessageV3 implements KpiQueryOrBuilder {
+    public static final class KpiQuery extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.KpiQuery)
+    KpiQueryOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -3600,9 +3595,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.KpiQuery}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.KpiQuery)
-        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.KpiQuery)
-        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.KpiQueryOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.KpiQuery)
+        monitoring.Monitoring.KpiQueryOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_KpiQuery_descriptor;
@@ -4521,8 +4515,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.RawKpi)
-    RawKpiOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface RawKpiOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.RawKpi)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Timestamp timestamp = 1;
@@ -4566,9 +4560,8 @@ public final class Monitoring {
      *
      * Protobuf type {@code monitoring.RawKpi}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.RawKpi)
-    RawKpi extends // @@protoc_insertion_point(message_implements:monitoring.RawKpi)
-    com.google.protobuf.GeneratedMessageV3 implements RawKpiOrBuilder {
+    public static final class RawKpi extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.RawKpi)
+    RawKpiOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -4821,9 +4814,8 @@ public final class Monitoring {
          *
          * Protobuf type {@code monitoring.RawKpi}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.RawKpi)
-        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.RawKpi)
-        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.RawKpiOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.RawKpi)
+        monitoring.Monitoring.RawKpiOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_RawKpi_descriptor;
@@ -5269,8 +5261,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.RawKpiList)
-    RawKpiListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface RawKpiListOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.RawKpiList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.KpiId kpi_id = 1;
@@ -5322,9 +5314,8 @@ public final class Monitoring {
      *
      * Protobuf type {@code monitoring.RawKpiList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.RawKpiList)
-    RawKpiList extends // @@protoc_insertion_point(message_implements:monitoring.RawKpiList)
-    com.google.protobuf.GeneratedMessageV3 implements RawKpiListOrBuilder {
+    public static final class RawKpiList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.RawKpiList)
+    RawKpiListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -5589,9 +5580,8 @@ public final class Monitoring {
          *
          * Protobuf type {@code monitoring.RawKpiList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.RawKpiList)
-        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.RawKpiList)
-        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.RawKpiListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.RawKpiList)
+        monitoring.Monitoring.RawKpiListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_RawKpiList_descriptor;
@@ -6194,8 +6184,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.RawKpiTable)
-    RawKpiTableOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface RawKpiTableOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.RawKpiTable)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .monitoring.RawKpiList raw_kpi_lists = 1;
@@ -6230,9 +6220,8 @@ public final class Monitoring {
      *
      * Protobuf type {@code monitoring.RawKpiTable}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.RawKpiTable)
-    RawKpiTable extends // @@protoc_insertion_point(message_implements:monitoring.RawKpiTable)
-    com.google.protobuf.GeneratedMessageV3 implements RawKpiTableOrBuilder {
+    public static final class RawKpiTable extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.RawKpiTable)
+    RawKpiTableOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -6451,9 +6440,8 @@ public final class Monitoring {
          *
          * Protobuf type {@code monitoring.RawKpiTable}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.RawKpiTable)
-        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.RawKpiTable)
-        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.RawKpiTableOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.RawKpiTable)
+        monitoring.Monitoring.RawKpiTableOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_RawKpiTable_descriptor;
@@ -6920,8 +6908,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.KpiId)
-    KpiIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface KpiIdOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.KpiId)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid kpi_id = 1;
@@ -6944,9 +6932,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.KpiId}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.KpiId)
-    KpiId extends // @@protoc_insertion_point(message_implements:monitoring.KpiId)
-    com.google.protobuf.GeneratedMessageV3 implements KpiIdOrBuilder {
+    public static final class KpiId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.KpiId)
+    KpiIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -7149,9 +7136,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.KpiId}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.KpiId)
-        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.KpiId)
-        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.KpiIdOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.KpiId)
+        monitoring.Monitoring.KpiIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_KpiId_descriptor;
@@ -7461,8 +7447,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.Kpi)
-    KpiOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface KpiOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.Kpi)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.KpiId kpi_id = 1;
@@ -7519,9 +7505,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.Kpi}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.Kpi)
-    Kpi extends // @@protoc_insertion_point(message_implements:monitoring.Kpi)
-    com.google.protobuf.GeneratedMessageV3 implements KpiOrBuilder {
+    public static final class Kpi extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.Kpi)
+    KpiOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -7816,9 +7801,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.Kpi}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.Kpi)
-        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.Kpi)
-        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.KpiOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.Kpi)
+        monitoring.Monitoring.KpiOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_Kpi_descriptor;
@@ -8400,8 +8384,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.KpiValueRange)
-    KpiValueRangeOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface KpiValueRangeOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.KpiValueRange)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.KpiValue kpiMinValue = 1;
@@ -8471,9 +8455,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.KpiValueRange}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.KpiValueRange)
-    KpiValueRange extends // @@protoc_insertion_point(message_implements:monitoring.KpiValueRange)
-    com.google.protobuf.GeneratedMessageV3 implements KpiValueRangeOrBuilder {
+    public static final class KpiValueRange extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.KpiValueRange)
+    KpiValueRangeOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -8803,9 +8786,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.KpiValueRange}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.KpiValueRange)
-        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.KpiValueRange)
-        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.KpiValueRangeOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.KpiValueRange)
+        monitoring.Monitoring.KpiValueRangeOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_KpiValueRange_descriptor;
@@ -9431,8 +9413,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.KpiValue)
-    KpiValueOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface KpiValueOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.KpiValue)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * int32 int32Val = 1;
@@ -9530,9 +9512,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.KpiValue}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.KpiValue)
-    KpiValue extends // @@protoc_insertion_point(message_implements:monitoring.KpiValue)
-    com.google.protobuf.GeneratedMessageV3 implements KpiValueOrBuilder {
+    public static final class KpiValue extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.KpiValue)
+    KpiValueOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -10050,9 +10031,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.KpiValue}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.KpiValue)
-        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.KpiValue)
-        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.KpiValueOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.KpiValue)
+        monitoring.Monitoring.KpiValueOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_KpiValue_descriptor;
@@ -10702,8 +10682,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.KpiList)
-    KpiListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface KpiListOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.KpiList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .monitoring.Kpi kpi = 1;
@@ -10734,9 +10714,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.KpiList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.KpiList)
-    KpiList extends // @@protoc_insertion_point(message_implements:monitoring.KpiList)
-    com.google.protobuf.GeneratedMessageV3 implements KpiListOrBuilder {
+    public static final class KpiList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.KpiList)
+    KpiListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -10951,9 +10930,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.KpiList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.KpiList)
-        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.KpiList)
-        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.KpiListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.KpiList)
+        monitoring.Monitoring.KpiListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_KpiList_descriptor;
@@ -11420,8 +11398,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.KpiDescriptorList)
-    KpiDescriptorListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface KpiDescriptorListOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.KpiDescriptorList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .monitoring.KpiDescriptor kpi_descriptor_list = 1;
@@ -11452,9 +11430,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.KpiDescriptorList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.KpiDescriptorList)
-    KpiDescriptorList extends // @@protoc_insertion_point(message_implements:monitoring.KpiDescriptorList)
-    com.google.protobuf.GeneratedMessageV3 implements KpiDescriptorListOrBuilder {
+    public static final class KpiDescriptorList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.KpiDescriptorList)
+    KpiDescriptorListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -11669,9 +11646,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.KpiDescriptorList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.KpiDescriptorList)
-        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.KpiDescriptorList)
-        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.KpiDescriptorListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.KpiDescriptorList)
+        monitoring.Monitoring.KpiDescriptorListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_KpiDescriptorList_descriptor;
@@ -12138,8 +12114,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.SubsDescriptor)
-    SubsDescriptorOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface SubsDescriptorOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.SubsDescriptor)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.SubscriptionID subs_id = 1;
@@ -12249,9 +12225,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.SubsDescriptor}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.SubsDescriptor)
-    SubsDescriptor extends // @@protoc_insertion_point(message_implements:monitoring.SubsDescriptor)
-    com.google.protobuf.GeneratedMessageV3 implements SubsDescriptorOrBuilder {
+    public static final class SubsDescriptor extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.SubsDescriptor)
+    SubsDescriptorOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -12662,9 +12637,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.SubsDescriptor}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.SubsDescriptor)
-        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.SubsDescriptor)
-        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.SubsDescriptorOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.SubsDescriptor)
+        monitoring.Monitoring.SubsDescriptorOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_SubsDescriptor_descriptor;
@@ -13550,8 +13524,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.SubscriptionID)
-    SubscriptionIDOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface SubscriptionIDOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.SubscriptionID)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid subs_id = 1;
@@ -13574,9 +13548,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.SubscriptionID}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.SubscriptionID)
-    SubscriptionID extends // @@protoc_insertion_point(message_implements:monitoring.SubscriptionID)
-    com.google.protobuf.GeneratedMessageV3 implements SubscriptionIDOrBuilder {
+    public static final class SubscriptionID extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.SubscriptionID)
+    SubscriptionIDOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -13779,9 +13752,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.SubscriptionID}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.SubscriptionID)
-        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.SubscriptionID)
-        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.SubscriptionIDOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.SubscriptionID)
+        monitoring.Monitoring.SubscriptionIDOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_SubscriptionID_descriptor;
@@ -14091,8 +14063,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.SubsResponse)
-    SubsResponseOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface SubsResponseOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.SubsResponse)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.SubscriptionID subs_id = 1;
@@ -14132,9 +14104,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.SubsResponse}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.SubsResponse)
-    SubsResponse extends // @@protoc_insertion_point(message_implements:monitoring.SubsResponse)
-    com.google.protobuf.GeneratedMessageV3 implements SubsResponseOrBuilder {
+    public static final class SubsResponse extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.SubsResponse)
+    SubsResponseOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -14383,9 +14354,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.SubsResponse}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.SubsResponse)
-        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.SubsResponse)
-        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.SubsResponseOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.SubsResponse)
+        monitoring.Monitoring.SubsResponseOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_SubsResponse_descriptor;
@@ -14831,8 +14801,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.SubsList)
-    SubsListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface SubsListOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.SubsList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .monitoring.SubsDescriptor subs_descriptor = 1;
@@ -14863,9 +14833,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.SubsList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.SubsList)
-    SubsList extends // @@protoc_insertion_point(message_implements:monitoring.SubsList)
-    com.google.protobuf.GeneratedMessageV3 implements SubsListOrBuilder {
+    public static final class SubsList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.SubsList)
+    SubsListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -15080,9 +15049,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.SubsList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.SubsList)
-        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.SubsList)
-        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.SubsListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.SubsList)
+        monitoring.Monitoring.SubsListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_SubsList_descriptor;
@@ -15549,8 +15517,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.AlarmDescriptor)
-    AlarmDescriptorOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface AlarmDescriptorOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.AlarmDescriptor)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.AlarmID alarm_id = 1;
@@ -15648,9 +15616,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.AlarmDescriptor}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.AlarmDescriptor)
-    AlarmDescriptor extends // @@protoc_insertion_point(message_implements:monitoring.AlarmDescriptor)
-    com.google.protobuf.GeneratedMessageV3 implements AlarmDescriptorOrBuilder {
+    public static final class AlarmDescriptor extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.AlarmDescriptor)
+    AlarmDescriptorOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -16089,9 +16056,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.AlarmDescriptor}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.AlarmDescriptor)
-        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.AlarmDescriptor)
-        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.AlarmDescriptorOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.AlarmDescriptor)
+        monitoring.Monitoring.AlarmDescriptorOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_AlarmDescriptor_descriptor;
@@ -16991,8 +16957,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.AlarmID)
-    AlarmIDOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface AlarmIDOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.AlarmID)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid alarm_id = 1;
@@ -17015,9 +16981,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.AlarmID}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.AlarmID)
-    AlarmID extends // @@protoc_insertion_point(message_implements:monitoring.AlarmID)
-    com.google.protobuf.GeneratedMessageV3 implements AlarmIDOrBuilder {
+    public static final class AlarmID extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.AlarmID)
+    AlarmIDOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -17220,9 +17185,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.AlarmID}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.AlarmID)
-        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.AlarmID)
-        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.AlarmIDOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.AlarmID)
+        monitoring.Monitoring.AlarmIDOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_AlarmID_descriptor;
@@ -17532,8 +17496,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.AlarmSubscription)
-    AlarmSubscriptionOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface AlarmSubscriptionOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.AlarmSubscription)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.AlarmID alarm_id = 1;
@@ -17568,9 +17532,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.AlarmSubscription}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.AlarmSubscription)
-    AlarmSubscription extends // @@protoc_insertion_point(message_implements:monitoring.AlarmSubscription)
-    com.google.protobuf.GeneratedMessageV3 implements AlarmSubscriptionOrBuilder {
+    public static final class AlarmSubscription extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.AlarmSubscription)
+    AlarmSubscriptionOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -17819,9 +17782,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.AlarmSubscription}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.AlarmSubscription)
-        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.AlarmSubscription)
-        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.AlarmSubscriptionOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.AlarmSubscription)
+        monitoring.Monitoring.AlarmSubscriptionOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_AlarmSubscription_descriptor;
@@ -18227,8 +18189,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.AlarmResponse)
-    AlarmResponseOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface AlarmResponseOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.AlarmResponse)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.AlarmID alarm_id = 1;
@@ -18280,9 +18242,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.AlarmResponse}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.AlarmResponse)
-    AlarmResponse extends // @@protoc_insertion_point(message_implements:monitoring.AlarmResponse)
-    com.google.protobuf.GeneratedMessageV3 implements AlarmResponseOrBuilder {
+    public static final class AlarmResponse extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.AlarmResponse)
+    AlarmResponseOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -18580,9 +18541,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.AlarmResponse}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.AlarmResponse)
-        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.AlarmResponse)
-        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.AlarmResponseOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.AlarmResponse)
+        monitoring.Monitoring.AlarmResponseOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_AlarmResponse_descriptor;
@@ -19119,8 +19079,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.AlarmList)
-    AlarmListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface AlarmListOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.AlarmList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .monitoring.AlarmDescriptor alarm_descriptor = 1;
@@ -19151,9 +19111,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.AlarmList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.AlarmList)
-    AlarmList extends // @@protoc_insertion_point(message_implements:monitoring.AlarmList)
-    com.google.protobuf.GeneratedMessageV3 implements AlarmListOrBuilder {
+    public static final class AlarmList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.AlarmList)
+    AlarmListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -19368,9 +19327,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.AlarmList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.AlarmList)
-        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.AlarmList)
-        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.AlarmListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.AlarmList)
+        monitoring.Monitoring.AlarmListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_AlarmList_descriptor;
@@ -19837,8 +19795,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.SSEMonitoringSubscriptionConfig)
-    SSEMonitoringSubscriptionConfigOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface SSEMonitoringSubscriptionConfigOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.SSEMonitoringSubscriptionConfig)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.DeviceId device_id = 1;
@@ -19917,9 +19875,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.SSEMonitoringSubscriptionConfig}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.SSEMonitoringSubscriptionConfig)
-    SSEMonitoringSubscriptionConfig extends // @@protoc_insertion_point(message_implements:monitoring.SSEMonitoringSubscriptionConfig)
-    com.google.protobuf.GeneratedMessageV3 implements SSEMonitoringSubscriptionConfigOrBuilder {
+    public static final class SSEMonitoringSubscriptionConfig extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.SSEMonitoringSubscriptionConfig)
+    SSEMonitoringSubscriptionConfigOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -20424,9 +20381,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.SSEMonitoringSubscriptionConfig}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.SSEMonitoringSubscriptionConfig)
-        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.SSEMonitoringSubscriptionConfig)
-        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.SSEMonitoringSubscriptionConfigOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.SSEMonitoringSubscriptionConfig)
+        monitoring.Monitoring.SSEMonitoringSubscriptionConfigOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_SSEMonitoringSubscriptionConfig_descriptor;
@@ -21102,8 +21058,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.SSEMonitoringSubscriptionResponse)
-    SSEMonitoringSubscriptionResponseOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface SSEMonitoringSubscriptionResponseOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.SSEMonitoringSubscriptionResponse)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * string identifier = 1;
@@ -21133,9 +21089,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.SSEMonitoringSubscriptionResponse}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.SSEMonitoringSubscriptionResponse)
-    SSEMonitoringSubscriptionResponse extends // @@protoc_insertion_point(message_implements:monitoring.SSEMonitoringSubscriptionResponse)
-    com.google.protobuf.GeneratedMessageV3 implements SSEMonitoringSubscriptionResponseOrBuilder {
+    public static final class SSEMonitoringSubscriptionResponse extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.SSEMonitoringSubscriptionResponse)
+    SSEMonitoringSubscriptionResponseOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -21390,9 +21345,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.SSEMonitoringSubscriptionResponse}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.SSEMonitoringSubscriptionResponse)
-        Builder extends // @@protoc_insertion_point(builder_implements:monitoring.SSEMonitoringSubscriptionResponse)
-        com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.SSEMonitoringSubscriptionResponseOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.SSEMonitoringSubscriptionResponse)
+        monitoring.Monitoring.SSEMonitoringSubscriptionResponseOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_SSEMonitoringSubscriptionResponse_descriptor;
diff --git a/src/policy/target/generated-sources/grpc/policy/Policy.java b/src/policy/target/generated-sources/grpc/policy/Policy.java
index 9f07cd0de..04d033e66 100644
--- a/src/policy/target/generated-sources/grpc/policy/Policy.java
+++ b/src/policy/target/generated-sources/grpc/policy/Policy.java
@@ -303,8 +303,8 @@ public final class Policy {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:policy.PolicyRuleId)
-    PolicyRuleIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface PolicyRuleIdOrBuilder extends // @@protoc_insertion_point(interface_extends:policy.PolicyRuleId)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid uuid = 1;
@@ -327,9 +327,8 @@ public final class Policy {
     /**
      * Protobuf type {@code policy.PolicyRuleId}
      */
-    public static final class // @@protoc_insertion_point(message_implements:policy.PolicyRuleId)
-    PolicyRuleId extends // @@protoc_insertion_point(message_implements:policy.PolicyRuleId)
-    com.google.protobuf.GeneratedMessageV3 implements PolicyRuleIdOrBuilder {
+    public static final class PolicyRuleId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:policy.PolicyRuleId)
+    PolicyRuleIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -532,9 +531,8 @@ public final class Policy {
         /**
          * Protobuf type {@code policy.PolicyRuleId}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:policy.PolicyRuleId)
-        Builder extends // @@protoc_insertion_point(builder_implements:policy.PolicyRuleId)
-        com.google.protobuf.GeneratedMessageV3.Builder implements policy.Policy.PolicyRuleIdOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:policy.PolicyRuleId)
+        policy.Policy.PolicyRuleIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return policy.Policy.internal_static_policy_PolicyRuleId_descriptor;
@@ -844,8 +842,8 @@ public final class Policy {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:policy.PolicyRuleState)
-    PolicyRuleStateOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface PolicyRuleStateOrBuilder extends // @@protoc_insertion_point(interface_extends:policy.PolicyRuleState)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .policy.PolicyRuleStateEnum policyRuleState = 1;
@@ -875,9 +873,8 @@ public final class Policy {
     /**
      * Protobuf type {@code policy.PolicyRuleState}
      */
-    public static final class // @@protoc_insertion_point(message_implements:policy.PolicyRuleState)
-    PolicyRuleState extends // @@protoc_insertion_point(message_implements:policy.PolicyRuleState)
-    com.google.protobuf.GeneratedMessageV3 implements PolicyRuleStateOrBuilder {
+    public static final class PolicyRuleState extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:policy.PolicyRuleState)
+    PolicyRuleStateOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -1117,9 +1114,8 @@ public final class Policy {
         /**
          * Protobuf type {@code policy.PolicyRuleState}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:policy.PolicyRuleState)
-        Builder extends // @@protoc_insertion_point(builder_implements:policy.PolicyRuleState)
-        com.google.protobuf.GeneratedMessageV3.Builder implements policy.Policy.PolicyRuleStateOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:policy.PolicyRuleState)
+        policy.Policy.PolicyRuleStateOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return policy.Policy.internal_static_policy_PolicyRuleState_descriptor;
@@ -1457,8 +1453,8 @@ public final class Policy {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:policy.PolicyRuleBasic)
-    PolicyRuleBasicOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface PolicyRuleBasicOrBuilder extends // @@protoc_insertion_point(interface_extends:policy.PolicyRuleBasic)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .policy.PolicyRuleId policyRuleId = 1;
@@ -1594,9 +1590,8 @@ public final class Policy {
      *
      * Protobuf type {@code policy.PolicyRuleBasic}
      */
-    public static final class // @@protoc_insertion_point(message_implements:policy.PolicyRuleBasic)
-    PolicyRuleBasic extends // @@protoc_insertion_point(message_implements:policy.PolicyRuleBasic)
-    com.google.protobuf.GeneratedMessageV3 implements PolicyRuleBasicOrBuilder {
+    public static final class PolicyRuleBasic extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:policy.PolicyRuleBasic)
+    PolicyRuleBasicOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -2020,9 +2015,8 @@ public final class Policy {
          *
          * Protobuf type {@code policy.PolicyRuleBasic}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:policy.PolicyRuleBasic)
-        Builder extends // @@protoc_insertion_point(builder_implements:policy.PolicyRuleBasic)
-        com.google.protobuf.GeneratedMessageV3.Builder implements policy.Policy.PolicyRuleBasicOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:policy.PolicyRuleBasic)
+        policy.Policy.PolicyRuleBasicOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return policy.Policy.internal_static_policy_PolicyRuleBasic_descriptor;
@@ -3089,8 +3083,8 @@ public final class Policy {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:policy.PolicyRuleService)
-    PolicyRuleServiceOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface PolicyRuleServiceOrBuilder extends // @@protoc_insertion_point(interface_extends:policy.PolicyRuleService)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * 
@@ -3203,9 +3197,8 @@ public final class Policy {
      *
      * Protobuf type {@code policy.PolicyRuleService}
      */
-    public static final class // @@protoc_insertion_point(message_implements:policy.PolicyRuleService)
-    PolicyRuleService extends // @@protoc_insertion_point(message_implements:policy.PolicyRuleService)
-    com.google.protobuf.GeneratedMessageV3 implements PolicyRuleServiceOrBuilder {
+    public static final class PolicyRuleService extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:policy.PolicyRuleService)
+    PolicyRuleServiceOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -3560,9 +3553,8 @@ public final class Policy {
          *
          * Protobuf type {@code policy.PolicyRuleService}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:policy.PolicyRuleService)
-        Builder extends // @@protoc_insertion_point(builder_implements:policy.PolicyRuleService)
-        com.google.protobuf.GeneratedMessageV3.Builder implements policy.Policy.PolicyRuleServiceOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:policy.PolicyRuleService)
+        policy.Policy.PolicyRuleServiceOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return policy.Policy.internal_static_policy_PolicyRuleService_descriptor;
@@ -4445,8 +4437,8 @@ public final class Policy {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:policy.PolicyRuleDevice)
-    PolicyRuleDeviceOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface PolicyRuleDeviceOrBuilder extends // @@protoc_insertion_point(interface_extends:policy.PolicyRuleDevice)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * 
@@ -4530,9 +4522,8 @@ public final class Policy {
      *
      * Protobuf type {@code policy.PolicyRuleDevice}
      */
-    public static final class // @@protoc_insertion_point(message_implements:policy.PolicyRuleDevice)
-    PolicyRuleDevice extends // @@protoc_insertion_point(message_implements:policy.PolicyRuleDevice)
-    com.google.protobuf.GeneratedMessageV3 implements PolicyRuleDeviceOrBuilder {
+    public static final class PolicyRuleDevice extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:policy.PolicyRuleDevice)
+    PolicyRuleDeviceOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -4829,9 +4820,8 @@ public final class Policy {
          *
          * Protobuf type {@code policy.PolicyRuleDevice}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:policy.PolicyRuleDevice)
-        Builder extends // @@protoc_insertion_point(builder_implements:policy.PolicyRuleDevice)
-        com.google.protobuf.GeneratedMessageV3.Builder implements policy.Policy.PolicyRuleDeviceOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:policy.PolicyRuleDevice)
+        policy.Policy.PolicyRuleDeviceOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return policy.Policy.internal_static_policy_PolicyRuleDevice_descriptor;
@@ -5542,8 +5532,8 @@ public final class Policy {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:policy.PolicyRule)
-    PolicyRuleOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface PolicyRuleOrBuilder extends // @@protoc_insertion_point(interface_extends:policy.PolicyRule)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .policy.PolicyRuleService service = 1;
@@ -5589,9 +5579,8 @@ public final class Policy {
      *
      * Protobuf type {@code policy.PolicyRule}
      */
-    public static final class // @@protoc_insertion_point(message_implements:policy.PolicyRule)
-    PolicyRule extends // @@protoc_insertion_point(message_implements:policy.PolicyRule)
-    com.google.protobuf.GeneratedMessageV3 implements PolicyRuleOrBuilder {
+    public static final class PolicyRule extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:policy.PolicyRule)
+    PolicyRuleOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -5905,9 +5894,8 @@ public final class Policy {
          *
          * Protobuf type {@code policy.PolicyRule}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:policy.PolicyRule)
-        Builder extends // @@protoc_insertion_point(builder_implements:policy.PolicyRule)
-        com.google.protobuf.GeneratedMessageV3.Builder implements policy.Policy.PolicyRuleOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:policy.PolicyRule)
+        policy.Policy.PolicyRuleOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return policy.Policy.internal_static_policy_PolicyRule_descriptor;
@@ -6428,8 +6416,8 @@ public final class Policy {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:policy.PolicyRuleIdList)
-    PolicyRuleIdListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface PolicyRuleIdListOrBuilder extends // @@protoc_insertion_point(interface_extends:policy.PolicyRuleIdList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .policy.PolicyRuleId policyRuleIdList = 1;
@@ -6464,9 +6452,8 @@ public final class Policy {
      *
      * Protobuf type {@code policy.PolicyRuleIdList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:policy.PolicyRuleIdList)
-    PolicyRuleIdList extends // @@protoc_insertion_point(message_implements:policy.PolicyRuleIdList)
-    com.google.protobuf.GeneratedMessageV3 implements PolicyRuleIdListOrBuilder {
+    public static final class PolicyRuleIdList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:policy.PolicyRuleIdList)
+    PolicyRuleIdListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -6685,9 +6672,8 @@ public final class Policy {
          *
          * Protobuf type {@code policy.PolicyRuleIdList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:policy.PolicyRuleIdList)
-        Builder extends // @@protoc_insertion_point(builder_implements:policy.PolicyRuleIdList)
-        com.google.protobuf.GeneratedMessageV3.Builder implements policy.Policy.PolicyRuleIdListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:policy.PolicyRuleIdList)
+        policy.Policy.PolicyRuleIdListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return policy.Policy.internal_static_policy_PolicyRuleIdList_descriptor;
@@ -7154,8 +7140,8 @@ public final class Policy {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:policy.PolicyRuleServiceList)
-    PolicyRuleServiceListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface PolicyRuleServiceListOrBuilder extends // @@protoc_insertion_point(interface_extends:policy.PolicyRuleServiceList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .policy.PolicyRuleService policyRuleServiceList = 1;
@@ -7190,9 +7176,8 @@ public final class Policy {
      *
      * Protobuf type {@code policy.PolicyRuleServiceList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:policy.PolicyRuleServiceList)
-    PolicyRuleServiceList extends // @@protoc_insertion_point(message_implements:policy.PolicyRuleServiceList)
-    com.google.protobuf.GeneratedMessageV3 implements PolicyRuleServiceListOrBuilder {
+    public static final class PolicyRuleServiceList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:policy.PolicyRuleServiceList)
+    PolicyRuleServiceListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -7411,9 +7396,8 @@ public final class Policy {
          *
          * Protobuf type {@code policy.PolicyRuleServiceList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:policy.PolicyRuleServiceList)
-        Builder extends // @@protoc_insertion_point(builder_implements:policy.PolicyRuleServiceList)
-        com.google.protobuf.GeneratedMessageV3.Builder implements policy.Policy.PolicyRuleServiceListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:policy.PolicyRuleServiceList)
+        policy.Policy.PolicyRuleServiceListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return policy.Policy.internal_static_policy_PolicyRuleServiceList_descriptor;
@@ -7880,8 +7864,8 @@ public final class Policy {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:policy.PolicyRuleDeviceList)
-    PolicyRuleDeviceListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface PolicyRuleDeviceListOrBuilder extends // @@protoc_insertion_point(interface_extends:policy.PolicyRuleDeviceList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .policy.PolicyRuleDevice policyRuleDeviceList = 1;
@@ -7916,9 +7900,8 @@ public final class Policy {
      *
      * Protobuf type {@code policy.PolicyRuleDeviceList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:policy.PolicyRuleDeviceList)
-    PolicyRuleDeviceList extends // @@protoc_insertion_point(message_implements:policy.PolicyRuleDeviceList)
-    com.google.protobuf.GeneratedMessageV3 implements PolicyRuleDeviceListOrBuilder {
+    public static final class PolicyRuleDeviceList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:policy.PolicyRuleDeviceList)
+    PolicyRuleDeviceListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -8137,9 +8120,8 @@ public final class Policy {
          *
          * Protobuf type {@code policy.PolicyRuleDeviceList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:policy.PolicyRuleDeviceList)
-        Builder extends // @@protoc_insertion_point(builder_implements:policy.PolicyRuleDeviceList)
-        com.google.protobuf.GeneratedMessageV3.Builder implements policy.Policy.PolicyRuleDeviceListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:policy.PolicyRuleDeviceList)
+        policy.Policy.PolicyRuleDeviceListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return policy.Policy.internal_static_policy_PolicyRuleDeviceList_descriptor;
@@ -8606,8 +8588,8 @@ public final class Policy {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:policy.PolicyRuleList)
-    PolicyRuleListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface PolicyRuleListOrBuilder extends // @@protoc_insertion_point(interface_extends:policy.PolicyRuleList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .policy.PolicyRule policyRules = 1;
@@ -8642,9 +8624,8 @@ public final class Policy {
      *
      * Protobuf type {@code policy.PolicyRuleList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:policy.PolicyRuleList)
-    PolicyRuleList extends // @@protoc_insertion_point(message_implements:policy.PolicyRuleList)
-    com.google.protobuf.GeneratedMessageV3 implements PolicyRuleListOrBuilder {
+    public static final class PolicyRuleList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:policy.PolicyRuleList)
+    PolicyRuleListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -8863,9 +8844,8 @@ public final class Policy {
          *
          * Protobuf type {@code policy.PolicyRuleList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:policy.PolicyRuleList)
-        Builder extends // @@protoc_insertion_point(builder_implements:policy.PolicyRuleList)
-        com.google.protobuf.GeneratedMessageV3.Builder implements policy.Policy.PolicyRuleListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:policy.PolicyRuleList)
+        policy.Policy.PolicyRuleListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return policy.Policy.internal_static_policy_PolicyRuleList_descriptor;
diff --git a/src/policy/target/generated-sources/grpc/policy/PolicyAction.java b/src/policy/target/generated-sources/grpc/policy/PolicyAction.java
index eb5ee9f5e..097097d6f 100644
--- a/src/policy/target/generated-sources/grpc/policy/PolicyAction.java
+++ b/src/policy/target/generated-sources/grpc/policy/PolicyAction.java
@@ -160,8 +160,8 @@ public final class PolicyAction {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:policy.PolicyRuleAction)
-    PolicyRuleActionOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface PolicyRuleActionOrBuilder extends // @@protoc_insertion_point(interface_extends:policy.PolicyRuleAction)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .policy.PolicyRuleActionEnum action = 1;
@@ -208,9 +208,8 @@ public final class PolicyAction {
      *
      * Protobuf type {@code policy.PolicyRuleAction}
      */
-    public static final class // @@protoc_insertion_point(message_implements:policy.PolicyRuleAction)
-    PolicyRuleAction extends // @@protoc_insertion_point(message_implements:policy.PolicyRuleAction)
-    com.google.protobuf.GeneratedMessageV3 implements PolicyRuleActionOrBuilder {
+    public static final class PolicyRuleAction extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:policy.PolicyRuleAction)
+    PolicyRuleActionOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -463,9 +462,8 @@ public final class PolicyAction {
          *
          * Protobuf type {@code policy.PolicyRuleAction}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:policy.PolicyRuleAction)
-        Builder extends // @@protoc_insertion_point(builder_implements:policy.PolicyRuleAction)
-        com.google.protobuf.GeneratedMessageV3.Builder implements policy.PolicyAction.PolicyRuleActionOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:policy.PolicyRuleAction)
+        policy.PolicyAction.PolicyRuleActionOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return policy.PolicyAction.internal_static_policy_PolicyRuleAction_descriptor;
@@ -1005,8 +1003,8 @@ public final class PolicyAction {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:policy.PolicyRuleActionConfig)
-    PolicyRuleActionConfigOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface PolicyRuleActionConfigOrBuilder extends // @@protoc_insertion_point(interface_extends:policy.PolicyRuleActionConfig)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * string action_key = 1;
@@ -1040,9 +1038,8 @@ public final class PolicyAction {
      *
      * Protobuf type {@code policy.PolicyRuleActionConfig}
      */
-    public static final class // @@protoc_insertion_point(message_implements:policy.PolicyRuleActionConfig)
-    PolicyRuleActionConfig extends // @@protoc_insertion_point(message_implements:policy.PolicyRuleActionConfig)
-    com.google.protobuf.GeneratedMessageV3 implements PolicyRuleActionConfigOrBuilder {
+    public static final class PolicyRuleActionConfig extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:policy.PolicyRuleActionConfig)
+    PolicyRuleActionConfigOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -1301,9 +1298,8 @@ public final class PolicyAction {
          *
          * Protobuf type {@code policy.PolicyRuleActionConfig}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:policy.PolicyRuleActionConfig)
-        Builder extends // @@protoc_insertion_point(builder_implements:policy.PolicyRuleActionConfig)
-        com.google.protobuf.GeneratedMessageV3.Builder implements policy.PolicyAction.PolicyRuleActionConfigOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:policy.PolicyRuleActionConfig)
+        policy.PolicyAction.PolicyRuleActionConfigOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return policy.PolicyAction.internal_static_policy_PolicyRuleActionConfig_descriptor;
diff --git a/src/policy/target/generated-sources/grpc/policy/PolicyCondition.java b/src/policy/target/generated-sources/grpc/policy/PolicyCondition.java
index 9dd6ed753..f5b5fd967 100644
--- a/src/policy/target/generated-sources/grpc/policy/PolicyCondition.java
+++ b/src/policy/target/generated-sources/grpc/policy/PolicyCondition.java
@@ -372,8 +372,8 @@ public final class PolicyCondition {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:policy.PolicyRuleCondition)
-    PolicyRuleConditionOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface PolicyRuleConditionOrBuilder extends // @@protoc_insertion_point(interface_extends:policy.PolicyRuleCondition)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * 
@@ -441,9 +441,8 @@ public final class PolicyCondition {
      *
      * Protobuf type {@code policy.PolicyRuleCondition}
      */
-    public static final class // @@protoc_insertion_point(message_implements:policy.PolicyRuleCondition)
-    PolicyRuleCondition extends // @@protoc_insertion_point(message_implements:policy.PolicyRuleCondition)
-    com.google.protobuf.GeneratedMessageV3 implements PolicyRuleConditionOrBuilder {
+    public static final class PolicyRuleCondition extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:policy.PolicyRuleCondition)
+    PolicyRuleConditionOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -742,9 +741,8 @@ public final class PolicyCondition {
          *
          * Protobuf type {@code policy.PolicyRuleCondition}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:policy.PolicyRuleCondition)
-        Builder extends // @@protoc_insertion_point(builder_implements:policy.PolicyRuleCondition)
-        com.google.protobuf.GeneratedMessageV3.Builder implements policy.PolicyCondition.PolicyRuleConditionOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:policy.PolicyRuleCondition)
+        policy.PolicyCondition.PolicyRuleConditionOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return policy.PolicyCondition.internal_static_policy_PolicyRuleCondition_descriptor;
diff --git a/src/policy/target/kubernetes/kubernetes.yml b/src/policy/target/kubernetes/kubernetes.yml
index 4b675c774..cab8865e0 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: f6ca78538c88e1affff6dd8908e6f14379f5d9ac
-    app.quarkus.io/build-timestamp: 2025-10-27 - 16:25:07 +0000
+    app.quarkus.io/commit-id: 0539e363a3349889ebd7d3d7b0509744e2a4d0aa
+    app.quarkus.io/build-timestamp: 2025-10-28 - 10:10:47 +0000
     prometheus.io/scrape: "true"
     prometheus.io/path: /q/metrics
     prometheus.io/port: "8080"
@@ -17,14 +17,14 @@ metadata:
   name: policyservice
 spec:
   ports:
-    - name: grpc
-      port: 6060
-      protocol: TCP
-      targetPort: 6060
     - name: http
       port: 9192
       protocol: TCP
       targetPort: 8080
+    - name: grpc
+      port: 6060
+      protocol: TCP
+      targetPort: 6060
     - name: https
       port: 443
       protocol: TCP
@@ -37,8 +37,8 @@ apiVersion: apps/v1
 kind: Deployment
 metadata:
   annotations:
-    app.quarkus.io/commit-id: f6ca78538c88e1affff6dd8908e6f14379f5d9ac
-    app.quarkus.io/build-timestamp: 2025-10-27 - 16:25:07 +0000
+    app.quarkus.io/commit-id: 0539e363a3349889ebd7d3d7b0509744e2a4d0aa
+    app.quarkus.io/build-timestamp: 2025-10-28 - 10:10:47 +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: f6ca78538c88e1affff6dd8908e6f14379f5d9ac
-        app.quarkus.io/build-timestamp: 2025-10-27 - 16:25:07 +0000
+        app.quarkus.io/commit-id: 0539e363a3349889ebd7d3d7b0509744e2a4d0aa
+        app.quarkus.io/build-timestamp: 2025-10-28 - 10:10:47 +0000
         prometheus.io/scrape: "true"
         prometheus.io/path: /q/metrics
         prometheus.io/port: "8080"
@@ -75,14 +75,14 @@ spec:
               valueFrom:
                 fieldRef:
                   fieldPath: metadata.namespace
-            - name: MONITORING_SERVICE_HOST
-              value: monitoringservice
-            - name: SERVICE_SERVICE_HOST
-              value: serviceservice
-            - name: KAFKA_BROKER_HOST
-              value: kafka-service.kafka.svc.cluster.local
             - name: CONTEXT_SERVICE_HOST
               value: contextservice
+            - name: KAFKA_BROKER_HOST
+              value: kafka-service.kafka.svc.cluster.local
+            - name: SERVICE_SERVICE_HOST
+              value: serviceservice
+            - name: MONITORING_SERVICE_HOST
+              value: monitoringservice
           image: labs.etsi.org:5050/tfs/controller/policy:0.1.0
           imagePullPolicy: Always
           livenessProbe:
@@ -97,12 +97,12 @@ spec:
             timeoutSeconds: 10
           name: policyservice
           ports:
-            - containerPort: 6060
-              name: grpc
-              protocol: TCP
             - containerPort: 8080
               name: http
               protocol: TCP
+            - containerPort: 6060
+              name: grpc
+              protocol: TCP
             - containerPort: 8443
               name: https
               protocol: TCP
diff --git a/src/ztp/target/generated-sources/grpc/acl/Acl.java b/src/ztp/target/generated-sources/grpc/acl/Acl.java
index 69677b4cc..037bd3858 100644
--- a/src/ztp/target/generated-sources/grpc/acl/Acl.java
+++ b/src/ztp/target/generated-sources/grpc/acl/Acl.java
@@ -397,8 +397,8 @@ public final class Acl {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:acl.AclMatch)
-    AclMatchOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface AclMatchOrBuilder extends // @@protoc_insertion_point(interface_extends:acl.AclMatch)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * uint32 dscp = 1;
@@ -476,9 +476,8 @@ public final class Acl {
     /**
      * Protobuf type {@code acl.AclMatch}
      */
-    public static final class // @@protoc_insertion_point(message_implements:acl.AclMatch)
-    // @@protoc_insertion_point(message_implements:acl.AclMatch)
-    AclMatch extends com.google.protobuf.GeneratedMessageV3 implements AclMatchOrBuilder {
+    public static final class AclMatch extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:acl.AclMatch)
+    AclMatchOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -920,9 +919,8 @@ public final class Acl {
         /**
          * Protobuf type {@code acl.AclMatch}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:acl.AclMatch)
-        // @@protoc_insertion_point(builder_implements:acl.AclMatch)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements acl.Acl.AclMatchOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:acl.AclMatch)
+        acl.Acl.AclMatchOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return acl.Acl.internal_static_acl_AclMatch_descriptor;
@@ -1657,8 +1655,8 @@ public final class Acl {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:acl.AclAction)
-    AclActionOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface AclActionOrBuilder extends // @@protoc_insertion_point(interface_extends:acl.AclAction)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .acl.AclForwardActionEnum forward_action = 1;
@@ -1688,9 +1686,8 @@ public final class Acl {
     /**
      * Protobuf type {@code acl.AclAction}
      */
-    public static final class // @@protoc_insertion_point(message_implements:acl.AclAction)
-    // @@protoc_insertion_point(message_implements:acl.AclAction)
-    AclAction extends com.google.protobuf.GeneratedMessageV3 implements AclActionOrBuilder {
+    public static final class AclAction extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:acl.AclAction)
+    AclActionOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -1915,9 +1912,8 @@ public final class Acl {
         /**
          * Protobuf type {@code acl.AclAction}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:acl.AclAction)
-        // @@protoc_insertion_point(builder_implements:acl.AclAction)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements acl.Acl.AclActionOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:acl.AclAction)
+        acl.Acl.AclActionOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return acl.Acl.internal_static_acl_AclAction_descriptor;
@@ -2237,8 +2233,8 @@ public final class Acl {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:acl.AclEntry)
-    AclEntryOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface AclEntryOrBuilder extends // @@protoc_insertion_point(interface_extends:acl.AclEntry)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * uint32 sequence_id = 1;
@@ -2296,9 +2292,8 @@ public final class Acl {
     /**
      * Protobuf type {@code acl.AclEntry}
      */
-    public static final class // @@protoc_insertion_point(message_implements:acl.AclEntry)
-    // @@protoc_insertion_point(message_implements:acl.AclEntry)
-    AclEntry extends com.google.protobuf.GeneratedMessageV3 implements AclEntryOrBuilder {
+    public static final class AclEntry extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:acl.AclEntry)
+    AclEntryOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -2619,9 +2614,8 @@ public final class Acl {
         /**
          * Protobuf type {@code acl.AclEntry}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:acl.AclEntry)
-        // @@protoc_insertion_point(builder_implements:acl.AclEntry)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements acl.Acl.AclEntryOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:acl.AclEntry)
+        acl.Acl.AclEntryOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return acl.Acl.internal_static_acl_AclEntry_descriptor;
@@ -3206,8 +3200,8 @@ public final class Acl {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:acl.AclRuleSet)
-    AclRuleSetOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface AclRuleSetOrBuilder extends // @@protoc_insertion_point(interface_extends:acl.AclRuleSet)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * string name = 1;
@@ -3286,9 +3280,8 @@ public final class Acl {
     /**
      * Protobuf type {@code acl.AclRuleSet}
      */
-    public static final class // @@protoc_insertion_point(message_implements:acl.AclRuleSet)
-    // @@protoc_insertion_point(message_implements:acl.AclRuleSet)
-    AclRuleSet extends com.google.protobuf.GeneratedMessageV3 implements AclRuleSetOrBuilder {
+    public static final class AclRuleSet extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:acl.AclRuleSet)
+    AclRuleSetOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -3684,9 +3677,8 @@ public final class Acl {
         /**
          * Protobuf type {@code acl.AclRuleSet}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:acl.AclRuleSet)
-        // @@protoc_insertion_point(builder_implements:acl.AclRuleSet)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements acl.Acl.AclRuleSetOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:acl.AclRuleSet)
+        acl.Acl.AclRuleSetOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return acl.Acl.internal_static_acl_AclRuleSet_descriptor;
diff --git a/src/ztp/target/generated-sources/grpc/context/ContextOuterClass.java b/src/ztp/target/generated-sources/grpc/context/ContextOuterClass.java
index 5d488e676..558aa9778 100644
--- a/src/ztp/target/generated-sources/grpc/context/ContextOuterClass.java
+++ b/src/ztp/target/generated-sources/grpc/context/ContextOuterClass.java
@@ -1378,6 +1378,119 @@ public final class ContextOuterClass {
         }
     }
 
+    /**
+     * Protobuf enum {@code context.AclDirectionEnum}
+     */
+    public enum AclDirectionEnum implements com.google.protobuf.ProtocolMessageEnum {
+
+        /**
+         * ACLDIRECTION_BOTH = 0;
+         */
+        ACLDIRECTION_BOTH(0),
+        /**
+         * ACLDIRECTION_INGRESS = 1;
+         */
+        ACLDIRECTION_INGRESS(1),
+        /**
+         * ACLDIRECTION_EGRESS = 2;
+         */
+        ACLDIRECTION_EGRESS(2),
+        UNRECOGNIZED(-1);
+
+        /**
+         * ACLDIRECTION_BOTH = 0;
+         */
+        public static final int ACLDIRECTION_BOTH_VALUE = 0;
+
+        /**
+         * ACLDIRECTION_INGRESS = 1;
+         */
+        public static final int ACLDIRECTION_INGRESS_VALUE = 1;
+
+        /**
+         * ACLDIRECTION_EGRESS = 2;
+         */
+        public static final int ACLDIRECTION_EGRESS_VALUE = 2;
+
+        public final int getNumber() {
+            if (this == UNRECOGNIZED) {
+                throw new java.lang.IllegalArgumentException("Can't get the number of an unknown enum value.");
+            }
+            return value;
+        }
+
+        /**
+         * @param value The numeric wire value of the corresponding enum entry.
+         * @return The enum associated with the given numeric wire value.
+         * @deprecated Use {@link #forNumber(int)} instead.
+         */
+        @java.lang.Deprecated
+        public static AclDirectionEnum valueOf(int value) {
+            return forNumber(value);
+        }
+
+        /**
+         * @param value The numeric wire value of the corresponding enum entry.
+         * @return The enum associated with the given numeric wire value.
+         */
+        public static AclDirectionEnum forNumber(int value) {
+            switch(value) {
+                case 0:
+                    return ACLDIRECTION_BOTH;
+                case 1:
+                    return ACLDIRECTION_INGRESS;
+                case 2:
+                    return ACLDIRECTION_EGRESS;
+                default:
+                    return null;
+            }
+        }
+
+        public static com.google.protobuf.Internal.EnumLiteMap internalGetValueMap() {
+            return internalValueMap;
+        }
+
+        private static final com.google.protobuf.Internal.EnumLiteMap internalValueMap = new com.google.protobuf.Internal.EnumLiteMap() {
+
+            public AclDirectionEnum findValueByNumber(int number) {
+                return AclDirectionEnum.forNumber(number);
+            }
+        };
+
+        public final com.google.protobuf.Descriptors.EnumValueDescriptor getValueDescriptor() {
+            if (this == UNRECOGNIZED) {
+                throw new java.lang.IllegalStateException("Can't get the descriptor of an unrecognized enum value.");
+            }
+            return getDescriptor().getValues().get(ordinal());
+        }
+
+        public final com.google.protobuf.Descriptors.EnumDescriptor getDescriptorForType() {
+            return getDescriptor();
+        }
+
+        public static final com.google.protobuf.Descriptors.EnumDescriptor getDescriptor() {
+            return context.ContextOuterClass.getDescriptor().getEnumTypes().get(8);
+        }
+
+        private static final AclDirectionEnum[] VALUES = values();
+
+        public static AclDirectionEnum valueOf(com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+            if (desc.getType() != getDescriptor()) {
+                throw new java.lang.IllegalArgumentException("EnumValueDescriptor is not for this type.");
+            }
+            if (desc.getIndex() == -1) {
+                return UNRECOGNIZED;
+            }
+            return VALUES[desc.getIndex()];
+        }
+
+        private final int value;
+
+        private AclDirectionEnum(int value) {
+            this.value = value;
+        }
+    }
+
     /**
      * 
      * ----- Constraint ----------------------------------------------------------------------------------------------------
@@ -1473,7 +1586,7 @@ public final class ContextOuterClass {
         }
 
         public static final com.google.protobuf.Descriptors.EnumDescriptor getDescriptor() {
-            return context.ContextOuterClass.getDescriptor().getEnumTypes().get(8);
+            return context.ContextOuterClass.getDescriptor().getEnumTypes().get(9);
         }
 
         private static final ConstraintActionEnum[] VALUES = values();
@@ -1652,7 +1765,7 @@ public final class ContextOuterClass {
         }
 
         public static final com.google.protobuf.Descriptors.EnumDescriptor getDescriptor() {
-            return context.ContextOuterClass.getDescriptor().getEnumTypes().get(9);
+            return context.ContextOuterClass.getDescriptor().getEnumTypes().get(10);
         }
 
         private static final IsolationLevelEnum[] VALUES = values();
@@ -1674,8 +1787,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Empty)
-    EmptyOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface EmptyOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Empty)
+    com.google.protobuf.MessageOrBuilder {
     }
 
     /**
@@ -1685,9 +1798,8 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.Empty}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Empty)
-    // @@protoc_insertion_point(message_implements:context.Empty)
-    Empty extends com.google.protobuf.GeneratedMessageV3 implements EmptyOrBuilder {
+    public static final class Empty extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Empty)
+    EmptyOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -1848,9 +1960,8 @@ public final class ContextOuterClass {
          *
          * Protobuf type {@code context.Empty}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Empty)
-        // @@protoc_insertion_point(builder_implements:context.Empty)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.EmptyOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Empty)
+        context.ContextOuterClass.EmptyOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Empty_descriptor;
@@ -2014,8 +2125,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Uuid)
-    UuidOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface UuidOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Uuid)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * string uuid = 1;
@@ -2033,9 +2144,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Uuid}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Uuid)
-    // @@protoc_insertion_point(message_implements:context.Uuid)
-    Uuid extends com.google.protobuf.GeneratedMessageV3 implements UuidOrBuilder {
+    public static final class Uuid extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Uuid)
+    UuidOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -2241,9 +2351,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Uuid}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Uuid)
-        // @@protoc_insertion_point(builder_implements:context.Uuid)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.UuidOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Uuid)
+        context.ContextOuterClass.UuidOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Uuid_descriptor;
@@ -2508,8 +2617,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Timestamp)
-    TimestampOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface TimestampOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Timestamp)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * double timestamp = 1;
@@ -2521,9 +2630,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Timestamp}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Timestamp)
-    // @@protoc_insertion_point(message_implements:context.Timestamp)
-    Timestamp extends com.google.protobuf.GeneratedMessageV3 implements TimestampOrBuilder {
+    public static final class Timestamp extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Timestamp)
+    TimestampOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -2703,9 +2811,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Timestamp}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Timestamp)
-        // @@protoc_insertion_point(builder_implements:context.Timestamp)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.TimestampOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Timestamp)
+        context.ContextOuterClass.TimestampOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Timestamp_descriptor;
@@ -2927,8 +3034,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Event)
-    EventOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface EventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Event)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Timestamp timestamp = 1;
@@ -2963,9 +3070,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Event}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Event)
-    // @@protoc_insertion_point(message_implements:context.Event)
-    Event extends com.google.protobuf.GeneratedMessageV3 implements EventOrBuilder {
+    public static final class Event extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Event)
+    EventOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -3202,9 +3308,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Event}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Event)
-        // @@protoc_insertion_point(builder_implements:context.Event)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.EventOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Event)
+        context.ContextOuterClass.EventOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Event_descriptor;
@@ -3587,8 +3692,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.AnyEvent)
-    AnyEventOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface AnyEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.AnyEvent)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ContextEvent context = 1;
@@ -3715,9 +3820,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.AnyEvent}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.AnyEvent)
-    // @@protoc_insertion_point(message_implements:context.AnyEvent)
-    AnyEvent extends com.google.protobuf.GeneratedMessageV3 implements AnyEventOrBuilder {
+    public static final class AnyEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.AnyEvent)
+    AnyEventOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -4284,9 +4388,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.AnyEvent}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.AnyEvent)
-        // @@protoc_insertion_point(builder_implements:context.AnyEvent)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.AnyEventOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.AnyEvent)
+        context.ContextOuterClass.AnyEventOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_AnyEvent_descriptor;
@@ -5602,8 +5705,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ContextId)
-    ContextIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ContextIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ContextId)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid context_uuid = 1;
@@ -5630,9 +5733,8 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.ContextId}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ContextId)
-    // @@protoc_insertion_point(message_implements:context.ContextId)
-    ContextId extends com.google.protobuf.GeneratedMessageV3 implements ContextIdOrBuilder {
+    public static final class ContextId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ContextId)
+    ContextIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -5839,9 +5941,8 @@ public final class ContextOuterClass {
          *
          * Protobuf type {@code context.ContextId}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ContextId)
-        // @@protoc_insertion_point(builder_implements:context.ContextId)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ContextIdOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ContextId)
+        context.ContextOuterClass.ContextIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ContextId_descriptor;
@@ -6151,8 +6252,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Context)
-    ContextOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ContextOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Context)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ContextId context_id = 1;
@@ -6279,9 +6380,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Context}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Context)
-    // @@protoc_insertion_point(message_implements:context.Context)
-    Context extends com.google.protobuf.GeneratedMessageV3 implements ContextOrBuilder {
+    public static final class Context extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Context)
+    ContextOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -6753,9 +6853,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Context}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Context)
-        // @@protoc_insertion_point(builder_implements:context.Context)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ContextOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Context)
+        context.ContextOuterClass.ContextOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Context_descriptor;
@@ -8163,8 +8262,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ContextIdList)
-    ContextIdListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ContextIdListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ContextIdList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.ContextId context_ids = 1;
@@ -8195,9 +8294,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ContextIdList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ContextIdList)
-    // @@protoc_insertion_point(message_implements:context.ContextIdList)
-    ContextIdList extends com.google.protobuf.GeneratedMessageV3 implements ContextIdListOrBuilder {
+    public static final class ContextIdList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ContextIdList)
+    ContextIdListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -8412,9 +8510,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ContextIdList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ContextIdList)
-        // @@protoc_insertion_point(builder_implements:context.ContextIdList)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ContextIdListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ContextIdList)
+        context.ContextOuterClass.ContextIdListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ContextIdList_descriptor;
@@ -8881,8 +8978,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ContextList)
-    ContextListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ContextListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ContextList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.Context contexts = 1;
@@ -8913,9 +9010,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ContextList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ContextList)
-    // @@protoc_insertion_point(message_implements:context.ContextList)
-    ContextList extends com.google.protobuf.GeneratedMessageV3 implements ContextListOrBuilder {
+    public static final class ContextList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ContextList)
+    ContextListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -9130,9 +9226,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ContextList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ContextList)
-        // @@protoc_insertion_point(builder_implements:context.ContextList)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ContextListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ContextList)
+        context.ContextOuterClass.ContextListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ContextList_descriptor;
@@ -9599,8 +9694,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ContextEvent)
-    ContextEventOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ContextEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ContextEvent)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Event event = 1;
@@ -9640,9 +9735,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ContextEvent}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ContextEvent)
-    // @@protoc_insertion_point(message_implements:context.ContextEvent)
-    ContextEvent extends com.google.protobuf.GeneratedMessageV3 implements ContextEventOrBuilder {
+    public static final class ContextEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ContextEvent)
+    ContextEventOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -9891,9 +9985,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ContextEvent}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ContextEvent)
-        // @@protoc_insertion_point(builder_implements:context.ContextEvent)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ContextEventOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ContextEvent)
+        context.ContextOuterClass.ContextEventOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ContextEvent_descriptor;
@@ -10339,8 +10432,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.TopologyId)
-    TopologyIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface TopologyIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.TopologyId)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ContextId context_id = 1;
@@ -10384,9 +10477,8 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.TopologyId}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.TopologyId)
-    // @@protoc_insertion_point(message_implements:context.TopologyId)
-    TopologyId extends com.google.protobuf.GeneratedMessageV3 implements TopologyIdOrBuilder {
+    public static final class TopologyId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.TopologyId)
+    TopologyIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -10639,9 +10731,8 @@ public final class ContextOuterClass {
          *
          * Protobuf type {@code context.TopologyId}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.TopologyId)
-        // @@protoc_insertion_point(builder_implements:context.TopologyId)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.TopologyIdOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.TopologyId)
+        context.ContextOuterClass.TopologyIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_TopologyId_descriptor;
@@ -11087,8 +11178,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Topology)
-    TopologyOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface TopologyOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Topology)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.TopologyId topology_id = 1;
@@ -11198,9 +11289,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Topology}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Topology)
-    // @@protoc_insertion_point(message_implements:context.Topology)
-    Topology extends com.google.protobuf.GeneratedMessageV3 implements TopologyOrBuilder {
+    public static final class Topology extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Topology)
+    TopologyOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -11626,9 +11716,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Topology}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Topology)
-        // @@protoc_insertion_point(builder_implements:context.Topology)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.TopologyOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Topology)
+        context.ContextOuterClass.TopologyOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Topology_descriptor;
@@ -12900,8 +12989,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.TopologyDetails)
-    TopologyDetailsOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface TopologyDetailsOrBuilder extends // @@protoc_insertion_point(interface_extends:context.TopologyDetails)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.TopologyId topology_id = 1;
@@ -13011,9 +13100,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.TopologyDetails}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.TopologyDetails)
-    // @@protoc_insertion_point(message_implements:context.TopologyDetails)
-    TopologyDetails extends com.google.protobuf.GeneratedMessageV3 implements TopologyDetailsOrBuilder {
+    public static final class TopologyDetails extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.TopologyDetails)
+    TopologyDetailsOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -13439,9 +13527,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.TopologyDetails}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.TopologyDetails)
-        // @@protoc_insertion_point(builder_implements:context.TopologyDetails)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.TopologyDetailsOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.TopologyDetails)
+        context.ContextOuterClass.TopologyDetailsOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_TopologyDetails_descriptor;
@@ -14713,8 +14800,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.TopologyIdList)
-    TopologyIdListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface TopologyIdListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.TopologyIdList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.TopologyId topology_ids = 1;
@@ -14745,9 +14832,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.TopologyIdList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.TopologyIdList)
-    // @@protoc_insertion_point(message_implements:context.TopologyIdList)
-    TopologyIdList extends com.google.protobuf.GeneratedMessageV3 implements TopologyIdListOrBuilder {
+    public static final class TopologyIdList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.TopologyIdList)
+    TopologyIdListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -14962,9 +15048,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.TopologyIdList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.TopologyIdList)
-        // @@protoc_insertion_point(builder_implements:context.TopologyIdList)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.TopologyIdListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.TopologyIdList)
+        context.ContextOuterClass.TopologyIdListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_TopologyIdList_descriptor;
@@ -15431,8 +15516,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.TopologyList)
-    TopologyListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface TopologyListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.TopologyList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.Topology topologies = 1;
@@ -15463,9 +15548,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.TopologyList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.TopologyList)
-    // @@protoc_insertion_point(message_implements:context.TopologyList)
-    TopologyList extends com.google.protobuf.GeneratedMessageV3 implements TopologyListOrBuilder {
+    public static final class TopologyList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.TopologyList)
+    TopologyListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -15680,9 +15764,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.TopologyList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.TopologyList)
-        // @@protoc_insertion_point(builder_implements:context.TopologyList)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.TopologyListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.TopologyList)
+        context.ContextOuterClass.TopologyListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_TopologyList_descriptor;
@@ -16149,8 +16232,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.TopologyEvent)
-    TopologyEventOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface TopologyEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.TopologyEvent)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Event event = 1;
@@ -16190,9 +16273,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.TopologyEvent}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.TopologyEvent)
-    // @@protoc_insertion_point(message_implements:context.TopologyEvent)
-    TopologyEvent extends com.google.protobuf.GeneratedMessageV3 implements TopologyEventOrBuilder {
+    public static final class TopologyEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.TopologyEvent)
+    TopologyEventOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -16441,9 +16523,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.TopologyEvent}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.TopologyEvent)
-        // @@protoc_insertion_point(builder_implements:context.TopologyEvent)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.TopologyEventOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.TopologyEvent)
+        context.ContextOuterClass.TopologyEventOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_TopologyEvent_descriptor;
@@ -16889,8 +16970,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.DeviceId)
-    DeviceIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface DeviceIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.DeviceId)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid device_uuid = 1;
@@ -16917,9 +16998,8 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.DeviceId}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.DeviceId)
-    // @@protoc_insertion_point(message_implements:context.DeviceId)
-    DeviceId extends com.google.protobuf.GeneratedMessageV3 implements DeviceIdOrBuilder {
+    public static final class DeviceId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.DeviceId)
+    DeviceIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -17126,9 +17206,8 @@ public final class ContextOuterClass {
          *
          * Protobuf type {@code context.DeviceId}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.DeviceId)
-        // @@protoc_insertion_point(builder_implements:context.DeviceId)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.DeviceIdOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.DeviceId)
+        context.ContextOuterClass.DeviceIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_DeviceId_descriptor;
@@ -17438,8 +17517,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Device)
-    DeviceOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface DeviceOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Device)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.DeviceId device_id = 1;
@@ -17646,9 +17725,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Device}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Device)
-    // @@protoc_insertion_point(message_implements:context.Device)
-    Device extends com.google.protobuf.GeneratedMessageV3 implements DeviceOrBuilder {
+    public static final class Device extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Device)
+    DeviceOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -18312,9 +18390,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Device}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Device)
-        // @@protoc_insertion_point(builder_implements:context.Device)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.DeviceOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Device)
+        context.ContextOuterClass.DeviceOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Device_descriptor;
@@ -20025,8 +20102,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Component)
-    ComponentOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ComponentOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Component)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid component_uuid = 1;
@@ -20142,9 +20219,8 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.Component}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Component)
-    // @@protoc_insertion_point(message_implements:context.Component)
-    Component extends com.google.protobuf.GeneratedMessageV3 implements ComponentOrBuilder {
+    public static final class Component extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Component)
+    ComponentOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -20614,9 +20690,8 @@ public final class ContextOuterClass {
          *
          * Protobuf type {@code context.Component}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Component)
-        // @@protoc_insertion_point(builder_implements:context.Component)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ComponentOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Component)
+        context.ContextOuterClass.ComponentOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Component_descriptor;
@@ -21394,8 +21469,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.DeviceConfig)
-    DeviceConfigOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface DeviceConfigOrBuilder extends // @@protoc_insertion_point(interface_extends:context.DeviceConfig)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.ConfigRule config_rules = 1;
@@ -21426,9 +21501,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.DeviceConfig}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.DeviceConfig)
-    // @@protoc_insertion_point(message_implements:context.DeviceConfig)
-    DeviceConfig extends com.google.protobuf.GeneratedMessageV3 implements DeviceConfigOrBuilder {
+    public static final class DeviceConfig extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.DeviceConfig)
+    DeviceConfigOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -21643,9 +21717,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.DeviceConfig}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.DeviceConfig)
-        // @@protoc_insertion_point(builder_implements:context.DeviceConfig)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.DeviceConfigOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.DeviceConfig)
+        context.ContextOuterClass.DeviceConfigOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_DeviceConfig_descriptor;
@@ -22112,8 +22185,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.DeviceIdList)
-    DeviceIdListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface DeviceIdListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.DeviceIdList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.DeviceId device_ids = 1;
@@ -22144,9 +22217,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.DeviceIdList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.DeviceIdList)
-    // @@protoc_insertion_point(message_implements:context.DeviceIdList)
-    DeviceIdList extends com.google.protobuf.GeneratedMessageV3 implements DeviceIdListOrBuilder {
+    public static final class DeviceIdList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.DeviceIdList)
+    DeviceIdListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -22361,9 +22433,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.DeviceIdList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.DeviceIdList)
-        // @@protoc_insertion_point(builder_implements:context.DeviceIdList)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.DeviceIdListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.DeviceIdList)
+        context.ContextOuterClass.DeviceIdListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_DeviceIdList_descriptor;
@@ -22830,8 +22901,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.DeviceList)
-    DeviceListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface DeviceListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.DeviceList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.Device devices = 1;
@@ -22862,9 +22933,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.DeviceList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.DeviceList)
-    // @@protoc_insertion_point(message_implements:context.DeviceList)
-    DeviceList extends com.google.protobuf.GeneratedMessageV3 implements DeviceListOrBuilder {
+    public static final class DeviceList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.DeviceList)
+    DeviceListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -23079,9 +23149,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.DeviceList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.DeviceList)
-        // @@protoc_insertion_point(builder_implements:context.DeviceList)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.DeviceListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.DeviceList)
+        context.ContextOuterClass.DeviceListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_DeviceList_descriptor;
@@ -23548,8 +23617,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.DeviceFilter)
-    DeviceFilterOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface DeviceFilterOrBuilder extends // @@protoc_insertion_point(interface_extends:context.DeviceFilter)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.DeviceIdList device_ids = 1;
@@ -23590,9 +23659,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.DeviceFilter}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.DeviceFilter)
-    // @@protoc_insertion_point(message_implements:context.DeviceFilter)
-    DeviceFilter extends com.google.protobuf.GeneratedMessageV3 implements DeviceFilterOrBuilder {
+    public static final class DeviceFilter extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.DeviceFilter)
+    DeviceFilterOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -23864,9 +23932,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.DeviceFilter}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.DeviceFilter)
-        // @@protoc_insertion_point(builder_implements:context.DeviceFilter)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.DeviceFilterOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.DeviceFilter)
+        context.ContextOuterClass.DeviceFilterOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_DeviceFilter_descriptor;
@@ -24320,8 +24387,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.DeviceEvent)
-    DeviceEventOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface DeviceEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.DeviceEvent)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Event event = 1;
@@ -24378,9 +24445,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.DeviceEvent}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.DeviceEvent)
-    // @@protoc_insertion_point(message_implements:context.DeviceEvent)
-    DeviceEvent extends com.google.protobuf.GeneratedMessageV3 implements DeviceEventOrBuilder {
+    public static final class DeviceEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.DeviceEvent)
+    DeviceEventOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -24675,9 +24741,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.DeviceEvent}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.DeviceEvent)
-        // @@protoc_insertion_point(builder_implements:context.DeviceEvent)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.DeviceEventOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.DeviceEvent)
+        context.ContextOuterClass.DeviceEventOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_DeviceEvent_descriptor;
@@ -25259,8 +25324,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.LinkId)
-    LinkIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface LinkIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.LinkId)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid link_uuid = 1;
@@ -25287,9 +25352,8 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.LinkId}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.LinkId)
-    // @@protoc_insertion_point(message_implements:context.LinkId)
-    LinkId extends com.google.protobuf.GeneratedMessageV3 implements LinkIdOrBuilder {
+    public static final class LinkId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.LinkId)
+    LinkIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -25496,9 +25560,8 @@ public final class ContextOuterClass {
          *
          * Protobuf type {@code context.LinkId}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.LinkId)
-        // @@protoc_insertion_point(builder_implements:context.LinkId)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.LinkIdOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.LinkId)
+        context.ContextOuterClass.LinkIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_LinkId_descriptor;
@@ -25808,8 +25871,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.LinkAttributes)
-    LinkAttributesOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface LinkAttributesOrBuilder extends // @@protoc_insertion_point(interface_extends:context.LinkAttributes)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * bool is_bidirectional = 1;
@@ -25833,9 +25896,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.LinkAttributes}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.LinkAttributes)
-    // @@protoc_insertion_point(message_implements:context.LinkAttributes)
-    LinkAttributes extends com.google.protobuf.GeneratedMessageV3 implements LinkAttributesOrBuilder {
+    public static final class LinkAttributes extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.LinkAttributes)
+    LinkAttributesOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -26061,9 +26123,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.LinkAttributes}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.LinkAttributes)
-        // @@protoc_insertion_point(builder_implements:context.LinkAttributes)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.LinkAttributesOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.LinkAttributes)
+        context.ContextOuterClass.LinkAttributesOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_LinkAttributes_descriptor;
@@ -26381,8 +26442,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Link)
-    LinkOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface LinkOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Link)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.LinkId link_id = 1;
@@ -26471,9 +26532,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Link}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Link)
-    // @@protoc_insertion_point(message_implements:context.Link)
-    Link extends com.google.protobuf.GeneratedMessageV3 implements LinkOrBuilder {
+    public static final class Link extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Link)
+    LinkOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -26863,9 +26923,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Link}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Link)
-        // @@protoc_insertion_point(builder_implements:context.Link)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.LinkOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Link)
+        context.ContextOuterClass.LinkOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Link_descriptor;
@@ -27768,8 +27827,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.LinkIdList)
-    LinkIdListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface LinkIdListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.LinkIdList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.LinkId link_ids = 1;
@@ -27800,9 +27859,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.LinkIdList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.LinkIdList)
-    // @@protoc_insertion_point(message_implements:context.LinkIdList)
-    LinkIdList extends com.google.protobuf.GeneratedMessageV3 implements LinkIdListOrBuilder {
+    public static final class LinkIdList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.LinkIdList)
+    LinkIdListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -28017,9 +28075,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.LinkIdList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.LinkIdList)
-        // @@protoc_insertion_point(builder_implements:context.LinkIdList)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.LinkIdListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.LinkIdList)
+        context.ContextOuterClass.LinkIdListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_LinkIdList_descriptor;
@@ -28486,8 +28543,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.LinkList)
-    LinkListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface LinkListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.LinkList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.Link links = 1;
@@ -28518,9 +28575,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.LinkList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.LinkList)
-    // @@protoc_insertion_point(message_implements:context.LinkList)
-    LinkList extends com.google.protobuf.GeneratedMessageV3 implements LinkListOrBuilder {
+    public static final class LinkList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.LinkList)
+    LinkListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -28735,9 +28791,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.LinkList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.LinkList)
-        // @@protoc_insertion_point(builder_implements:context.LinkList)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.LinkListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.LinkList)
+        context.ContextOuterClass.LinkListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_LinkList_descriptor;
@@ -29204,8 +29259,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.LinkEvent)
-    LinkEventOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface LinkEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.LinkEvent)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Event event = 1;
@@ -29245,9 +29300,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.LinkEvent}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.LinkEvent)
-    // @@protoc_insertion_point(message_implements:context.LinkEvent)
-    LinkEvent extends com.google.protobuf.GeneratedMessageV3 implements LinkEventOrBuilder {
+    public static final class LinkEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.LinkEvent)
+    LinkEventOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -29496,9 +29550,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.LinkEvent}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.LinkEvent)
-        // @@protoc_insertion_point(builder_implements:context.LinkEvent)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.LinkEventOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.LinkEvent)
+        context.ContextOuterClass.LinkEventOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_LinkEvent_descriptor;
@@ -29944,8 +29997,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ServiceId)
-    ServiceIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ServiceIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ServiceId)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ContextId context_id = 1;
@@ -29989,9 +30042,8 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.ServiceId}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ServiceId)
-    // @@protoc_insertion_point(message_implements:context.ServiceId)
-    ServiceId extends com.google.protobuf.GeneratedMessageV3 implements ServiceIdOrBuilder {
+    public static final class ServiceId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ServiceId)
+    ServiceIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -30244,9 +30296,8 @@ public final class ContextOuterClass {
          *
          * Protobuf type {@code context.ServiceId}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ServiceId)
-        // @@protoc_insertion_point(builder_implements:context.ServiceId)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceIdOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ServiceId)
+        context.ContextOuterClass.ServiceIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ServiceId_descriptor;
@@ -30692,8 +30743,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Service)
-    ServiceOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ServiceOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Service)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ServiceId service_id = 1;
@@ -30841,9 +30892,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Service}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Service)
-    // @@protoc_insertion_point(message_implements:context.Service)
-    Service extends com.google.protobuf.GeneratedMessageV3 implements ServiceOrBuilder {
+    public static final class Service extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Service)
+    ServiceOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -31383,9 +31433,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Service}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Service)
-        // @@protoc_insertion_point(builder_implements:context.Service)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Service)
+        context.ContextOuterClass.ServiceOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Service_descriptor;
@@ -32849,8 +32898,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ServiceStatus)
-    ServiceStatusOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ServiceStatusOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ServiceStatus)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ServiceStatusEnum service_status = 1;
@@ -32868,9 +32917,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ServiceStatus}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ServiceStatus)
-    // @@protoc_insertion_point(message_implements:context.ServiceStatus)
-    ServiceStatus extends com.google.protobuf.GeneratedMessageV3 implements ServiceStatusOrBuilder {
+    public static final class ServiceStatus extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ServiceStatus)
+    ServiceStatusOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -33061,9 +33109,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ServiceStatus}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ServiceStatus)
-        // @@protoc_insertion_point(builder_implements:context.ServiceStatus)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceStatusOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ServiceStatus)
+        context.ContextOuterClass.ServiceStatusOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ServiceStatus_descriptor;
@@ -33310,8 +33357,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ServiceConfig)
-    ServiceConfigOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ServiceConfigOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ServiceConfig)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.ConfigRule config_rules = 1;
@@ -33342,9 +33389,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ServiceConfig}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ServiceConfig)
-    // @@protoc_insertion_point(message_implements:context.ServiceConfig)
-    ServiceConfig extends com.google.protobuf.GeneratedMessageV3 implements ServiceConfigOrBuilder {
+    public static final class ServiceConfig extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ServiceConfig)
+    ServiceConfigOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -33559,9 +33605,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ServiceConfig}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ServiceConfig)
-        // @@protoc_insertion_point(builder_implements:context.ServiceConfig)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceConfigOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ServiceConfig)
+        context.ContextOuterClass.ServiceConfigOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ServiceConfig_descriptor;
@@ -34028,8 +34073,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ServiceIdList)
-    ServiceIdListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ServiceIdListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ServiceIdList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.ServiceId service_ids = 1;
@@ -34060,9 +34105,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ServiceIdList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ServiceIdList)
-    // @@protoc_insertion_point(message_implements:context.ServiceIdList)
-    ServiceIdList extends com.google.protobuf.GeneratedMessageV3 implements ServiceIdListOrBuilder {
+    public static final class ServiceIdList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ServiceIdList)
+    ServiceIdListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -34277,9 +34321,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ServiceIdList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ServiceIdList)
-        // @@protoc_insertion_point(builder_implements:context.ServiceIdList)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceIdListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ServiceIdList)
+        context.ContextOuterClass.ServiceIdListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ServiceIdList_descriptor;
@@ -34746,8 +34789,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ServiceList)
-    ServiceListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ServiceListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ServiceList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.Service services = 1;
@@ -34778,9 +34821,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ServiceList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ServiceList)
-    // @@protoc_insertion_point(message_implements:context.ServiceList)
-    ServiceList extends com.google.protobuf.GeneratedMessageV3 implements ServiceListOrBuilder {
+    public static final class ServiceList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ServiceList)
+    ServiceListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -34995,9 +35037,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ServiceList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ServiceList)
-        // @@protoc_insertion_point(builder_implements:context.ServiceList)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ServiceList)
+        context.ContextOuterClass.ServiceListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ServiceList_descriptor;
@@ -35464,8 +35505,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ServiceFilter)
-    ServiceFilterOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ServiceFilterOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ServiceFilter)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ServiceIdList service_ids = 1;
@@ -35506,9 +35547,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ServiceFilter}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ServiceFilter)
-    // @@protoc_insertion_point(message_implements:context.ServiceFilter)
-    ServiceFilter extends com.google.protobuf.GeneratedMessageV3 implements ServiceFilterOrBuilder {
+    public static final class ServiceFilter extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ServiceFilter)
+    ServiceFilterOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -35780,9 +35820,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ServiceFilter}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ServiceFilter)
-        // @@protoc_insertion_point(builder_implements:context.ServiceFilter)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceFilterOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ServiceFilter)
+        context.ContextOuterClass.ServiceFilterOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ServiceFilter_descriptor;
@@ -36236,8 +36275,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ServiceEvent)
-    ServiceEventOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ServiceEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ServiceEvent)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Event event = 1;
@@ -36277,9 +36316,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ServiceEvent}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ServiceEvent)
-    // @@protoc_insertion_point(message_implements:context.ServiceEvent)
-    ServiceEvent extends com.google.protobuf.GeneratedMessageV3 implements ServiceEventOrBuilder {
+    public static final class ServiceEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ServiceEvent)
+    ServiceEventOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -36528,9 +36566,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ServiceEvent}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ServiceEvent)
-        // @@protoc_insertion_point(builder_implements:context.ServiceEvent)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceEventOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ServiceEvent)
+        context.ContextOuterClass.ServiceEventOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ServiceEvent_descriptor;
@@ -36976,8 +37013,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.SliceId)
-    SliceIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface SliceIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.SliceId)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ContextId context_id = 1;
@@ -37021,9 +37058,8 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.SliceId}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.SliceId)
-    // @@protoc_insertion_point(message_implements:context.SliceId)
-    SliceId extends com.google.protobuf.GeneratedMessageV3 implements SliceIdOrBuilder {
+    public static final class SliceId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.SliceId)
+    SliceIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -37276,9 +37312,8 @@ public final class ContextOuterClass {
          *
          * Protobuf type {@code context.SliceId}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.SliceId)
-        // @@protoc_insertion_point(builder_implements:context.SliceId)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceIdOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.SliceId)
+        context.ContextOuterClass.SliceIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_SliceId_descriptor;
@@ -37724,8 +37759,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Slice)
-    SliceOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface SliceOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Slice)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.SliceId slice_id = 1;
@@ -37928,9 +37963,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Slice}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Slice)
-    // @@protoc_insertion_point(message_implements:context.Slice)
-    Slice extends com.google.protobuf.GeneratedMessageV3 implements SliceOrBuilder {
+    public static final class Slice extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Slice)
+    SliceOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -38598,9 +38632,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Slice}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Slice)
-        // @@protoc_insertion_point(builder_implements:context.Slice)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Slice)
+        context.ContextOuterClass.SliceOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Slice_descriptor;
@@ -40705,8 +40738,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.SliceOwner)
-    SliceOwnerOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface SliceOwnerOrBuilder extends // @@protoc_insertion_point(interface_extends:context.SliceOwner)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid owner_uuid = 1;
@@ -40741,9 +40774,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.SliceOwner}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.SliceOwner)
-    // @@protoc_insertion_point(message_implements:context.SliceOwner)
-    SliceOwner extends com.google.protobuf.GeneratedMessageV3 implements SliceOwnerOrBuilder {
+    public static final class SliceOwner extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.SliceOwner)
+    SliceOwnerOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -40995,9 +41027,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.SliceOwner}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.SliceOwner)
-        // @@protoc_insertion_point(builder_implements:context.SliceOwner)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceOwnerOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.SliceOwner)
+        context.ContextOuterClass.SliceOwnerOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_SliceOwner_descriptor;
@@ -41398,8 +41429,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.SliceStatus)
-    SliceStatusOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface SliceStatusOrBuilder extends // @@protoc_insertion_point(interface_extends:context.SliceStatus)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.SliceStatusEnum slice_status = 1;
@@ -41417,9 +41448,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.SliceStatus}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.SliceStatus)
-    // @@protoc_insertion_point(message_implements:context.SliceStatus)
-    SliceStatus extends com.google.protobuf.GeneratedMessageV3 implements SliceStatusOrBuilder {
+    public static final class SliceStatus extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.SliceStatus)
+    SliceStatusOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -41610,9 +41640,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.SliceStatus}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.SliceStatus)
-        // @@protoc_insertion_point(builder_implements:context.SliceStatus)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceStatusOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.SliceStatus)
+        context.ContextOuterClass.SliceStatusOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_SliceStatus_descriptor;
@@ -41859,8 +41888,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.SliceConfig)
-    SliceConfigOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface SliceConfigOrBuilder extends // @@protoc_insertion_point(interface_extends:context.SliceConfig)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.ConfigRule config_rules = 1;
@@ -41891,9 +41920,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.SliceConfig}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.SliceConfig)
-    // @@protoc_insertion_point(message_implements:context.SliceConfig)
-    SliceConfig extends com.google.protobuf.GeneratedMessageV3 implements SliceConfigOrBuilder {
+    public static final class SliceConfig extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.SliceConfig)
+    SliceConfigOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -42108,9 +42136,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.SliceConfig}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.SliceConfig)
-        // @@protoc_insertion_point(builder_implements:context.SliceConfig)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceConfigOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.SliceConfig)
+        context.ContextOuterClass.SliceConfigOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_SliceConfig_descriptor;
@@ -42577,8 +42604,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.SliceIdList)
-    SliceIdListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface SliceIdListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.SliceIdList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.SliceId slice_ids = 1;
@@ -42609,9 +42636,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.SliceIdList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.SliceIdList)
-    // @@protoc_insertion_point(message_implements:context.SliceIdList)
-    SliceIdList extends com.google.protobuf.GeneratedMessageV3 implements SliceIdListOrBuilder {
+    public static final class SliceIdList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.SliceIdList)
+    SliceIdListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -42826,9 +42852,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.SliceIdList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.SliceIdList)
-        // @@protoc_insertion_point(builder_implements:context.SliceIdList)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceIdListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.SliceIdList)
+        context.ContextOuterClass.SliceIdListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_SliceIdList_descriptor;
@@ -43295,8 +43320,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.SliceList)
-    SliceListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface SliceListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.SliceList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.Slice slices = 1;
@@ -43327,9 +43352,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.SliceList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.SliceList)
-    // @@protoc_insertion_point(message_implements:context.SliceList)
-    SliceList extends com.google.protobuf.GeneratedMessageV3 implements SliceListOrBuilder {
+    public static final class SliceList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.SliceList)
+    SliceListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -43544,9 +43568,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.SliceList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.SliceList)
-        // @@protoc_insertion_point(builder_implements:context.SliceList)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.SliceList)
+        context.ContextOuterClass.SliceListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_SliceList_descriptor;
@@ -44013,8 +44036,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.SliceFilter)
-    SliceFilterOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface SliceFilterOrBuilder extends // @@protoc_insertion_point(interface_extends:context.SliceFilter)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.SliceIdList slice_ids = 1;
@@ -44067,9 +44090,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.SliceFilter}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.SliceFilter)
-    // @@protoc_insertion_point(message_implements:context.SliceFilter)
-    SliceFilter extends com.google.protobuf.GeneratedMessageV3 implements SliceFilterOrBuilder {
+    public static final class SliceFilter extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.SliceFilter)
+    SliceFilterOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -44387,9 +44409,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.SliceFilter}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.SliceFilter)
-        // @@protoc_insertion_point(builder_implements:context.SliceFilter)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceFilterOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.SliceFilter)
+        context.ContextOuterClass.SliceFilterOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_SliceFilter_descriptor;
@@ -44939,8 +44960,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.SliceEvent)
-    SliceEventOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface SliceEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.SliceEvent)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Event event = 1;
@@ -44980,9 +45001,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.SliceEvent}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.SliceEvent)
-    // @@protoc_insertion_point(message_implements:context.SliceEvent)
-    SliceEvent extends com.google.protobuf.GeneratedMessageV3 implements SliceEventOrBuilder {
+    public static final class SliceEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.SliceEvent)
+    SliceEventOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -45231,9 +45251,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.SliceEvent}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.SliceEvent)
-        // @@protoc_insertion_point(builder_implements:context.SliceEvent)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.SliceEventOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.SliceEvent)
+        context.ContextOuterClass.SliceEventOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_SliceEvent_descriptor;
@@ -45679,8 +45698,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ConnectionId)
-    ConnectionIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ConnectionIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionId)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid connection_uuid = 1;
@@ -45707,9 +45726,8 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.ConnectionId}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ConnectionId)
-    // @@protoc_insertion_point(message_implements:context.ConnectionId)
-    ConnectionId extends com.google.protobuf.GeneratedMessageV3 implements ConnectionIdOrBuilder {
+    public static final class ConnectionId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionId)
+    ConnectionIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -45916,9 +45934,8 @@ public final class ContextOuterClass {
          *
          * Protobuf type {@code context.ConnectionId}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionId)
-        // @@protoc_insertion_point(builder_implements:context.ConnectionId)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionIdOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionId)
+        context.ContextOuterClass.ConnectionIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConnectionId_descriptor;
@@ -46228,8 +46245,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L0)
-    ConnectionSettings_L0OrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ConnectionSettings_L0OrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L0)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * string lsp_symbolic_name = 1;
@@ -46247,9 +46264,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConnectionSettings_L0}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L0)
-    // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L0)
-    ConnectionSettings_L0 extends com.google.protobuf.GeneratedMessageV3 implements ConnectionSettings_L0OrBuilder {
+    public static final class ConnectionSettings_L0 extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L0)
+    ConnectionSettings_L0OrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -46455,9 +46471,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConnectionSettings_L0}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L0)
-        // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L0)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionSettings_L0OrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L0)
+        context.ContextOuterClass.ConnectionSettings_L0OrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConnectionSettings_L0_descriptor;
@@ -46722,8 +46737,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L2)
-    ConnectionSettings_L2OrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ConnectionSettings_L2OrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L2)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * string src_mac_address = 1;
@@ -46777,9 +46792,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConnectionSettings_L2}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L2)
-    // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L2)
-    ConnectionSettings_L2 extends com.google.protobuf.GeneratedMessageV3 implements ConnectionSettings_L2OrBuilder {
+    public static final class ConnectionSettings_L2 extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L2)
+    ConnectionSettings_L2OrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -47126,9 +47140,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConnectionSettings_L2}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L2)
-        // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L2)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionSettings_L2OrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L2)
+        context.ContextOuterClass.ConnectionSettings_L2OrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConnectionSettings_L2_descriptor;
@@ -47676,8 +47689,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L3)
-    ConnectionSettings_L3OrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ConnectionSettings_L3OrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L3)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * string src_ip_address = 1;
@@ -47725,9 +47738,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConnectionSettings_L3}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L3)
-    // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L3)
-    ConnectionSettings_L3 extends com.google.protobuf.GeneratedMessageV3 implements ConnectionSettings_L3OrBuilder {
+    public static final class ConnectionSettings_L3 extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L3)
+    ConnectionSettings_L3OrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -48051,9 +48063,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConnectionSettings_L3}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L3)
-        // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L3)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionSettings_L3OrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L3)
+        context.ContextOuterClass.ConnectionSettings_L3OrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConnectionSettings_L3_descriptor;
@@ -48553,8 +48564,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L4)
-    ConnectionSettings_L4OrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ConnectionSettings_L4OrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L4)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * uint32 src_port = 1;
@@ -48584,9 +48595,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConnectionSettings_L4}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L4)
-    // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L4)
-    ConnectionSettings_L4 extends com.google.protobuf.GeneratedMessageV3 implements ConnectionSettings_L4OrBuilder {
+    public static final class ConnectionSettings_L4 extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L4)
+    ConnectionSettings_L4OrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -48835,9 +48845,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConnectionSettings_L4}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L4)
-        // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L4)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionSettings_L4OrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L4)
+        context.ContextOuterClass.ConnectionSettings_L4OrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConnectionSettings_L4_descriptor;
@@ -49203,8 +49212,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ConnectionSettings)
-    ConnectionSettingsOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ConnectionSettingsOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionSettings)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ConnectionSettings_L0 l0 = 1;
@@ -49278,9 +49287,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConnectionSettings}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ConnectionSettings)
-    // @@protoc_insertion_point(message_implements:context.ConnectionSettings)
-    ConnectionSettings extends com.google.protobuf.GeneratedMessageV3 implements ConnectionSettingsOrBuilder {
+    public static final class ConnectionSettings extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionSettings)
+    ConnectionSettingsOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -49621,9 +49629,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConnectionSettings}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionSettings)
-        // @@protoc_insertion_point(builder_implements:context.ConnectionSettings)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionSettingsOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionSettings)
+        context.ContextOuterClass.ConnectionSettingsOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConnectionSettings_descriptor;
@@ -50341,8 +50348,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Connection)
-    ConnectionOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ConnectionOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Connection)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ConnectionId connection_id = 1;
@@ -50449,9 +50456,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Connection}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Connection)
-    // @@protoc_insertion_point(message_implements:context.Connection)
-    Connection extends com.google.protobuf.GeneratedMessageV3 implements ConnectionOrBuilder {
+    public static final class Connection extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Connection)
+    ConnectionOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -50862,9 +50868,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Connection}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Connection)
-        // @@protoc_insertion_point(builder_implements:context.Connection)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Connection)
+        context.ContextOuterClass.ConnectionOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Connection_descriptor;
@@ -52028,8 +52033,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ConnectionIdList)
-    ConnectionIdListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ConnectionIdListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionIdList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.ConnectionId connection_ids = 1;
@@ -52060,9 +52065,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConnectionIdList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ConnectionIdList)
-    // @@protoc_insertion_point(message_implements:context.ConnectionIdList)
-    ConnectionIdList extends com.google.protobuf.GeneratedMessageV3 implements ConnectionIdListOrBuilder {
+    public static final class ConnectionIdList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionIdList)
+    ConnectionIdListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -52277,9 +52281,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConnectionIdList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionIdList)
-        // @@protoc_insertion_point(builder_implements:context.ConnectionIdList)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionIdListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionIdList)
+        context.ContextOuterClass.ConnectionIdListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConnectionIdList_descriptor;
@@ -52746,8 +52749,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ConnectionList)
-    ConnectionListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ConnectionListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.Connection connections = 1;
@@ -52778,9 +52781,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConnectionList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ConnectionList)
-    // @@protoc_insertion_point(message_implements:context.ConnectionList)
-    ConnectionList extends com.google.protobuf.GeneratedMessageV3 implements ConnectionListOrBuilder {
+    public static final class ConnectionList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionList)
+    ConnectionListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -52995,9 +52997,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConnectionList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionList)
-        // @@protoc_insertion_point(builder_implements:context.ConnectionList)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionList)
+        context.ContextOuterClass.ConnectionListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConnectionList_descriptor;
@@ -53464,8 +53465,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ConnectionEvent)
-    ConnectionEventOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ConnectionEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConnectionEvent)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Event event = 1;
@@ -53505,9 +53506,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConnectionEvent}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ConnectionEvent)
-    // @@protoc_insertion_point(message_implements:context.ConnectionEvent)
-    ConnectionEvent extends com.google.protobuf.GeneratedMessageV3 implements ConnectionEventOrBuilder {
+    public static final class ConnectionEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConnectionEvent)
+    ConnectionEventOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -53756,9 +53756,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConnectionEvent}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ConnectionEvent)
-        // @@protoc_insertion_point(builder_implements:context.ConnectionEvent)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConnectionEventOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConnectionEvent)
+        context.ContextOuterClass.ConnectionEventOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConnectionEvent_descriptor;
@@ -54204,8 +54203,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.EndPointId)
-    EndPointIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface EndPointIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.EndPointId)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.TopologyId topology_id = 1;
@@ -54266,9 +54265,8 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.EndPointId}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.EndPointId)
-    // @@protoc_insertion_point(message_implements:context.EndPointId)
-    EndPointId extends com.google.protobuf.GeneratedMessageV3 implements EndPointIdOrBuilder {
+    public static final class EndPointId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.EndPointId)
+    EndPointIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -54567,9 +54565,8 @@ public final class ContextOuterClass {
          *
          * Protobuf type {@code context.EndPointId}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.EndPointId)
-        // @@protoc_insertion_point(builder_implements:context.EndPointId)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.EndPointIdOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.EndPointId)
+        context.ContextOuterClass.EndPointIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_EndPointId_descriptor;
@@ -55151,8 +55148,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.EndPoint)
-    EndPointOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface EndPointOrBuilder extends // @@protoc_insertion_point(interface_extends:context.EndPoint)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.EndPointId endpoint_id = 1;
@@ -55281,9 +55278,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.EndPoint}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.EndPoint)
-    // @@protoc_insertion_point(message_implements:context.EndPoint)
-    EndPoint extends com.google.protobuf.GeneratedMessageV3 implements EndPointOrBuilder {
+    public static final class EndPoint extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.EndPoint)
+    EndPointOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -55819,9 +55815,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.EndPoint}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.EndPoint)
-        // @@protoc_insertion_point(builder_implements:context.EndPoint)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.EndPointOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.EndPoint)
+        context.ContextOuterClass.EndPointOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_EndPoint_descriptor;
@@ -56804,8 +56799,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.EndPointName)
-    EndPointNameOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface EndPointNameOrBuilder extends // @@protoc_insertion_point(interface_extends:context.EndPointName)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.EndPointId endpoint_id = 1;
@@ -56864,9 +56859,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.EndPointName}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.EndPointName)
-    // @@protoc_insertion_point(message_implements:context.EndPointName)
-    EndPointName extends com.google.protobuf.GeneratedMessageV3 implements EndPointNameOrBuilder {
+    public static final class EndPointName extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.EndPointName)
+    EndPointNameOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -57216,9 +57210,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.EndPointName}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.EndPointName)
-        // @@protoc_insertion_point(builder_implements:context.EndPointName)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.EndPointNameOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.EndPointName)
+        context.ContextOuterClass.EndPointNameOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_EndPointName_descriptor;
@@ -57801,8 +57794,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.EndPointIdList)
-    EndPointIdListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface EndPointIdListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.EndPointIdList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.EndPointId endpoint_ids = 1;
@@ -57833,9 +57826,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.EndPointIdList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.EndPointIdList)
-    // @@protoc_insertion_point(message_implements:context.EndPointIdList)
-    EndPointIdList extends com.google.protobuf.GeneratedMessageV3 implements EndPointIdListOrBuilder {
+    public static final class EndPointIdList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.EndPointIdList)
+    EndPointIdListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -58050,9 +58042,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.EndPointIdList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.EndPointIdList)
-        // @@protoc_insertion_point(builder_implements:context.EndPointIdList)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.EndPointIdListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.EndPointIdList)
+        context.ContextOuterClass.EndPointIdListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_EndPointIdList_descriptor;
@@ -58519,8 +58510,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.EndPointNameList)
-    EndPointNameListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface EndPointNameListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.EndPointNameList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.EndPointName endpoint_names = 1;
@@ -58551,9 +58542,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.EndPointNameList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.EndPointNameList)
-    // @@protoc_insertion_point(message_implements:context.EndPointNameList)
-    EndPointNameList extends com.google.protobuf.GeneratedMessageV3 implements EndPointNameListOrBuilder {
+    public static final class EndPointNameList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.EndPointNameList)
+    EndPointNameListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -58768,9 +58758,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.EndPointNameList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.EndPointNameList)
-        // @@protoc_insertion_point(builder_implements:context.EndPointNameList)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.EndPointNameListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.EndPointNameList)
+        context.ContextOuterClass.EndPointNameListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_EndPointNameList_descriptor;
@@ -59237,8 +59226,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ConfigRule_Custom)
-    ConfigRule_CustomOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ConfigRule_CustomOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConfigRule_Custom)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * string resource_key = 1;
@@ -59268,9 +59257,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConfigRule_Custom}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ConfigRule_Custom)
-    // @@protoc_insertion_point(message_implements:context.ConfigRule_Custom)
-    ConfigRule_Custom extends com.google.protobuf.GeneratedMessageV3 implements ConfigRule_CustomOrBuilder {
+    public static final class ConfigRule_Custom extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConfigRule_Custom)
+    ConfigRule_CustomOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -59525,9 +59513,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConfigRule_Custom}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ConfigRule_Custom)
-        // @@protoc_insertion_point(builder_implements:context.ConfigRule_Custom)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConfigRule_CustomOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConfigRule_Custom)
+        context.ContextOuterClass.ConfigRule_CustomOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConfigRule_Custom_descriptor;
@@ -59883,8 +59870,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ConfigRule_ACL)
-    ConfigRule_ACLOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ConfigRule_ACLOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConfigRule_ACL)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.EndPointId endpoint_id = 1;
@@ -59904,19 +59891,31 @@ public final class ContextOuterClass {
         context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder();
 
         /**
-         * .acl.AclRuleSet rule_set = 2;
+         * .context.AclDirectionEnum direction = 2;
+         * @return The enum numeric value on the wire for direction.
+         */
+        int getDirectionValue();
+
+        /**
+         * .context.AclDirectionEnum direction = 2;
+         * @return The direction.
+         */
+        context.ContextOuterClass.AclDirectionEnum getDirection();
+
+        /**
+         * .acl.AclRuleSet rule_set = 3;
          * @return Whether the ruleSet field is set.
          */
         boolean hasRuleSet();
 
         /**
-         * .acl.AclRuleSet rule_set = 2;
+         * .acl.AclRuleSet rule_set = 3;
          * @return The ruleSet.
          */
         acl.Acl.AclRuleSet getRuleSet();
 
         /**
-         * .acl.AclRuleSet rule_set = 2;
+         * .acl.AclRuleSet rule_set = 3;
          */
         acl.Acl.AclRuleSetOrBuilder getRuleSetOrBuilder();
     }
@@ -59924,9 +59923,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConfigRule_ACL}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ConfigRule_ACL)
-    // @@protoc_insertion_point(message_implements:context.ConfigRule_ACL)
-    ConfigRule_ACL extends com.google.protobuf.GeneratedMessageV3 implements ConfigRule_ACLOrBuilder {
+    public static final class ConfigRule_ACL extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConfigRule_ACL)
+    ConfigRule_ACLOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -59936,6 +59934,7 @@ public final class ContextOuterClass {
         }
 
         private ConfigRule_ACL() {
+            direction_ = 0;
         }
 
         @java.lang.Override
@@ -59983,12 +59982,35 @@ public final class ContextOuterClass {
             return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
         }
 
-        public static final int RULE_SET_FIELD_NUMBER = 2;
+        public static final int DIRECTION_FIELD_NUMBER = 2;
+
+        private int direction_ = 0;
+
+        /**
+         * .context.AclDirectionEnum direction = 2;
+         * @return The enum numeric value on the wire for direction.
+         */
+        @java.lang.Override
+        public int getDirectionValue() {
+            return direction_;
+        }
+
+        /**
+         * .context.AclDirectionEnum direction = 2;
+         * @return The direction.
+         */
+        @java.lang.Override
+        public context.ContextOuterClass.AclDirectionEnum getDirection() {
+            context.ContextOuterClass.AclDirectionEnum result = context.ContextOuterClass.AclDirectionEnum.forNumber(direction_);
+            return result == null ? context.ContextOuterClass.AclDirectionEnum.UNRECOGNIZED : result;
+        }
+
+        public static final int RULE_SET_FIELD_NUMBER = 3;
 
         private acl.Acl.AclRuleSet ruleSet_;
 
         /**
-         * .acl.AclRuleSet rule_set = 2;
+         * .acl.AclRuleSet rule_set = 3;
          * @return Whether the ruleSet field is set.
          */
         @java.lang.Override
@@ -59997,7 +60019,7 @@ public final class ContextOuterClass {
         }
 
         /**
-         * .acl.AclRuleSet rule_set = 2;
+         * .acl.AclRuleSet rule_set = 3;
          * @return The ruleSet.
          */
         @java.lang.Override
@@ -60006,7 +60028,7 @@ public final class ContextOuterClass {
         }
 
         /**
-         * .acl.AclRuleSet rule_set = 2;
+         * .acl.AclRuleSet rule_set = 3;
          */
         @java.lang.Override
         public acl.Acl.AclRuleSetOrBuilder getRuleSetOrBuilder() {
@@ -60031,8 +60053,11 @@ public final class ContextOuterClass {
             if (endpointId_ != null) {
                 output.writeMessage(1, getEndpointId());
             }
+            if (direction_ != context.ContextOuterClass.AclDirectionEnum.ACLDIRECTION_BOTH.getNumber()) {
+                output.writeEnum(2, direction_);
+            }
             if (ruleSet_ != null) {
-                output.writeMessage(2, getRuleSet());
+                output.writeMessage(3, getRuleSet());
             }
             getUnknownFields().writeTo(output);
         }
@@ -60046,8 +60071,11 @@ public final class ContextOuterClass {
             if (endpointId_ != null) {
                 size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getEndpointId());
             }
+            if (direction_ != context.ContextOuterClass.AclDirectionEnum.ACLDIRECTION_BOTH.getNumber()) {
+                size += com.google.protobuf.CodedOutputStream.computeEnumSize(2, direction_);
+            }
             if (ruleSet_ != null) {
-                size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getRuleSet());
+                size += com.google.protobuf.CodedOutputStream.computeMessageSize(3, getRuleSet());
             }
             size += getUnknownFields().getSerializedSize();
             memoizedSize = size;
@@ -60069,6 +60097,8 @@ public final class ContextOuterClass {
                 if (!getEndpointId().equals(other.getEndpointId()))
                     return false;
             }
+            if (direction_ != other.direction_)
+                return false;
             if (hasRuleSet() != other.hasRuleSet())
                 return false;
             if (hasRuleSet()) {
@@ -60091,6 +60121,8 @@ public final class ContextOuterClass {
                 hash = (37 * hash) + ENDPOINT_ID_FIELD_NUMBER;
                 hash = (53 * hash) + getEndpointId().hashCode();
             }
+            hash = (37 * hash) + DIRECTION_FIELD_NUMBER;
+            hash = (53 * hash) + direction_;
             if (hasRuleSet()) {
                 hash = (37 * hash) + RULE_SET_FIELD_NUMBER;
                 hash = (53 * hash) + getRuleSet().hashCode();
@@ -60175,9 +60207,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConfigRule_ACL}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ConfigRule_ACL)
-        // @@protoc_insertion_point(builder_implements:context.ConfigRule_ACL)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConfigRule_ACLOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConfigRule_ACL)
+        context.ContextOuterClass.ConfigRule_ACLOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConfigRule_ACL_descriptor;
@@ -60205,6 +60236,7 @@ public final class ContextOuterClass {
                     endpointIdBuilder_.dispose();
                     endpointIdBuilder_ = null;
                 }
+                direction_ = 0;
                 ruleSet_ = null;
                 if (ruleSetBuilder_ != null) {
                     ruleSetBuilder_.dispose();
@@ -60248,6 +60280,9 @@ public final class ContextOuterClass {
                     result.endpointId_ = endpointIdBuilder_ == null ? endpointId_ : endpointIdBuilder_.build();
                 }
                 if (((from_bitField0_ & 0x00000002) != 0)) {
+                    result.direction_ = direction_;
+                }
+                if (((from_bitField0_ & 0x00000004) != 0)) {
                     result.ruleSet_ = ruleSetBuilder_ == null ? ruleSet_ : ruleSetBuilder_.build();
                 }
             }
@@ -60268,6 +60303,9 @@ public final class ContextOuterClass {
                 if (other.hasEndpointId()) {
                     mergeEndpointId(other.getEndpointId());
                 }
+                if (other.direction_ != 0) {
+                    setDirectionValue(other.getDirectionValue());
+                }
                 if (other.hasRuleSet()) {
                     mergeRuleSet(other.getRuleSet());
                 }
@@ -60301,13 +60339,20 @@ public final class ContextOuterClass {
                                     break;
                                 }
                             // case 10
-                            case 18:
+                            case 16:
                                 {
-                                    input.readMessage(getRuleSetFieldBuilder().getBuilder(), extensionRegistry);
+                                    direction_ = input.readEnum();
                                     bitField0_ |= 0x00000002;
                                     break;
                                 }
-                            // case 18
+                            // case 16
+                            case 26:
+                                {
+                                    input.readMessage(getRuleSetFieldBuilder().getBuilder(), extensionRegistry);
+                                    bitField0_ |= 0x00000004;
+                                    break;
+                                }
+                            // case 26
                             default:
                                 {
                                     if (!super.parseUnknownField(input, extensionRegistry, tag)) {
@@ -60449,20 +60494,79 @@ public final class ContextOuterClass {
                 return endpointIdBuilder_;
             }
 
+            private int direction_ = 0;
+
+            /**
+             * .context.AclDirectionEnum direction = 2;
+             * @return The enum numeric value on the wire for direction.
+             */
+            @java.lang.Override
+            public int getDirectionValue() {
+                return direction_;
+            }
+
+            /**
+             * .context.AclDirectionEnum direction = 2;
+             * @param value The enum numeric value on the wire for direction to set.
+             * @return This builder for chaining.
+             */
+            public Builder setDirectionValue(int value) {
+                direction_ = value;
+                bitField0_ |= 0x00000002;
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .context.AclDirectionEnum direction = 2;
+             * @return The direction.
+             */
+            @java.lang.Override
+            public context.ContextOuterClass.AclDirectionEnum getDirection() {
+                context.ContextOuterClass.AclDirectionEnum result = context.ContextOuterClass.AclDirectionEnum.forNumber(direction_);
+                return result == null ? context.ContextOuterClass.AclDirectionEnum.UNRECOGNIZED : result;
+            }
+
+            /**
+             * .context.AclDirectionEnum direction = 2;
+             * @param value The direction to set.
+             * @return This builder for chaining.
+             */
+            public Builder setDirection(context.ContextOuterClass.AclDirectionEnum value) {
+                if (value == null) {
+                    throw new NullPointerException();
+                }
+                bitField0_ |= 0x00000002;
+                direction_ = value.getNumber();
+                onChanged();
+                return this;
+            }
+
+            /**
+             * .context.AclDirectionEnum direction = 2;
+             * @return This builder for chaining.
+             */
+            public Builder clearDirection() {
+                bitField0_ = (bitField0_ & ~0x00000002);
+                direction_ = 0;
+                onChanged();
+                return this;
+            }
+
             private acl.Acl.AclRuleSet ruleSet_;
 
             private com.google.protobuf.SingleFieldBuilderV3 ruleSetBuilder_;
 
             /**
-             * .acl.AclRuleSet rule_set = 2;
+             * .acl.AclRuleSet rule_set = 3;
              * @return Whether the ruleSet field is set.
              */
             public boolean hasRuleSet() {
-                return ((bitField0_ & 0x00000002) != 0);
+                return ((bitField0_ & 0x00000004) != 0);
             }
 
             /**
-             * .acl.AclRuleSet rule_set = 2;
+             * .acl.AclRuleSet rule_set = 3;
              * @return The ruleSet.
              */
             public acl.Acl.AclRuleSet getRuleSet() {
@@ -60474,7 +60578,7 @@ public final class ContextOuterClass {
             }
 
             /**
-             * .acl.AclRuleSet rule_set = 2;
+             * .acl.AclRuleSet rule_set = 3;
              */
             public Builder setRuleSet(acl.Acl.AclRuleSet value) {
                 if (ruleSetBuilder_ == null) {
@@ -60485,13 +60589,13 @@ public final class ContextOuterClass {
                 } else {
                     ruleSetBuilder_.setMessage(value);
                 }
-                bitField0_ |= 0x00000002;
+                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
 
             /**
-             * .acl.AclRuleSet rule_set = 2;
+             * .acl.AclRuleSet rule_set = 3;
              */
             public Builder setRuleSet(acl.Acl.AclRuleSet.Builder builderForValue) {
                 if (ruleSetBuilder_ == null) {
@@ -60499,17 +60603,17 @@ public final class ContextOuterClass {
                 } else {
                     ruleSetBuilder_.setMessage(builderForValue.build());
                 }
-                bitField0_ |= 0x00000002;
+                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
 
             /**
-             * .acl.AclRuleSet rule_set = 2;
+             * .acl.AclRuleSet rule_set = 3;
              */
             public Builder mergeRuleSet(acl.Acl.AclRuleSet value) {
                 if (ruleSetBuilder_ == null) {
-                    if (((bitField0_ & 0x00000002) != 0) && ruleSet_ != null && ruleSet_ != acl.Acl.AclRuleSet.getDefaultInstance()) {
+                    if (((bitField0_ & 0x00000004) != 0) && ruleSet_ != null && ruleSet_ != acl.Acl.AclRuleSet.getDefaultInstance()) {
                         getRuleSetBuilder().mergeFrom(value);
                     } else {
                         ruleSet_ = value;
@@ -60517,16 +60621,16 @@ public final class ContextOuterClass {
                 } else {
                     ruleSetBuilder_.mergeFrom(value);
                 }
-                bitField0_ |= 0x00000002;
+                bitField0_ |= 0x00000004;
                 onChanged();
                 return this;
             }
 
             /**
-             * .acl.AclRuleSet rule_set = 2;
+             * .acl.AclRuleSet rule_set = 3;
              */
             public Builder clearRuleSet() {
-                bitField0_ = (bitField0_ & ~0x00000002);
+                bitField0_ = (bitField0_ & ~0x00000004);
                 ruleSet_ = null;
                 if (ruleSetBuilder_ != null) {
                     ruleSetBuilder_.dispose();
@@ -60537,16 +60641,16 @@ public final class ContextOuterClass {
             }
 
             /**
-             * .acl.AclRuleSet rule_set = 2;
+             * .acl.AclRuleSet rule_set = 3;
              */
             public acl.Acl.AclRuleSet.Builder getRuleSetBuilder() {
-                bitField0_ |= 0x00000002;
+                bitField0_ |= 0x00000004;
                 onChanged();
                 return getRuleSetFieldBuilder().getBuilder();
             }
 
             /**
-             * .acl.AclRuleSet rule_set = 2;
+             * .acl.AclRuleSet rule_set = 3;
              */
             public acl.Acl.AclRuleSetOrBuilder getRuleSetOrBuilder() {
                 if (ruleSetBuilder_ != null) {
@@ -60557,7 +60661,7 @@ public final class ContextOuterClass {
             }
 
             /**
-             * .acl.AclRuleSet rule_set = 2;
+             * .acl.AclRuleSet rule_set = 3;
              */
             private com.google.protobuf.SingleFieldBuilderV3 getRuleSetFieldBuilder() {
                 if (ruleSetBuilder_ == null) {
@@ -62317,9 +62421,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConfigRule_IP_LINK}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ConfigRule_IP_LINK)
-    // @@protoc_insertion_point(message_implements:context.ConfigRule_IP_LINK)
-    ConfigRule_IP_LINK extends com.google.protobuf.GeneratedMessageV3 implements ConfigRule_IP_LINKOrBuilder {
+    public static final class ConfigRule_IP_LINK extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConfigRule_IP_LINK)
+    ConfigRule_IP_LINKOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -62568,9 +62671,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConfigRule_IP_LINK}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ConfigRule_IP_LINK)
-        // @@protoc_insertion_point(builder_implements:context.ConfigRule_IP_LINK)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConfigRule_IP_LINKOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConfigRule_IP_LINK)
+        context.ContextOuterClass.ConfigRule_IP_LINKOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConfigRule_IP_LINK_descriptor;
@@ -63016,8 +63118,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ConfigRule)
-    ConfigRuleOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ConfigRuleOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ConfigRule)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ConfigActionEnum action = 1;
@@ -63122,9 +63224,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ConfigRule}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ConfigRule)
-    // @@protoc_insertion_point(message_implements:context.ConfigRule)
-    ConfigRule extends com.google.protobuf.GeneratedMessageV3 implements ConfigRuleOrBuilder {
+    public static final class ConfigRule extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ConfigRule)
+    ConfigRuleOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -63623,9 +63724,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ConfigRule}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ConfigRule)
-        // @@protoc_insertion_point(builder_implements:context.ConfigRule)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConfigRuleOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ConfigRule)
+        context.ContextOuterClass.ConfigRuleOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ConfigRule_descriptor;
@@ -64696,8 +64796,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Constraint_Custom)
-    Constraint_CustomOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface Constraint_CustomOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_Custom)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * string constraint_type = 1;
@@ -64727,9 +64827,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Constraint_Custom}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Constraint_Custom)
-    // @@protoc_insertion_point(message_implements:context.Constraint_Custom)
-    Constraint_Custom extends com.google.protobuf.GeneratedMessageV3 implements Constraint_CustomOrBuilder {
+    public static final class Constraint_Custom extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_Custom)
+    Constraint_CustomOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -64984,9 +65083,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Constraint_Custom}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_Custom)
-        // @@protoc_insertion_point(builder_implements:context.Constraint_Custom)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_CustomOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_Custom)
+        context.ContextOuterClass.Constraint_CustomOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Constraint_Custom_descriptor;
@@ -65342,8 +65440,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Constraint_Schedule)
-    Constraint_ScheduleOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface Constraint_ScheduleOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_Schedule)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * double start_timestamp = 1;
@@ -65361,9 +65459,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Constraint_Schedule}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Constraint_Schedule)
-    // @@protoc_insertion_point(message_implements:context.Constraint_Schedule)
-    Constraint_Schedule extends com.google.protobuf.GeneratedMessageV3 implements Constraint_ScheduleOrBuilder {
+    public static final class Constraint_Schedule extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_Schedule)
+    Constraint_ScheduleOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -65566,9 +65663,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Constraint_Schedule}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_Schedule)
-        // @@protoc_insertion_point(builder_implements:context.Constraint_Schedule)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_ScheduleOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_Schedule)
+        context.ContextOuterClass.Constraint_ScheduleOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Constraint_Schedule_descriptor;
@@ -65838,8 +65934,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.GPS_Position)
-    GPS_PositionOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface GPS_PositionOrBuilder extends // @@protoc_insertion_point(interface_extends:context.GPS_Position)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * float latitude = 1;
@@ -65857,9 +65953,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.GPS_Position}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.GPS_Position)
-    // @@protoc_insertion_point(message_implements:context.GPS_Position)
-    GPS_Position extends com.google.protobuf.GeneratedMessageV3 implements GPS_PositionOrBuilder {
+    public static final class GPS_Position extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.GPS_Position)
+    GPS_PositionOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -66062,9 +66157,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.GPS_Position}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.GPS_Position)
-        // @@protoc_insertion_point(builder_implements:context.GPS_Position)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.GPS_PositionOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.GPS_Position)
+        context.ContextOuterClass.GPS_PositionOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_GPS_Position_descriptor;
@@ -66334,8 +66428,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Location)
-    LocationOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface LocationOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Location)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * string region = 1;
@@ -66414,9 +66508,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Location}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Location)
-    // @@protoc_insertion_point(message_implements:context.Location)
-    Location extends com.google.protobuf.GeneratedMessageV3 implements LocationOrBuilder {
+    public static final class Location extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Location)
+    LocationOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -66877,9 +66970,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Location}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Location)
-        // @@protoc_insertion_point(builder_implements:context.Location)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.LocationOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Location)
+        context.ContextOuterClass.LocationOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Location_descriptor;
@@ -67574,8 +67666,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Constraint_EndPointLocation)
-    Constraint_EndPointLocationOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface Constraint_EndPointLocationOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_EndPointLocation)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.EndPointId endpoint_id = 1;
@@ -67615,9 +67707,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Constraint_EndPointLocation}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Constraint_EndPointLocation)
-    // @@protoc_insertion_point(message_implements:context.Constraint_EndPointLocation)
-    Constraint_EndPointLocation extends com.google.protobuf.GeneratedMessageV3 implements Constraint_EndPointLocationOrBuilder {
+    public static final class Constraint_EndPointLocation extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_EndPointLocation)
+    Constraint_EndPointLocationOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -67866,9 +67957,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Constraint_EndPointLocation}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_EndPointLocation)
-        // @@protoc_insertion_point(builder_implements:context.Constraint_EndPointLocation)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_EndPointLocationOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_EndPointLocation)
+        context.ContextOuterClass.Constraint_EndPointLocationOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Constraint_EndPointLocation_descriptor;
@@ -68314,8 +68404,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Constraint_EndPointPriority)
-    Constraint_EndPointPriorityOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface Constraint_EndPointPriorityOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_EndPointPriority)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.EndPointId endpoint_id = 1;
@@ -68344,9 +68434,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Constraint_EndPointPriority}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Constraint_EndPointPriority)
-    // @@protoc_insertion_point(message_implements:context.Constraint_EndPointPriority)
-    Constraint_EndPointPriority extends com.google.protobuf.GeneratedMessageV3 implements Constraint_EndPointPriorityOrBuilder {
+    public static final class Constraint_EndPointPriority extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_EndPointPriority)
+    Constraint_EndPointPriorityOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -68572,9 +68661,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Constraint_EndPointPriority}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_EndPointPriority)
-        // @@protoc_insertion_point(builder_implements:context.Constraint_EndPointPriority)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_EndPointPriorityOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_EndPointPriority)
+        context.ContextOuterClass.Constraint_EndPointPriorityOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Constraint_EndPointPriority_descriptor;
@@ -68932,8 +69020,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Latency)
-    Constraint_SLA_LatencyOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface Constraint_SLA_LatencyOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Latency)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * float e2e_latency_ms = 1;
@@ -68945,9 +69033,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Constraint_SLA_Latency}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Latency)
-    // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Latency)
-    Constraint_SLA_Latency extends com.google.protobuf.GeneratedMessageV3 implements Constraint_SLA_LatencyOrBuilder {
+    public static final class Constraint_SLA_Latency extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Latency)
+    Constraint_SLA_LatencyOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -69127,9 +69214,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Constraint_SLA_Latency}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Latency)
-        // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Latency)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_SLA_LatencyOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Latency)
+        context.ContextOuterClass.Constraint_SLA_LatencyOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Constraint_SLA_Latency_descriptor;
@@ -69351,8 +69437,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Capacity)
-    Constraint_SLA_CapacityOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface Constraint_SLA_CapacityOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Capacity)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * float capacity_gbps = 1;
@@ -69364,9 +69450,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Constraint_SLA_Capacity}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Capacity)
-    // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Capacity)
-    Constraint_SLA_Capacity extends com.google.protobuf.GeneratedMessageV3 implements Constraint_SLA_CapacityOrBuilder {
+    public static final class Constraint_SLA_Capacity extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Capacity)
+    Constraint_SLA_CapacityOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -69546,9 +69631,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Constraint_SLA_Capacity}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Capacity)
-        // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Capacity)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_SLA_CapacityOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Capacity)
+        context.ContextOuterClass.Constraint_SLA_CapacityOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Constraint_SLA_Capacity_descriptor;
@@ -69770,8 +69854,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Availability)
-    Constraint_SLA_AvailabilityOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface Constraint_SLA_AvailabilityOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Availability)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * uint32 num_disjoint_paths = 1;
@@ -69799,9 +69883,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Constraint_SLA_Availability}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Availability)
-    // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Availability)
-    Constraint_SLA_Availability extends com.google.protobuf.GeneratedMessageV3 implements Constraint_SLA_AvailabilityOrBuilder {
+    public static final class Constraint_SLA_Availability extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Availability)
+    Constraint_SLA_AvailabilityOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -70031,9 +70114,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Constraint_SLA_Availability}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Availability)
-        // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Availability)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_SLA_AvailabilityOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Availability)
+        context.ContextOuterClass.Constraint_SLA_AvailabilityOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Constraint_SLA_Availability_descriptor;
@@ -70363,8 +70445,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Isolation_level)
-    Constraint_SLA_Isolation_levelOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface Constraint_SLA_Isolation_levelOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Isolation_level)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.IsolationLevelEnum isolation_level = 1;
@@ -70402,9 +70484,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Constraint_SLA_Isolation_level}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Isolation_level)
-    // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Isolation_level)
-    Constraint_SLA_Isolation_level extends com.google.protobuf.GeneratedMessageV3 implements Constraint_SLA_Isolation_levelOrBuilder {
+    public static final class Constraint_SLA_Isolation_level extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Isolation_level)
+    Constraint_SLA_Isolation_levelOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -70650,9 +70731,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Constraint_SLA_Isolation_level}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Isolation_level)
-        // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Isolation_level)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_SLA_Isolation_levelOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Isolation_level)
+        context.ContextOuterClass.Constraint_SLA_Isolation_levelOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Constraint_SLA_Isolation_level_descriptor;
@@ -71014,8 +71094,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Constraint_Exclusions)
-    Constraint_ExclusionsOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface Constraint_ExclusionsOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_Exclusions)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * bool is_permanent = 1;
@@ -71102,9 +71182,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Constraint_Exclusions}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Constraint_Exclusions)
-    // @@protoc_insertion_point(message_implements:context.Constraint_Exclusions)
-    Constraint_Exclusions extends com.google.protobuf.GeneratedMessageV3 implements Constraint_ExclusionsOrBuilder {
+    public static final class Constraint_Exclusions extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_Exclusions)
+    Constraint_ExclusionsOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -71458,9 +71537,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Constraint_Exclusions}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_Exclusions)
-        // @@protoc_insertion_point(builder_implements:context.Constraint_Exclusions)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_ExclusionsOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_Exclusions)
+        context.ContextOuterClass.Constraint_ExclusionsOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Constraint_Exclusions_descriptor;
@@ -72553,8 +72631,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.QoSProfileId)
-    QoSProfileIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface QoSProfileIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.QoSProfileId)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid qos_profile_id = 1;
@@ -72577,9 +72655,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.QoSProfileId}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.QoSProfileId)
-    // @@protoc_insertion_point(message_implements:context.QoSProfileId)
-    QoSProfileId extends com.google.protobuf.GeneratedMessageV3 implements QoSProfileIdOrBuilder {
+    public static final class QoSProfileId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.QoSProfileId)
+    QoSProfileIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -72782,9 +72859,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.QoSProfileId}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.QoSProfileId)
-        // @@protoc_insertion_point(builder_implements:context.QoSProfileId)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.QoSProfileIdOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.QoSProfileId)
+        context.ContextOuterClass.QoSProfileIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_QoSProfileId_descriptor;
@@ -73094,8 +73170,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Constraint_QoSProfile)
-    Constraint_QoSProfileOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface Constraint_QoSProfileOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint_QoSProfile)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.QoSProfileId qos_profile_id = 1;
@@ -73130,9 +73206,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Constraint_QoSProfile}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Constraint_QoSProfile)
-    // @@protoc_insertion_point(message_implements:context.Constraint_QoSProfile)
-    Constraint_QoSProfile extends com.google.protobuf.GeneratedMessageV3 implements Constraint_QoSProfileOrBuilder {
+    public static final class Constraint_QoSProfile extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint_QoSProfile)
+    Constraint_QoSProfileOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -73384,9 +73459,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Constraint_QoSProfile}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Constraint_QoSProfile)
-        // @@protoc_insertion_point(builder_implements:context.Constraint_QoSProfile)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.Constraint_QoSProfileOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint_QoSProfile)
+        context.ContextOuterClass.Constraint_QoSProfileOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Constraint_QoSProfile_descriptor;
@@ -73787,8 +73861,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.Constraint)
-    ConstraintOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ConstraintOrBuilder extends // @@protoc_insertion_point(interface_extends:context.Constraint)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ConstraintActionEnum action = 1;
@@ -73978,9 +74052,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.Constraint}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.Constraint)
-    // @@protoc_insertion_point(message_implements:context.Constraint)
-    Constraint extends com.google.protobuf.GeneratedMessageV3 implements ConstraintOrBuilder {
+    public static final class Constraint extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.Constraint)
+    ConstraintOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -74734,9 +74807,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.Constraint}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.Constraint)
-        // @@protoc_insertion_point(builder_implements:context.Constraint)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ConstraintOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.Constraint)
+        context.ContextOuterClass.ConstraintOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_Constraint_descriptor;
@@ -76602,8 +76674,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.TeraFlowController)
-    TeraFlowControllerOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface TeraFlowControllerOrBuilder extends // @@protoc_insertion_point(interface_extends:context.TeraFlowController)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ContextId context_id = 1;
@@ -76648,9 +76720,8 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.TeraFlowController}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.TeraFlowController)
-    // @@protoc_insertion_point(message_implements:context.TeraFlowController)
-    TeraFlowController extends com.google.protobuf.GeneratedMessageV3 implements TeraFlowControllerOrBuilder {
+    public static final class TeraFlowController extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.TeraFlowController)
+    TeraFlowControllerOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -76929,9 +77000,8 @@ public final class ContextOuterClass {
          *
          * Protobuf type {@code context.TeraFlowController}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.TeraFlowController)
-        // @@protoc_insertion_point(builder_implements:context.TeraFlowController)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.TeraFlowControllerOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.TeraFlowController)
+        context.ContextOuterClass.TeraFlowControllerOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_TeraFlowController_descriptor;
@@ -77380,8 +77450,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.AuthenticationResult)
-    AuthenticationResultOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface AuthenticationResultOrBuilder extends // @@protoc_insertion_point(interface_extends:context.AuthenticationResult)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ContextId context_id = 1;
@@ -77410,9 +77480,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.AuthenticationResult}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.AuthenticationResult)
-    // @@protoc_insertion_point(message_implements:context.AuthenticationResult)
-    AuthenticationResult extends com.google.protobuf.GeneratedMessageV3 implements AuthenticationResultOrBuilder {
+    public static final class AuthenticationResult extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.AuthenticationResult)
+    AuthenticationResultOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -77638,9 +77707,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.AuthenticationResult}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.AuthenticationResult)
-        // @@protoc_insertion_point(builder_implements:context.AuthenticationResult)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.AuthenticationResultOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.AuthenticationResult)
+        context.ContextOuterClass.AuthenticationResultOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_AuthenticationResult_descriptor;
@@ -77998,8 +78066,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.OpticalConfigId)
-    OpticalConfigIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface OpticalConfigIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalConfigId)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * string opticalconfig_uuid = 1;
@@ -78021,9 +78089,8 @@ public final class ContextOuterClass {
      *
      * Protobuf type {@code context.OpticalConfigId}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.OpticalConfigId)
-    // @@protoc_insertion_point(message_implements:context.OpticalConfigId)
-    OpticalConfigId extends com.google.protobuf.GeneratedMessageV3 implements OpticalConfigIdOrBuilder {
+    public static final class OpticalConfigId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalConfigId)
+    OpticalConfigIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -78233,9 +78300,8 @@ public final class ContextOuterClass {
          *
          * Protobuf type {@code context.OpticalConfigId}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.OpticalConfigId)
-        // @@protoc_insertion_point(builder_implements:context.OpticalConfigId)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalConfigIdOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalConfigId)
+        context.ContextOuterClass.OpticalConfigIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_OpticalConfigId_descriptor;
@@ -78500,8 +78566,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.OpticalConfig)
-    OpticalConfigOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface OpticalConfigOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalConfig)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.OpticalConfigId opticalconfig_id = 1;
@@ -78553,9 +78619,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.OpticalConfig}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.OpticalConfig)
-    // @@protoc_insertion_point(message_implements:context.OpticalConfig)
-    OpticalConfig extends com.google.protobuf.GeneratedMessageV3 implements OpticalConfigOrBuilder {
+    public static final class OpticalConfig extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalConfig)
+    OpticalConfigOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -78853,9 +78918,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.OpticalConfig}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.OpticalConfig)
-        // @@protoc_insertion_point(builder_implements:context.OpticalConfig)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalConfigOrBuilder {
+        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;
@@ -79392,8 +79456,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.OpticalConfigList)
-    OpticalConfigListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface OpticalConfigListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalConfigList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.OpticalConfig opticalconfigs = 1;
@@ -79424,9 +79488,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.OpticalConfigList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.OpticalConfigList)
-    // @@protoc_insertion_point(message_implements:context.OpticalConfigList)
-    OpticalConfigList extends com.google.protobuf.GeneratedMessageV3 implements OpticalConfigListOrBuilder {
+    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;
 
@@ -79641,9 +79704,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.OpticalConfigList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.OpticalConfigList)
-        // @@protoc_insertion_point(builder_implements:context.OpticalConfigList)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalConfigListOrBuilder {
+        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;
@@ -80110,8 +80172,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.OpticalConfigEvent)
-    OpticalConfigEventOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface OpticalConfigEventOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalConfigEvent)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Event event = 1;
@@ -80151,9 +80213,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.OpticalConfigEvent}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.OpticalConfigEvent)
-    // @@protoc_insertion_point(message_implements:context.OpticalConfigEvent)
-    OpticalConfigEvent extends com.google.protobuf.GeneratedMessageV3 implements OpticalConfigEventOrBuilder {
+    public static final class OpticalConfigEvent extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalConfigEvent)
+    OpticalConfigEventOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -80402,9 +80463,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.OpticalConfigEvent}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.OpticalConfigEvent)
-        // @@protoc_insertion_point(builder_implements:context.OpticalConfigEvent)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalConfigEventOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalConfigEvent)
+        context.ContextOuterClass.OpticalConfigEventOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_OpticalConfigEvent_descriptor;
@@ -80850,8 +80910,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.OpticalEndPointId)
-    OpticalEndPointIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface OpticalEndPointIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalEndPointId)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.DeviceId device_id = 2;
@@ -80891,9 +80951,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.OpticalEndPointId}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.OpticalEndPointId)
-    // @@protoc_insertion_point(message_implements:context.OpticalEndPointId)
-    OpticalEndPointId extends com.google.protobuf.GeneratedMessageV3 implements OpticalEndPointIdOrBuilder {
+    public static final class OpticalEndPointId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalEndPointId)
+    OpticalEndPointIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -81142,9 +81201,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.OpticalEndPointId}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.OpticalEndPointId)
-        // @@protoc_insertion_point(builder_implements:context.OpticalEndPointId)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalEndPointIdOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalEndPointId)
+        context.ContextOuterClass.OpticalEndPointIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_OpticalEndPointId_descriptor;
@@ -81590,8 +81648,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.OpticalLinkList)
-    OpticalLinkListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface OpticalLinkListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalLinkList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.OpticalLink optical_links = 1;
@@ -81622,9 +81680,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.OpticalLinkList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.OpticalLinkList)
-    // @@protoc_insertion_point(message_implements:context.OpticalLinkList)
-    OpticalLinkList extends com.google.protobuf.GeneratedMessageV3 implements OpticalLinkListOrBuilder {
+    public static final class OpticalLinkList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalLinkList)
+    OpticalLinkListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -81839,9 +81896,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.OpticalLinkList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.OpticalLinkList)
-        // @@protoc_insertion_point(builder_implements:context.OpticalLinkList)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalLinkListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalLinkList)
+        context.ContextOuterClass.OpticalLinkListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_OpticalLinkList_descriptor;
@@ -82308,8 +82364,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.OpticalLinkDetails)
-    OpticalLinkDetailsOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface OpticalLinkDetailsOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalLinkDetails)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * float length = 1;
@@ -82468,9 +82524,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.OpticalLinkDetails}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.OpticalLinkDetails)
-    // @@protoc_insertion_point(message_implements:context.OpticalLinkDetails)
-    OpticalLinkDetails extends com.google.protobuf.GeneratedMessageV3 implements OpticalLinkDetailsOrBuilder {
+    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;
 
@@ -83145,9 +83200,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.OpticalLinkDetails}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.OpticalLinkDetails)
-        // @@protoc_insertion_point(builder_implements:context.OpticalLinkDetails)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalLinkDetailsOrBuilder {
+        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;
@@ -84235,8 +84289,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.OpticalLink)
-    OpticalLinkOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface OpticalLinkOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalLink)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * string name = 1;
@@ -84313,9 +84367,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.OpticalLink}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.OpticalLink)
-    // @@protoc_insertion_point(message_implements:context.OpticalLink)
-    OpticalLink extends com.google.protobuf.GeneratedMessageV3 implements OpticalLinkOrBuilder {
+    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;
 
@@ -84671,9 +84724,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.OpticalLink}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.OpticalLink)
-        // @@protoc_insertion_point(builder_implements:context.OpticalLink)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalLinkOrBuilder {
+        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;
@@ -85503,8 +85555,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ChannelId)
-    ChannelIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ChannelIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ChannelId)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid channel_uuid = 1;
@@ -85527,9 +85579,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ChannelId}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ChannelId)
-    // @@protoc_insertion_point(message_implements:context.ChannelId)
-    ChannelId extends com.google.protobuf.GeneratedMessageV3 implements ChannelIdOrBuilder {
+    public static final class ChannelId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ChannelId)
+    ChannelIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -85732,9 +85783,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ChannelId}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ChannelId)
-        // @@protoc_insertion_point(builder_implements:context.ChannelId)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ChannelIdOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ChannelId)
+        context.ContextOuterClass.ChannelIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ChannelId_descriptor;
@@ -86044,8 +86094,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.OpticalBandId)
-    OpticalBandIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface OpticalBandIdOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalBandId)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid opticalband_uuid = 1;
@@ -86068,9 +86118,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.OpticalBandId}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.OpticalBandId)
-    // @@protoc_insertion_point(message_implements:context.OpticalBandId)
-    OpticalBandId extends com.google.protobuf.GeneratedMessageV3 implements OpticalBandIdOrBuilder {
+    public static final class OpticalBandId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalBandId)
+    OpticalBandIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -86273,9 +86322,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.OpticalBandId}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.OpticalBandId)
-        // @@protoc_insertion_point(builder_implements:context.OpticalBandId)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalBandIdOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalBandId)
+        context.ContextOuterClass.OpticalBandIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_OpticalBandId_descriptor;
@@ -86585,8 +86633,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.OpticalBand)
-    OpticalBandOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface OpticalBandOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalBand)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.OpticalBandId opticalband_id = 1;
@@ -86714,9 +86762,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.OpticalBand}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.OpticalBand)
-    // @@protoc_insertion_point(message_implements:context.OpticalBand)
-    OpticalBand extends com.google.protobuf.GeneratedMessageV3 implements OpticalBandOrBuilder {
+    public static final class OpticalBand extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalBand)
+    OpticalBandOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -87277,9 +87324,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.OpticalBand}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.OpticalBand)
-        // @@protoc_insertion_point(builder_implements:context.OpticalBand)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalBandOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalBand)
+        context.ContextOuterClass.OpticalBandOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_OpticalBand_descriptor;
@@ -88455,8 +88501,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.OpticalBandList)
-    OpticalBandListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface OpticalBandListOrBuilder extends // @@protoc_insertion_point(interface_extends:context.OpticalBandList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .context.OpticalBand opticalbands = 1;
@@ -88487,9 +88533,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.OpticalBandList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.OpticalBandList)
-    // @@protoc_insertion_point(message_implements:context.OpticalBandList)
-    OpticalBandList extends com.google.protobuf.GeneratedMessageV3 implements OpticalBandListOrBuilder {
+    public static final class OpticalBandList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.OpticalBandList)
+    OpticalBandListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -88704,9 +88749,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.OpticalBandList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.OpticalBandList)
-        // @@protoc_insertion_point(builder_implements:context.OpticalBandList)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.OpticalBandListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.OpticalBandList)
+        context.ContextOuterClass.OpticalBandListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_OpticalBandList_descriptor;
@@ -89173,8 +89217,8 @@ public final class ContextOuterClass {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:context.ServiceConfigRule)
-    ServiceConfigRuleOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface ServiceConfigRuleOrBuilder extends // @@protoc_insertion_point(interface_extends:context.ServiceConfigRule)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.ServiceId service_id = 1;
@@ -89214,9 +89258,8 @@ public final class ContextOuterClass {
     /**
      * Protobuf type {@code context.ServiceConfigRule}
      */
-    public static final class // @@protoc_insertion_point(message_implements:context.ServiceConfigRule)
-    // @@protoc_insertion_point(message_implements:context.ServiceConfigRule)
-    ServiceConfigRule extends com.google.protobuf.GeneratedMessageV3 implements ServiceConfigRuleOrBuilder {
+    public static final class ServiceConfigRule extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:context.ServiceConfigRule)
+    ServiceConfigRuleOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -89465,9 +89508,8 @@ public final class ContextOuterClass {
         /**
          * Protobuf type {@code context.ServiceConfigRule}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:context.ServiceConfigRule)
-        // @@protoc_insertion_point(builder_implements:context.ServiceConfigRule)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements context.ContextOuterClass.ServiceConfigRuleOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:context.ServiceConfigRule)
+        context.ContextOuterClass.ServiceConfigRuleOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return context.ContextOuterClass.internal_static_context_ServiceConfigRule_descriptor;
@@ -90328,7 +90370,7 @@ public final class ContextOuterClass {
     private static com.google.protobuf.Descriptors.FileDescriptor descriptor;
 
     static {
-        java.lang.String[] descriptorData = { "\n\rcontext.proto\022\007context\032\031google/protobu" + "f/any.proto\032\tacl.proto\032\014ipowdm.proto\032\rip" + "_link.proto\032\026kpi_sample_types.proto\032\016tap" + "i_lsp.proto\"\007\n\005Empty\"\024\n\004Uuid\022\014\n\004uuid\030\001 \001" + "(\t\"\036\n\tTimestamp\022\021\n\ttimestamp\030\001 \001(\001\"Z\n\005Ev" + "ent\022%\n\ttimestamp\030\001 \001(\0132\022.context.Timesta" + "mp\022*\n\nevent_type\030\002 \001(\0162\026.context.EventTy" + "peEnum\"\265\002\n\010AnyEvent\022(\n\007context\030\001 \001(\0132\025.c" + "ontext.ContextEventH\000\022*\n\010topology\030\002 \001(\0132" + "\026.context.TopologyEventH\000\022&\n\006device\030\003 \001(" + "\0132\024.context.DeviceEventH\000\022\"\n\004link\030\004 \001(\0132" + "\022.context.LinkEventH\000\022(\n\007service\030\005 \001(\0132\025" + ".context.ServiceEventH\000\022$\n\005slice\030\006 \001(\0132\023" + ".context.SliceEventH\000\022.\n\nconnection\030\007 \001(" + "\0132\030.context.ConnectionEventH\000B\007\n\005event\"0" + "\n\tContextId\022#\n\014context_uuid\030\001 \001(\0132\r.cont" + "ext.Uuid\"\351\001\n\007Context\022&\n\ncontext_id\030\001 \001(\013" + "2\022.context.ContextId\022\014\n\004name\030\002 \001(\t\022)\n\014to" + "pology_ids\030\003 \003(\0132\023.context.TopologyId\022\'\n" + "\013service_ids\030\004 \003(\0132\022.context.ServiceId\022#" + "\n\tslice_ids\030\005 \003(\0132\020.context.SliceId\022/\n\nc" + "ontroller\030\006 \001(\0132\033.context.TeraFlowContro" + "ller\"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.context.Context\"U\n\014Con" + "textEvent\022\035\n\005event\030\001 \001(\0132\016.context.Event" + "\022&\n\ncontext_id\030\002 \001(\0132\022.context.ContextId" + "\"Z\n\nTopologyId\022&\n\ncontext_id\030\001 \001(\0132\022.con" + "text.ContextId\022$\n\rtopology_uuid\030\002 \001(\0132\r." + "context.Uuid\"\267\001\n\010Topology\022(\n\013topology_id" + "\030\001 \001(\0132\023.context.TopologyId\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.context.LinkId\022)\n\020o" + "ptical_link_ids\030\005 \003(\0132\017.context.LinkId\"\266" + "\001\n\017TopologyDetails\022(\n\013topology_id\030\001 \001(\0132" + "\023.context.TopologyId\022\014\n\004name\030\002 \001(\t\022 \n\007de" + "vices\030\003 \003(\0132\017.context.Device\022\034\n\005links\030\004 " + "\003(\0132\r.context.Link\022+\n\roptical_links\030\005 \003(" + "\0132\024.context.OpticalLink\";\n\016TopologyIdLis" + "t\022)\n\014topology_ids\030\001 \003(\0132\023.context.Topolo" + "gyId\"5\n\014TopologyList\022%\n\ntopologies\030\001 \003(\013" + "2\021.context.Topology\"X\n\rTopologyEvent\022\035\n\005" + "event\030\001 \001(\0132\016.context.Event\022(\n\013topology_" + "id\030\002 \001(\0132\023.context.TopologyId\".\n\010DeviceI" + "d\022\"\n\013device_uuid\030\001 \001(\0132\r.context.Uuid\"\372\002" + "\n\006Device\022$\n\tdevice_id\030\001 \001(\0132\021.context.De" + "viceId\022\014\n\004name\030\002 \001(\t\022\023\n\013device_type\030\003 \001(" + "\t\022,\n\rdevice_config\030\004 \001(\0132\025.context.Devic" + "eConfig\022G\n\031device_operational_status\030\005 \001" + "(\0162$.context.DeviceOperationalStatusEnum" + "\0221\n\016device_drivers\030\006 \003(\0162\031.context.Devic" + "eDriverEnum\022+\n\020device_endpoints\030\007 \003(\0132\021." + "context.EndPoint\022&\n\ncomponents\030\010 \003(\0132\022.c" + "ontext.Component\022(\n\rcontroller_id\030\t \001(\0132" + "\021.context.DeviceId\"\311\001\n\tComponent\022%\n\016comp" + "onent_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\nattributes\030\004 \003(\0132" + "\".context.Component.AttributesEntry\022\016\n\006p" + "arent\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\014DeviceConfig\022)" + "\n\014config_rules\030\001 \003(\0132\023.context.ConfigRul" + "e\"5\n\014DeviceIdList\022%\n\ndevice_ids\030\001 \003(\0132\021." + "context.DeviceId\".\n\nDeviceList\022 \n\007device" + "s\030\001 \003(\0132\017.context.Device\"\216\001\n\014DeviceFilte" + "r\022)\n\ndevice_ids\030\001 \001(\0132\025.context.DeviceId" + "List\022\031\n\021include_endpoints\030\002 \001(\010\022\034\n\024inclu" + "de_config_rules\030\003 \001(\010\022\032\n\022include_compone" + "nts\030\004 \001(\010\"\200\001\n\013DeviceEvent\022\035\n\005event\030\001 \001(\013" + "2\016.context.Event\022$\n\tdevice_id\030\002 \001(\0132\021.co" + "ntext.DeviceId\022,\n\rdevice_config\030\003 \001(\0132\025." + "context.DeviceConfig\"*\n\006LinkId\022 \n\tlink_u" + "uid\030\001 \001(\0132\r.context.Uuid\"c\n\016LinkAttribut" + "es\022\030\n\020is_bidirectional\030\001 \001(\010\022\033\n\023total_ca" + "pacity_gbps\030\002 \001(\002\022\032\n\022used_capacity_gbps\030" + "\003 \001(\002\"\275\001\n\004Link\022 \n\007link_id\030\001 \001(\0132\017.contex" + "t.LinkId\022\014\n\004name\030\002 \001(\t\022(\n\tlink_type\030\003 \001(" + "\0162\025.context.LinkTypeEnum\022.\n\021link_endpoin" + "t_ids\030\004 \003(\0132\023.context.EndPointId\022+\n\nattr" + "ibutes\030\005 \001(\0132\027.context.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.cont" + "ext.Link\"L\n\tLinkEvent\022\035\n\005event\030\001 \001(\0132\016.c" + "ontext.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.ServiceId\022\014\n\004name\030\002 \001" + "(\t\022.\n\014service_type\030\003 \001(\0162\030.context.Servi" + "ceTypeEnum\0221\n\024service_endpoint_ids\030\004 \003(\013" + "2\023.context.EndPointId\0220\n\023service_constra" + "ints\030\005 \003(\0132\023.context.Constraint\022.\n\016servi" + "ce_status\030\006 \001(\0132\026.context.ServiceStatus\022" + ".\n\016service_config\030\007 \001(\0132\026.context.Servic" + "eConfig\022%\n\ttimestamp\030\010 \001(\0132\022.context.Tim" + "estamp\"C\n\rServiceStatus\0222\n\016service_statu" + "s\030\001 \001(\0162\032.context.ServiceStatusEnum\":\n\rS" + "erviceConfig\022)\n\014config_rules\030\001 \003(\0132\023.con" + "text.ConfigRule\"8\n\rServiceIdList\022\'\n\013serv" + "ice_ids\030\001 \003(\0132\022.context.ServiceId\"1\n\013Ser" + "viceList\022\"\n\010services\030\001 \003(\0132\020.context.Ser" + "vice\"\225\001\n\rServiceFilter\022+\n\013service_ids\030\001 " + "\001(\0132\026.context.ServiceIdList\022\034\n\024include_e" + "ndpoint_ids\030\002 \001(\010\022\033\n\023include_constraints" + "\030\003 \001(\010\022\034\n\024include_config_rules\030\004 \001(\010\"U\n\014" + "ServiceEvent\022\035\n\005event\030\001 \001(\0132\016.context.Ev" + "ent\022&\n\nservice_id\030\002 \001(\0132\022.context.Servic" + "eId\"T\n\007SliceId\022&\n\ncontext_id\030\001 \001(\0132\022.con" + "text.ContextId\022!\n\nslice_uuid\030\002 \001(\0132\r.con" + "text.Uuid\"\240\003\n\005Slice\022\"\n\010slice_id\030\001 \001(\0132\020." + "context.SliceId\022\014\n\004name\030\002 \001(\t\022/\n\022slice_e" + "ndpoint_ids\030\003 \003(\0132\023.context.EndPointId\022." + "\n\021slice_constraints\030\004 \003(\0132\023.context.Cons" + "traint\022-\n\021slice_service_ids\030\005 \003(\0132\022.cont" + "ext.ServiceId\022,\n\022slice_subslice_ids\030\006 \003(" + "\0132\020.context.SliceId\022*\n\014slice_status\030\007 \001(" + "\0132\024.context.SliceStatus\022*\n\014slice_config\030" + "\010 \001(\0132\024.context.SliceConfig\022(\n\013slice_own" + "er\030\t \001(\0132\023.context.SliceOwner\022%\n\ttimesta" + "mp\030\n \001(\0132\022.context.Timestamp\"E\n\nSliceOwn" + "er\022!\n\nowner_uuid\030\001 \001(\0132\r.context.Uuid\022\024\n" + "\014owner_string\030\002 \001(\t\"=\n\013SliceStatus\022.\n\014sl" + "ice_status\030\001 \001(\0162\030.context.SliceStatusEn" + "um\"8\n\013SliceConfig\022)\n\014config_rules\030\001 \003(\0132" + "\023.context.ConfigRule\"2\n\013SliceIdList\022#\n\ts" + "lice_ids\030\001 \003(\0132\020.context.SliceId\"+\n\tSlic" + "eList\022\036\n\006slices\030\001 \003(\0132\016.context.Slice\"\312\001" + "\n\013SliceFilter\022\'\n\tslice_ids\030\001 \001(\0132\024.conte" + "xt.SliceIdList\022\034\n\024include_endpoint_ids\030\002" + " \001(\010\022\033\n\023include_constraints\030\003 \001(\010\022\033\n\023inc" + "lude_service_ids\030\004 \001(\010\022\034\n\024include_subsli" + "ce_ids\030\005 \001(\010\022\034\n\024include_config_rules\030\006 \001" + "(\010\"O\n\nSliceEvent\022\035\n\005event\030\001 \001(\0132\016.contex" + "t.Event\022\"\n\010slice_id\030\002 \001(\0132\020.context.Slic" + "eId\"6\n\014ConnectionId\022&\n\017connection_uuid\030\001" + " \001(\0132\r.context.Uuid\"2\n\025ConnectionSetting" + "s_L0\022\031\n\021lsp_symbolic_name\030\001 \001(\t\"\236\001\n\025Conn" + "ectionSettings_L2\022\027\n\017src_mac_address\030\001 \001" + "(\t\022\027\n\017dst_mac_address\030\002 \001(\t\022\022\n\nether_typ" + "e\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\025Conn" + "ectionSettings_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\025Connec" + "tionSettings_L4\022\020\n\010src_port\030\001 \001(\r\022\020\n\010dst" + "_port\030\002 \001(\r\022\021\n\ttcp_flags\030\003 \001(\r\022\013\n\003ttl\030\004 " + "\001(\r\"\304\001\n\022ConnectionSettings\022*\n\002l0\030\001 \001(\0132\036" + ".context.ConnectionSettings_L0\022*\n\002l2\030\002 \001" + "(\0132\036.context.ConnectionSettings_L2\022*\n\002l3" + "\030\003 \001(\0132\036.context.ConnectionSettings_L3\022*" + "\n\002l4\030\004 \001(\0132\036.context.ConnectionSettings_" + "L4\"\363\001\n\nConnection\022,\n\rconnection_id\030\001 \001(\013" + "2\025.context.ConnectionId\022&\n\nservice_id\030\002 " + "\001(\0132\022.context.ServiceId\0223\n\026path_hops_end" + "point_ids\030\003 \003(\0132\023.context.EndPointId\022+\n\017" + "sub_service_ids\030\004 \003(\0132\022.context.ServiceI" + "d\022-\n\010settings\030\005 \001(\0132\033.context.Connection" + "Settings\"A\n\020ConnectionIdList\022-\n\016connecti" + "on_ids\030\001 \003(\0132\025.context.ConnectionId\":\n\016C" + "onnectionList\022(\n\013connections\030\001 \003(\0132\023.con" + "text.Connection\"^\n\017ConnectionEvent\022\035\n\005ev" + "ent\030\001 \001(\0132\016.context.Event\022,\n\rconnection_" + "id\030\002 \001(\0132\025.context.ConnectionId\"\202\001\n\nEndP" + "ointId\022(\n\013topology_id\030\001 \001(\0132\023.context.To" + "pologyId\022$\n\tdevice_id\030\002 \001(\0132\021.context.De" + "viceId\022$\n\rendpoint_uuid\030\003 \001(\0132\r.context." + "Uuid\"\310\002\n\010EndPoint\022(\n\013endpoint_id\030\001 \001(\0132\023" + ".context.EndPointId\022\014\n\004name\030\002 \001(\t\022\025\n\rend" + "point_type\030\003 \001(\t\0229\n\020kpi_sample_types\030\004 \003" + "(\0162\037.kpi_sample_types.KpiSampleType\022,\n\021e" + "ndpoint_location\030\005 \001(\0132\021.context.Locatio" + "n\0229\n\014capabilities\030\006 \003(\0132#.context.EndPoi" + "nt.CapabilitiesEntry\032I\n\021CapabilitiesEntr" + "y\022\013\n\003key\030\001 \001(\t\022#\n\005value\030\002 \001(\0132\024.google.p" + "rotobuf.Any:\0028\001\"{\n\014EndPointName\022(\n\013endpo" + "int_id\030\001 \001(\0132\023.context.EndPointId\022\023\n\013dev" + "ice_name\030\002 \001(\t\022\025\n\rendpoint_name\030\003 \001(\t\022\025\n" + "\rendpoint_type\030\004 \001(\t\";\n\016EndPointIdList\022)" + "\n\014endpoint_ids\030\001 \003(\0132\023.context.EndPointI" + "d\"A\n\020EndPointNameList\022-\n\016endpoint_names\030" + "\001 \003(\0132\025.context.EndPointName\"A\n\021ConfigRu" + "le_Custom\022\024\n\014resource_key\030\001 \001(\t\022\026\n\016resou" + "rce_value\030\002 \001(\t\"]\n\016ConfigRule_ACL\022(\n\013end" + "point_id\030\001 \001(\0132\023.context.EndPointId\022!\n\010r" + "ule_set\030\002 \001(\0132\017.acl.AclRuleSet\"f\n\021Config" + "Rule_IPOWDM\022(\n\013endpoint_id\030\001 \001(\0132\023.conte" + "xt.EndPointId\022\'\n\010rule_set\030\002 \001(\0132\025.ipowdm" + ".IpowdmRuleSet\"k\n\023ConfigRule_TAPI_LSP\022(\n" + "\013endpoint_id\030\001 \001(\0132\023.context.EndPointId\022" + "*\n\010rule_set\030\002 \003(\0132\030.tapi_lsp.TapiLspRule" + "Set\"h\n\022ConfigRule_IP_LINK\022(\n\013endpoint_id" + "\030\001 \001(\0132\023.context.EndPointId\022(\n\010rule_set\030" + "\002 \001(\0132\026.ip_link.IpLinkRuleSet\"\254\002\n\nConfig" + "Rule\022)\n\006action\030\001 \001(\0162\031.context.ConfigAct" + "ionEnum\022,\n\006custom\030\002 \001(\0132\032.context.Config" + "Rule_CustomH\000\022&\n\003acl\030\003 \001(\0132\027.context.Con" + "figRule_ACLH\000\022.\n\007ip_link\030\004 \001(\0132\033.context" + ".ConfigRule_IP_LINKH\000\0220\n\010tapi_lsp\030\005 \001(\0132" + "\034.context.ConfigRule_TAPI_LSPH\000\022,\n\006ipowd" + "m\030\006 \001(\0132\032.context.ConfigRule_IPOWDMH\000B\r\n" + "\013config_rule\"F\n\021Constraint_Custom\022\027\n\017con" + "straint_type\030\001 \001(\t\022\030\n\020constraint_value\030\002" + " \001(\t\"E\n\023Constraint_Schedule\022\027\n\017start_tim" + "estamp\030\001 \001(\001\022\025\n\rduration_days\030\002 \001(\002\"3\n\014G" + "PS_Position\022\020\n\010latitude\030\001 \001(\002\022\021\n\tlongitu" + "de\030\002 \001(\002\"\204\001\n\010Location\022\020\n\006region\030\001 \001(\tH\000\022" + "-\n\014gps_position\030\002 \001(\0132\025.context.GPS_Posi" + "tionH\000\022\023\n\tinterface\030\003 \001(\tH\000\022\026\n\014circuit_p" + "ack\030\004 \001(\tH\000B\n\n\010location\"l\n\033Constraint_En" + "dPointLocation\022(\n\013endpoint_id\030\001 \001(\0132\023.co" + "ntext.EndPointId\022#\n\010location\030\002 \001(\0132\021.con" + "text.Location\"Y\n\033Constraint_EndPointPrio" + "rity\022(\n\013endpoint_id\030\001 \001(\0132\023.context.EndP" + "ointId\022\020\n\010priority\030\002 \001(\r\"0\n\026Constraint_S" + "LA_Latency\022\026\n\016e2e_latency_ms\030\001 \001(\002\"0\n\027Co" + "nstraint_SLA_Capacity\022\025\n\rcapacity_gbps\030\001" + " \001(\002\"c\n\033Constraint_SLA_Availability\022\032\n\022n" + "um_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\017isolation_level\030\001" + " \003(\0162\033.context.IsolationLevelEnum\"\242\001\n\025Co" + "nstraint_Exclusions\022\024\n\014is_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.EndPoin" + "tId\022!\n\010link_ids\030\004 \003(\0132\017.context.LinkId\"5" + "\n\014QoSProfileId\022%\n\016qos_profile_id\030\001 \001(\0132\r" + ".context.Uuid\"`\n\025Constraint_QoSProfile\022-" + "\n\016qos_profile_id\030\001 \001(\0132\025.context.QoSProf" + "ileId\022\030\n\020qos_profile_name\030\002 \001(\t\"\222\005\n\nCons" + "traint\022-\n\006action\030\001 \001(\0162\035.context.Constra" + "intActionEnum\022,\n\006custom\030\002 \001(\0132\032.context." + "Constraint_CustomH\000\0220\n\010schedule\030\003 \001(\0132\034." + "context.Constraint_ScheduleH\000\022A\n\021endpoin" + "t_location\030\004 \001(\0132$.context.Constraint_En" + "dPointLocationH\000\022A\n\021endpoint_priority\030\005 " + "\001(\0132$.context.Constraint_EndPointPriorit" + "yH\000\0228\n\014sla_capacity\030\006 \001(\0132 .context.Cons" + "traint_SLA_CapacityH\000\0226\n\013sla_latency\030\007 \001" + "(\0132\037.context.Constraint_SLA_LatencyH\000\022@\n" + "\020sla_availability\030\010 \001(\0132$.context.Constr" + "aint_SLA_AvailabilityH\000\022@\n\rsla_isolation" + "\030\t \001(\0132\'.context.Constraint_SLA_Isolatio" + "n_levelH\000\0224\n\nexclusions\030\n \001(\0132\036.context." + "Constraint_ExclusionsH\000\0225\n\013qos_profile\030\013" + " \001(\0132\036.context.Constraint_QoSProfileH\000B\014" + "\n\nconstraint\"^\n\022TeraFlowController\022&\n\nco" + "ntext_id\030\001 \001(\0132\022.context.ContextId\022\022\n\nip" + "_address\030\002 \001(\t\022\014\n\004port\030\003 \001(\r\"U\n\024Authenti" + "cationResult\022&\n\ncontext_id\030\001 \001(\0132\022.conte" + "xt.ContextId\022\025\n\rauthenticated\030\002 \001(\010\"-\n\017O" + "pticalConfigId\022\032\n\022opticalconfig_uuid\030\001 \001" + "(\t\"y\n\rOpticalConfig\0222\n\020opticalconfig_id\030" + "\001 \001(\0132\030.context.OpticalConfigId\022\016\n\006confi" + "g\030\002 \001(\t\022$\n\tdevice_id\030\003 \001(\0132\021.context.Dev" + "iceId\"C\n\021OpticalConfigList\022.\n\016opticalcon" + "figs\030\001 \003(\0132\026.context.OpticalConfig\"g\n\022Op" + "ticalConfigEvent\022\035\n\005event\030\001 \001(\0132\016.contex" + "t.Event\0222\n\020opticalconfig_id\030\002 \001(\0132\030.cont" + "ext.OpticalConfigId\"_\n\021OpticalEndPointId" + "\022$\n\tdevice_id\030\002 \001(\0132\021.context.DeviceId\022$" + "\n\rendpoint_uuid\030\003 \001(\0132\r.context.Uuid\">\n\017" + "OpticalLinkList\022+\n\roptical_links\030\001 \003(\0132\024" + ".context.OpticalLink\"\304\003\n\022OpticalLinkDeta" + "ils\022\016\n\006length\030\001 \001(\002\022\020\n\010src_port\030\002 \001(\t\022\020\n" + "\010dst_port\030\003 \001(\t\022\027\n\017local_peer_port\030\004 \001(\t" + "\022\030\n\020remote_peer_port\030\005 \001(\t\022\014\n\004used\030\006 \001(\010" + "\0228\n\007c_slots\030\007 \003(\0132\'.context.OpticalLinkD" + "etails.CSlotsEntry\0228\n\007l_slots\030\010 \003(\0132\'.co" + "ntext.OpticalLinkDetails.LSlotsEntry\0228\n\007" + "s_slots\030\t \003(\0132\'.context.OpticalLinkDetai" + "ls.SSlotsEntry\032-\n\013CSlotsEntry\022\013\n\003key\030\001 \001" + "(\t\022\r\n\005value\030\002 \001(\005:\0028\001\032-\n\013LSlotsEntry\022\013\n\003" + "key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\0028\001\032-\n\013SSlotsEn" + "try\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\0028\001\"\243\001\n\013" + "OpticalLink\022\014\n\004name\030\001 \001(\t\0224\n\017optical_det" + "ails\030\002 \001(\0132\033.context.OpticalLinkDetails\022" + " \n\007link_id\030\003 \001(\0132\017.context.LinkId\022.\n\021lin" + "k_endpoint_ids\030\004 \003(\0132\023.context.EndPointI" + "d\"0\n\tChannelId\022#\n\014channel_uuid\030\001 \001(\0132\r.c" + "ontext.Uuid\"8\n\rOpticalBandId\022\'\n\020opticalb" + "and_uuid\030\001 \001(\0132\r.context.Uuid\"\247\002\n\013Optica" + "lBand\022.\n\016opticalband_id\030\001 \001(\0132\026.context." + "OpticalBandId\022,\n\rconnection_id\030\002 \001(\0132\025.c" + "ontext.ConnectionId\022&\n\nchannel_id\030\003 \001(\0132" + "\022.context.ChannelId\022&\n\nservice_id\030\004 \001(\0132" + "\022.context.ServiceId\022#\n\007service\030\005 \001(\0132\020.c" + "ontext.ServiceH\000\022)\n\nconnection\030\006 \001(\0132\023.c" + "ontext.ConnectionH\000\022\021\n\007channel\030\007 \001(\tH\000B\007" + "\n\005field\"=\n\017OpticalBandList\022*\n\014opticalban" + "ds\030\001 \003(\0132\024.context.OpticalBand\"r\n\021Servic" + "eConfigRule\022&\n\nservice_id\030\001 \001(\0132\022.contex" + "t.ServiceId\0225\n\021configrule_custom\030\002 \001(\0132\032" + ".context.ConfigRule_Custom*j\n\rEventTypeE" + "num\022\027\n\023EVENTTYPE_UNDEFINED\020\000\022\024\n\020EVENTTYP" + "E_CREATE\020\001\022\024\n\020EVENTTYPE_UPDATE\020\002\022\024\n\020EVEN" + "TTYPE_REMOVE\020\003*\333\004\n\020DeviceDriverEnum\022\032\n\026D" + "EVICEDRIVER_UNDEFINED\020\000\022\033\n\027DEVICEDRIVER_" + "OPENCONFIG\020\001\022\036\n\032DEVICEDRIVER_TRANSPORT_A" + "PI\020\002\022\023\n\017DEVICEDRIVER_P4\020\003\022&\n\"DEVICEDRIVE" + "R_IETF_NETWORK_TOPOLOGY\020\004\022\033\n\027DEVICEDRIVE" + "R_ONF_TR_532\020\005\022\023\n\017DEVICEDRIVER_XR\020\006\022\033\n\027D" + "EVICEDRIVER_IETF_L2VPN\020\007\022 \n\034DEVICEDRIVER" + "_GNMI_OPENCONFIG\020\010\022\034\n\030DEVICEDRIVER_OPTIC" + "AL_TFS\020\t\022\032\n\026DEVICEDRIVER_IETF_ACTN\020\n\022\023\n\017" + "DEVICEDRIVER_OC\020\013\022\024\n\020DEVICEDRIVER_QKD\020\014\022" + "\033\n\027DEVICEDRIVER_IETF_L3VPN\020\r\022\033\n\027DEVICEDR" + "IVER_IETF_SLICE\020\016\022\024\n\020DEVICEDRIVER_NCE\020\017\022" + "\031\n\025DEVICEDRIVER_SMARTNIC\020\020\022\031\n\025DEVICEDRIV" + "ER_MORPHEUS\020\021\022\024\n\020DEVICEDRIVER_RYU\020\022\022#\n\037D" + "EVICEDRIVER_GNMI_NOKIA_SRLINUX\020\023\022\032\n\026DEVI" + "CEDRIVER_OPENROADM\020\024*\217\001\n\033DeviceOperation" + "alStatusEnum\022%\n!DEVICEOPERATIONALSTATUS_" + "UNDEFINED\020\000\022$\n DEVICEOPERATIONALSTATUS_D" + "ISABLED\020\001\022#\n\037DEVICEOPERATIONALSTATUS_ENA" + "BLED\020\002*\245\001\n\014LinkTypeEnum\022\024\n\020LINKTYPE_UNKN" + "OWN\020\000\022\023\n\017LINKTYPE_COPPER\020\001\022\022\n\016LINKTYPE_F" + "IBER\020\002\022\022\n\016LINKTYPE_RADIO\020\003\022\024\n\020LINKTYPE_V" + "IRTUAL\020\004\022\027\n\023LINKTYPE_MANAGEMENT\020\005\022\023\n\017LIN" + "KTYPE_REMOTE\020\006*\360\002\n\017ServiceTypeEnum\022\027\n\023SE" + "RVICETYPE_UNKNOWN\020\000\022\024\n\020SERVICETYPE_L3NM\020" + "\001\022\024\n\020SERVICETYPE_L2NM\020\002\022)\n%SERVICETYPE_T" + "API_CONNECTIVITY_SERVICE\020\003\022\022\n\016SERVICETYP" + "E_TE\020\004\022\023\n\017SERVICETYPE_E2E\020\005\022$\n SERVICETY" + "PE_OPTICAL_CONNECTIVITY\020\006\022\023\n\017SERVICETYPE" + "_QKD\020\007\022\024\n\020SERVICETYPE_L1NM\020\010\022\023\n\017SERVICET" + "YPE_INT\020\t\022\023\n\017SERVICETYPE_ACL\020\n\022\027\n\023SERVIC" + "ETYPE_IP_LINK\020\013\022\030\n\024SERVICETYPE_TAPI_LSP\020" + "\014\022\026\n\022SERVICETYPE_IPOWDM\020\r*\304\001\n\021ServiceSta" + "tusEnum\022\033\n\027SERVICESTATUS_UNDEFINED\020\000\022\031\n\025" + "SERVICESTATUS_PLANNED\020\001\022\030\n\024SERVICESTATUS" + "_ACTIVE\020\002\022\032\n\026SERVICESTATUS_UPDATING\020\003\022!\n" + "\035SERVICESTATUS_PENDING_REMOVAL\020\004\022\036\n\032SERV" + "ICESTATUS_SLA_VIOLATED\020\005*\251\001\n\017SliceStatus" + "Enum\022\031\n\025SLICESTATUS_UNDEFINED\020\000\022\027\n\023SLICE" + "STATUS_PLANNED\020\001\022\024\n\020SLICESTATUS_INIT\020\002\022\026" + "\n\022SLICESTATUS_ACTIVE\020\003\022\026\n\022SLICESTATUS_DE" + "INIT\020\004\022\034\n\030SLICESTATUS_SLA_VIOLATED\020\005*]\n\020" + "ConfigActionEnum\022\032\n\026CONFIGACTION_UNDEFIN" + "ED\020\000\022\024\n\020CONFIGACTION_SET\020\001\022\027\n\023CONFIGACTI" + "ON_DELETE\020\002*m\n\024ConstraintActionEnum\022\036\n\032C" + "ONSTRAINTACTION_UNDEFINED\020\000\022\030\n\024CONSTRAIN" + "TACTION_SET\020\001\022\033\n\027CONSTRAINTACTION_DELETE" + "\020\002*\203\002\n\022IsolationLevelEnum\022\020\n\014NO_ISOLATIO" + "N\020\000\022\026\n\022PHYSICAL_ISOLATION\020\001\022\025\n\021LOGICAL_I" + "SOLATION\020\002\022\025\n\021PROCESS_ISOLATION\020\003\022\035\n\031PHY" + "SICAL_MEMORY_ISOLATION\020\004\022\036\n\032PHYSICAL_NET" + "WORK_ISOLATION\020\005\022\036\n\032VIRTUAL_RESOURCE_ISO" + "LATION\020\006\022\037\n\033NETWORK_FUNCTIONS_ISOLATION\020" + "\007\022\025\n\021SERVICE_ISOLATION\020\0102\274\035\n\016ContextServ" + "ice\022:\n\016ListContextIds\022\016.context.Empty\032\026." + "context.ContextIdList\"\000\0226\n\014ListContexts\022" + "\016.context.Empty\032\024.context.ContextList\"\000\022" + "4\n\nGetContext\022\022.context.ContextId\032\020.cont" + "ext.Context\"\000\0224\n\nSetContext\022\020.context.Co" + "ntext\032\022.context.ContextId\"\000\0225\n\rRemoveCon" + "text\022\022.context.ContextId\032\016.context.Empty" + "\"\000\022=\n\020GetContextEvents\022\016.context.Empty\032\025" + ".context.ContextEvent\"\0000\001\022@\n\017ListTopolog" + "yIds\022\022.context.ContextId\032\027.context.Topol" + "ogyIdList\"\000\022=\n\016ListTopologies\022\022.context." + "ContextId\032\025.context.TopologyList\"\000\0227\n\013Ge" + "tTopology\022\023.context.TopologyId\032\021.context" + ".Topology\"\000\022E\n\022GetTopologyDetails\022\023.cont" + "ext.TopologyId\032\030.context.TopologyDetails" + "\"\000\0227\n\013SetTopology\022\021.context.Topology\032\023.c" + "ontext.TopologyId\"\000\0227\n\016RemoveTopology\022\023." + "context.TopologyId\032\016.context.Empty\"\000\022?\n\021" + "GetTopologyEvents\022\016.context.Empty\032\026.cont" + "ext.TopologyEvent\"\0000\001\0228\n\rListDeviceIds\022\016" + ".context.Empty\032\025.context.DeviceIdList\"\000\022" + "4\n\013ListDevices\022\016.context.Empty\032\023.context" + ".DeviceList\"\000\0221\n\tGetDevice\022\021.context.Dev" + "iceId\032\017.context.Device\"\000\0221\n\tSetDevice\022\017." + "context.Device\032\021.context.DeviceId\"\000\0223\n\014R" + "emoveDevice\022\021.context.DeviceId\032\016.context" + ".Empty\"\000\022;\n\017GetDeviceEvents\022\016.context.Em" + "pty\032\024.context.DeviceEvent\"\0000\001\022<\n\014SelectD" + "evice\022\025.context.DeviceFilter\032\023.context.D" + "eviceList\"\000\022I\n\021ListEndPointNames\022\027.conte" + "xt.EndPointIdList\032\031.context.EndPointName" + "List\"\000\0224\n\013ListLinkIds\022\016.context.Empty\032\023." + "context.LinkIdList\"\000\0220\n\tListLinks\022\016.cont" + "ext.Empty\032\021.context.LinkList\"\000\022+\n\007GetLin" + "k\022\017.context.LinkId\032\r.context.Link\"\000\022+\n\007S" + "etLink\022\r.context.Link\032\017.context.LinkId\"\000" + "\022/\n\nRemoveLink\022\017.context.LinkId\032\016.contex" + "t.Empty\"\000\0227\n\rGetLinkEvents\022\016.context.Emp" + "ty\032\022.context.LinkEvent\"\0000\001\022>\n\016ListServic" + "eIds\022\022.context.ContextId\032\026.context.Servi" + "ceIdList\"\000\022:\n\014ListServices\022\022.context.Con" + "textId\032\024.context.ServiceList\"\000\0224\n\nGetSer" + "vice\022\022.context.ServiceId\032\020.context.Servi" + "ce\"\000\0224\n\nSetService\022\020.context.Service\032\022.c" + "ontext.ServiceId\"\000\0226\n\014UnsetService\022\020.con" + "text.Service\032\022.context.ServiceId\"\000\0225\n\rRe" + "moveService\022\022.context.ServiceId\032\016.contex" + "t.Empty\"\000\022=\n\020GetServiceEvents\022\016.context." + "Empty\032\025.context.ServiceEvent\"\0000\001\022?\n\rSele" + "ctService\022\026.context.ServiceFilter\032\024.cont" + "ext.ServiceList\"\000\022:\n\014ListSliceIds\022\022.cont" + "ext.ContextId\032\024.context.SliceIdList\"\000\0226\n", "\nListSlices\022\022.context.ContextId\032\022.contex" + "t.SliceList\"\000\022.\n\010GetSlice\022\020.context.Slic" + "eId\032\016.context.Slice\"\000\022.\n\010SetSlice\022\016.cont" + "ext.Slice\032\020.context.SliceId\"\000\0220\n\nUnsetSl" + "ice\022\016.context.Slice\032\020.context.SliceId\"\000\022" + "1\n\013RemoveSlice\022\020.context.SliceId\032\016.conte" + "xt.Empty\"\000\0229\n\016GetSliceEvents\022\016.context.E" + "mpty\032\023.context.SliceEvent\"\0000\001\0229\n\013SelectS" + "lice\022\024.context.SliceFilter\032\022.context.Sli" + "ceList\"\000\022D\n\021ListConnectionIds\022\022.context." + "ServiceId\032\031.context.ConnectionIdList\"\000\022@" + "\n\017ListConnections\022\022.context.ServiceId\032\027." + "context.ConnectionList\"\000\022=\n\rGetConnectio" + "n\022\025.context.ConnectionId\032\023.context.Conne" + "ction\"\000\022=\n\rSetConnection\022\023.context.Conne" + "ction\032\025.context.ConnectionId\"\000\022;\n\020Remove" + "Connection\022\025.context.ConnectionId\032\016.cont" + "ext.Empty\"\000\022C\n\023GetConnectionEvents\022\016.con" + "text.Empty\032\030.context.ConnectionEvent\"\0000\001" + "\0225\n\014GetAllEvents\022\016.context.Empty\032\021.conte" + "xt.AnyEvent\"\0000\001\022@\n\020GetOpticalConfig\022\016.co" + "ntext.Empty\032\032.context.OpticalConfigList\"" + "\000\022F\n\020SetOpticalConfig\022\026.context.OpticalC" + "onfig\032\030.context.OpticalConfigId\"\000\022I\n\023Upd" + "ateOpticalConfig\022\026.context.OpticalConfig" + "\032\030.context.OpticalConfigId\"\000\022I\n\023SelectOp" + "ticalConfig\022\030.context.OpticalConfigId\032\026." + "context.OpticalConfig\"\000\022A\n\023DeleteOptical" + "Config\022\030.context.OpticalConfigId\032\016.conte" + "xt.Empty\"\000\022@\n\024DeleteOpticalChannel\022\026.con" + "text.OpticalConfig\032\016.context.Empty\"\000\0228\n\016" + "SetOpticalLink\022\024.context.OpticalLink\032\016.c" + "ontext.Empty\"\000\0229\n\016GetOpticalLink\022\017.conte" + "xt.LinkId\032\024.context.OpticalLink\"\000\0226\n\021Del" + "eteOpticalLink\022\017.context.LinkId\032\016.contex" + "t.Empty\"\000\022@\n\022GetOpticalLinkList\022\016.contex" + "t.Empty\032\030.context.OpticalLinkList\"\000\022<\n\016G" + "etOpticalBand\022\016.context.Empty\032\030.context." + "OpticalBandList\"\000\022C\n\021SelectOpticalBand\022\026" + ".context.OpticalBandId\032\024.context.Optical" + "Band\"\000\022G\n\027DeleteServiceConfigRule\022\032.cont" + "ext.ServiceConfigRule\032\016.context.Empty\"\000b" + "\006proto3" };
+        java.lang.String[] descriptorData = { "\n\rcontext.proto\022\007context\032\031google/protobu" + "f/any.proto\032\tacl.proto\032\014ipowdm.proto\032\rip" + "_link.proto\032\026kpi_sample_types.proto\032\016tap" + "i_lsp.proto\"\007\n\005Empty\"\024\n\004Uuid\022\014\n\004uuid\030\001 \001" + "(\t\"\036\n\tTimestamp\022\021\n\ttimestamp\030\001 \001(\001\"Z\n\005Ev" + "ent\022%\n\ttimestamp\030\001 \001(\0132\022.context.Timesta" + "mp\022*\n\nevent_type\030\002 \001(\0162\026.context.EventTy" + "peEnum\"\265\002\n\010AnyEvent\022(\n\007context\030\001 \001(\0132\025.c" + "ontext.ContextEventH\000\022*\n\010topology\030\002 \001(\0132" + "\026.context.TopologyEventH\000\022&\n\006device\030\003 \001(" + "\0132\024.context.DeviceEventH\000\022\"\n\004link\030\004 \001(\0132" + "\022.context.LinkEventH\000\022(\n\007service\030\005 \001(\0132\025" + ".context.ServiceEventH\000\022$\n\005slice\030\006 \001(\0132\023" + ".context.SliceEventH\000\022.\n\nconnection\030\007 \001(" + "\0132\030.context.ConnectionEventH\000B\007\n\005event\"0" + "\n\tContextId\022#\n\014context_uuid\030\001 \001(\0132\r.cont" + "ext.Uuid\"\351\001\n\007Context\022&\n\ncontext_id\030\001 \001(\013" + "2\022.context.ContextId\022\014\n\004name\030\002 \001(\t\022)\n\014to" + "pology_ids\030\003 \003(\0132\023.context.TopologyId\022\'\n" + "\013service_ids\030\004 \003(\0132\022.context.ServiceId\022#" + "\n\tslice_ids\030\005 \003(\0132\020.context.SliceId\022/\n\nc" + "ontroller\030\006 \001(\0132\033.context.TeraFlowContro" + "ller\"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.context.Context\"U\n\014Con" + "textEvent\022\035\n\005event\030\001 \001(\0132\016.context.Event" + "\022&\n\ncontext_id\030\002 \001(\0132\022.context.ContextId" + "\"Z\n\nTopologyId\022&\n\ncontext_id\030\001 \001(\0132\022.con" + "text.ContextId\022$\n\rtopology_uuid\030\002 \001(\0132\r." + "context.Uuid\"\267\001\n\010Topology\022(\n\013topology_id" + "\030\001 \001(\0132\023.context.TopologyId\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.context.LinkId\022)\n\020o" + "ptical_link_ids\030\005 \003(\0132\017.context.LinkId\"\266" + "\001\n\017TopologyDetails\022(\n\013topology_id\030\001 \001(\0132" + "\023.context.TopologyId\022\014\n\004name\030\002 \001(\t\022 \n\007de" + "vices\030\003 \003(\0132\017.context.Device\022\034\n\005links\030\004 " + "\003(\0132\r.context.Link\022+\n\roptical_links\030\005 \003(" + "\0132\024.context.OpticalLink\";\n\016TopologyIdLis" + "t\022)\n\014topology_ids\030\001 \003(\0132\023.context.Topolo" + "gyId\"5\n\014TopologyList\022%\n\ntopologies\030\001 \003(\013" + "2\021.context.Topology\"X\n\rTopologyEvent\022\035\n\005" + "event\030\001 \001(\0132\016.context.Event\022(\n\013topology_" + "id\030\002 \001(\0132\023.context.TopologyId\".\n\010DeviceI" + "d\022\"\n\013device_uuid\030\001 \001(\0132\r.context.Uuid\"\372\002" + "\n\006Device\022$\n\tdevice_id\030\001 \001(\0132\021.context.De" + "viceId\022\014\n\004name\030\002 \001(\t\022\023\n\013device_type\030\003 \001(" + "\t\022,\n\rdevice_config\030\004 \001(\0132\025.context.Devic" + "eConfig\022G\n\031device_operational_status\030\005 \001" + "(\0162$.context.DeviceOperationalStatusEnum" + "\0221\n\016device_drivers\030\006 \003(\0162\031.context.Devic" + "eDriverEnum\022+\n\020device_endpoints\030\007 \003(\0132\021." + "context.EndPoint\022&\n\ncomponents\030\010 \003(\0132\022.c" + "ontext.Component\022(\n\rcontroller_id\030\t \001(\0132" + "\021.context.DeviceId\"\311\001\n\tComponent\022%\n\016comp" + "onent_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\nattributes\030\004 \003(\0132" + "\".context.Component.AttributesEntry\022\016\n\006p" + "arent\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\014DeviceConfig\022)" + "\n\014config_rules\030\001 \003(\0132\023.context.ConfigRul" + "e\"5\n\014DeviceIdList\022%\n\ndevice_ids\030\001 \003(\0132\021." + "context.DeviceId\".\n\nDeviceList\022 \n\007device" + "s\030\001 \003(\0132\017.context.Device\"\216\001\n\014DeviceFilte" + "r\022)\n\ndevice_ids\030\001 \001(\0132\025.context.DeviceId" + "List\022\031\n\021include_endpoints\030\002 \001(\010\022\034\n\024inclu" + "de_config_rules\030\003 \001(\010\022\032\n\022include_compone" + "nts\030\004 \001(\010\"\200\001\n\013DeviceEvent\022\035\n\005event\030\001 \001(\013" + "2\016.context.Event\022$\n\tdevice_id\030\002 \001(\0132\021.co" + "ntext.DeviceId\022,\n\rdevice_config\030\003 \001(\0132\025." + "context.DeviceConfig\"*\n\006LinkId\022 \n\tlink_u" + "uid\030\001 \001(\0132\r.context.Uuid\"c\n\016LinkAttribut" + "es\022\030\n\020is_bidirectional\030\001 \001(\010\022\033\n\023total_ca" + "pacity_gbps\030\002 \001(\002\022\032\n\022used_capacity_gbps\030" + "\003 \001(\002\"\275\001\n\004Link\022 \n\007link_id\030\001 \001(\0132\017.contex" + "t.LinkId\022\014\n\004name\030\002 \001(\t\022(\n\tlink_type\030\003 \001(" + "\0162\025.context.LinkTypeEnum\022.\n\021link_endpoin" + "t_ids\030\004 \003(\0132\023.context.EndPointId\022+\n\nattr" + "ibutes\030\005 \001(\0132\027.context.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.cont" + "ext.Link\"L\n\tLinkEvent\022\035\n\005event\030\001 \001(\0132\016.c" + "ontext.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.ServiceId\022\014\n\004name\030\002 \001" + "(\t\022.\n\014service_type\030\003 \001(\0162\030.context.Servi" + "ceTypeEnum\0221\n\024service_endpoint_ids\030\004 \003(\013" + "2\023.context.EndPointId\0220\n\023service_constra" + "ints\030\005 \003(\0132\023.context.Constraint\022.\n\016servi" + "ce_status\030\006 \001(\0132\026.context.ServiceStatus\022" + ".\n\016service_config\030\007 \001(\0132\026.context.Servic" + "eConfig\022%\n\ttimestamp\030\010 \001(\0132\022.context.Tim" + "estamp\"C\n\rServiceStatus\0222\n\016service_statu" + "s\030\001 \001(\0162\032.context.ServiceStatusEnum\":\n\rS" + "erviceConfig\022)\n\014config_rules\030\001 \003(\0132\023.con" + "text.ConfigRule\"8\n\rServiceIdList\022\'\n\013serv" + "ice_ids\030\001 \003(\0132\022.context.ServiceId\"1\n\013Ser" + "viceList\022\"\n\010services\030\001 \003(\0132\020.context.Ser" + "vice\"\225\001\n\rServiceFilter\022+\n\013service_ids\030\001 " + "\001(\0132\026.context.ServiceIdList\022\034\n\024include_e" + "ndpoint_ids\030\002 \001(\010\022\033\n\023include_constraints" + "\030\003 \001(\010\022\034\n\024include_config_rules\030\004 \001(\010\"U\n\014" + "ServiceEvent\022\035\n\005event\030\001 \001(\0132\016.context.Ev" + "ent\022&\n\nservice_id\030\002 \001(\0132\022.context.Servic" + "eId\"T\n\007SliceId\022&\n\ncontext_id\030\001 \001(\0132\022.con" + "text.ContextId\022!\n\nslice_uuid\030\002 \001(\0132\r.con" + "text.Uuid\"\240\003\n\005Slice\022\"\n\010slice_id\030\001 \001(\0132\020." + "context.SliceId\022\014\n\004name\030\002 \001(\t\022/\n\022slice_e" + "ndpoint_ids\030\003 \003(\0132\023.context.EndPointId\022." + "\n\021slice_constraints\030\004 \003(\0132\023.context.Cons" + "traint\022-\n\021slice_service_ids\030\005 \003(\0132\022.cont" + "ext.ServiceId\022,\n\022slice_subslice_ids\030\006 \003(" + "\0132\020.context.SliceId\022*\n\014slice_status\030\007 \001(" + "\0132\024.context.SliceStatus\022*\n\014slice_config\030" + "\010 \001(\0132\024.context.SliceConfig\022(\n\013slice_own" + "er\030\t \001(\0132\023.context.SliceOwner\022%\n\ttimesta" + "mp\030\n \001(\0132\022.context.Timestamp\"E\n\nSliceOwn" + "er\022!\n\nowner_uuid\030\001 \001(\0132\r.context.Uuid\022\024\n" + "\014owner_string\030\002 \001(\t\"=\n\013SliceStatus\022.\n\014sl" + "ice_status\030\001 \001(\0162\030.context.SliceStatusEn" + "um\"8\n\013SliceConfig\022)\n\014config_rules\030\001 \003(\0132" + "\023.context.ConfigRule\"2\n\013SliceIdList\022#\n\ts" + "lice_ids\030\001 \003(\0132\020.context.SliceId\"+\n\tSlic" + "eList\022\036\n\006slices\030\001 \003(\0132\016.context.Slice\"\312\001" + "\n\013SliceFilter\022\'\n\tslice_ids\030\001 \001(\0132\024.conte" + "xt.SliceIdList\022\034\n\024include_endpoint_ids\030\002" + " \001(\010\022\033\n\023include_constraints\030\003 \001(\010\022\033\n\023inc" + "lude_service_ids\030\004 \001(\010\022\034\n\024include_subsli" + "ce_ids\030\005 \001(\010\022\034\n\024include_config_rules\030\006 \001" + "(\010\"O\n\nSliceEvent\022\035\n\005event\030\001 \001(\0132\016.contex" + "t.Event\022\"\n\010slice_id\030\002 \001(\0132\020.context.Slic" + "eId\"6\n\014ConnectionId\022&\n\017connection_uuid\030\001" + " \001(\0132\r.context.Uuid\"2\n\025ConnectionSetting" + "s_L0\022\031\n\021lsp_symbolic_name\030\001 \001(\t\"\236\001\n\025Conn" + "ectionSettings_L2\022\027\n\017src_mac_address\030\001 \001" + "(\t\022\027\n\017dst_mac_address\030\002 \001(\t\022\022\n\nether_typ" + "e\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\025Conn" + "ectionSettings_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\025Connec" + "tionSettings_L4\022\020\n\010src_port\030\001 \001(\r\022\020\n\010dst" + "_port\030\002 \001(\r\022\021\n\ttcp_flags\030\003 \001(\r\022\013\n\003ttl\030\004 " + "\001(\r\"\304\001\n\022ConnectionSettings\022*\n\002l0\030\001 \001(\0132\036" + ".context.ConnectionSettings_L0\022*\n\002l2\030\002 \001" + "(\0132\036.context.ConnectionSettings_L2\022*\n\002l3" + "\030\003 \001(\0132\036.context.ConnectionSettings_L3\022*" + "\n\002l4\030\004 \001(\0132\036.context.ConnectionSettings_" + "L4\"\363\001\n\nConnection\022,\n\rconnection_id\030\001 \001(\013" + "2\025.context.ConnectionId\022&\n\nservice_id\030\002 " + "\001(\0132\022.context.ServiceId\0223\n\026path_hops_end" + "point_ids\030\003 \003(\0132\023.context.EndPointId\022+\n\017" + "sub_service_ids\030\004 \003(\0132\022.context.ServiceI" + "d\022-\n\010settings\030\005 \001(\0132\033.context.Connection" + "Settings\"A\n\020ConnectionIdList\022-\n\016connecti" + "on_ids\030\001 \003(\0132\025.context.ConnectionId\":\n\016C" + "onnectionList\022(\n\013connections\030\001 \003(\0132\023.con" + "text.Connection\"^\n\017ConnectionEvent\022\035\n\005ev" + "ent\030\001 \001(\0132\016.context.Event\022,\n\rconnection_" + "id\030\002 \001(\0132\025.context.ConnectionId\"\202\001\n\nEndP" + "ointId\022(\n\013topology_id\030\001 \001(\0132\023.context.To" + "pologyId\022$\n\tdevice_id\030\002 \001(\0132\021.context.De" + "viceId\022$\n\rendpoint_uuid\030\003 \001(\0132\r.context." + "Uuid\"\310\002\n\010EndPoint\022(\n\013endpoint_id\030\001 \001(\0132\023" + ".context.EndPointId\022\014\n\004name\030\002 \001(\t\022\025\n\rend" + "point_type\030\003 \001(\t\0229\n\020kpi_sample_types\030\004 \003" + "(\0162\037.kpi_sample_types.KpiSampleType\022,\n\021e" + "ndpoint_location\030\005 \001(\0132\021.context.Locatio" + "n\0229\n\014capabilities\030\006 \003(\0132#.context.EndPoi" + "nt.CapabilitiesEntry\032I\n\021CapabilitiesEntr" + "y\022\013\n\003key\030\001 \001(\t\022#\n\005value\030\002 \001(\0132\024.google.p" + "rotobuf.Any:\0028\001\"{\n\014EndPointName\022(\n\013endpo" + "int_id\030\001 \001(\0132\023.context.EndPointId\022\023\n\013dev" + "ice_name\030\002 \001(\t\022\025\n\rendpoint_name\030\003 \001(\t\022\025\n" + "\rendpoint_type\030\004 \001(\t\";\n\016EndPointIdList\022)" + "\n\014endpoint_ids\030\001 \003(\0132\023.context.EndPointI" + "d\"A\n\020EndPointNameList\022-\n\016endpoint_names\030" + "\001 \003(\0132\025.context.EndPointName\"A\n\021ConfigRu" + "le_Custom\022\024\n\014resource_key\030\001 \001(\t\022\026\n\016resou" + "rce_value\030\002 \001(\t\"\213\001\n\016ConfigRule_ACL\022(\n\013en" + "dpoint_id\030\001 \001(\0132\023.context.EndPointId\022,\n\t" + "direction\030\002 \001(\0162\031.context.AclDirectionEn" + "um\022!\n\010rule_set\030\003 \001(\0132\017.acl.AclRuleSet\"f\n" + "\021ConfigRule_IPOWDM\022(\n\013endpoint_id\030\001 \001(\0132" + "\023.context.EndPointId\022\'\n\010rule_set\030\002 \001(\0132\025" + ".ipowdm.IpowdmRuleSet\"k\n\023ConfigRule_TAPI" + "_LSP\022(\n\013endpoint_id\030\001 \001(\0132\023.context.EndP" + "ointId\022*\n\010rule_set\030\002 \003(\0132\030.tapi_lsp.Tapi" + "LspRuleSet\"h\n\022ConfigRule_IP_LINK\022(\n\013endp" + "oint_id\030\001 \001(\0132\023.context.EndPointId\022(\n\010ru" + "le_set\030\002 \001(\0132\026.ip_link.IpLinkRuleSet\"\254\002\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\000\022.\n\007ip_link\030\004 \001(\0132\033." + "context.ConfigRule_IP_LINKH\000\0220\n\010tapi_lsp" + "\030\005 \001(\0132\034.context.ConfigRule_TAPI_LSPH\000\022," + "\n\006ipowdm\030\006 \001(\0132\032.context.ConfigRule_IPOW" + "DMH\000B\r\n\013config_rule\"F\n\021Constraint_Custom" + "\022\027\n\017constraint_type\030\001 \001(\t\022\030\n\020constraint_" + "value\030\002 \001(\t\"E\n\023Constraint_Schedule\022\027\n\017st" + "art_timestamp\030\001 \001(\001\022\025\n\rduration_days\030\002 \001" + "(\002\"3\n\014GPS_Position\022\020\n\010latitude\030\001 \001(\002\022\021\n\t" + "longitude\030\002 \001(\002\"\204\001\n\010Location\022\020\n\006region\030\001" + " \001(\tH\000\022-\n\014gps_position\030\002 \001(\0132\025.context.G" + "PS_PositionH\000\022\023\n\tinterface\030\003 \001(\tH\000\022\026\n\014ci" + "rcuit_pack\030\004 \001(\tH\000B\n\n\010location\"l\n\033Constr" + "aint_EndPointLocation\022(\n\013endpoint_id\030\001 \001" + "(\0132\023.context.EndPointId\022#\n\010location\030\002 \001(" + "\0132\021.context.Location\"Y\n\033Constraint_EndPo" + "intPriority\022(\n\013endpoint_id\030\001 \001(\0132\023.conte" + "xt.EndPointId\022\020\n\010priority\030\002 \001(\r\"0\n\026Const" + "raint_SLA_Latency\022\026\n\016e2e_latency_ms\030\001 \001(" + "\002\"0\n\027Constraint_SLA_Capacity\022\025\n\rcapacity" + "_gbps\030\001 \001(\002\"c\n\033Constraint_SLA_Availabili" + "ty\022\032\n\022num_disjoint_paths\030\001 \001(\r\022\022\n\nall_ac" + "tive\030\002 \001(\010\022\024\n\014availability\030\003 \001(\002\"V\n\036Cons" + "traint_SLA_Isolation_level\0224\n\017isolation_" + "level\030\001 \003(\0162\033.context.IsolationLevelEnum" + "\"\242\001\n\025Constraint_Exclusions\022\024\n\014is_permane" + "nt\030\001 \001(\010\022%\n\ndevice_ids\030\002 \003(\0132\021.context.D" + "eviceId\022)\n\014endpoint_ids\030\003 \003(\0132\023.context." + "EndPointId\022!\n\010link_ids\030\004 \003(\0132\017.context.L" + "inkId\"5\n\014QoSProfileId\022%\n\016qos_profile_id\030" + "\001 \001(\0132\r.context.Uuid\"`\n\025Constraint_QoSPr" + "ofile\022-\n\016qos_profile_id\030\001 \001(\0132\025.context." + "QoSProfileId\022\030\n\020qos_profile_name\030\002 \001(\t\"\222" + "\005\n\nConstraint\022-\n\006action\030\001 \001(\0162\035.context." + "ConstraintActionEnum\022,\n\006custom\030\002 \001(\0132\032.c" + "ontext.Constraint_CustomH\000\0220\n\010schedule\030\003" + " \001(\0132\034.context.Constraint_ScheduleH\000\022A\n\021" + "endpoint_location\030\004 \001(\0132$.context.Constr" + "aint_EndPointLocationH\000\022A\n\021endpoint_prio" + "rity\030\005 \001(\0132$.context.Constraint_EndPoint" + "PriorityH\000\0228\n\014sla_capacity\030\006 \001(\0132 .conte" + "xt.Constraint_SLA_CapacityH\000\0226\n\013sla_late" + "ncy\030\007 \001(\0132\037.context.Constraint_SLA_Laten" + "cyH\000\022@\n\020sla_availability\030\010 \001(\0132$.context" + ".Constraint_SLA_AvailabilityH\000\022@\n\rsla_is" + "olation\030\t \001(\0132\'.context.Constraint_SLA_I" + "solation_levelH\000\0224\n\nexclusions\030\n \001(\0132\036.c" + "ontext.Constraint_ExclusionsH\000\0225\n\013qos_pr" + "ofile\030\013 \001(\0132\036.context.Constraint_QoSProf" + "ileH\000B\014\n\nconstraint\"^\n\022TeraFlowControlle" + "r\022&\n\ncontext_id\030\001 \001(\0132\022.context.ContextI" + "d\022\022\n\nip_address\030\002 \001(\t\022\014\n\004port\030\003 \001(\r\"U\n\024A" + "uthenticationResult\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_u" + "uid\030\001 \001(\t\"y\n\rOpticalConfig\0222\n\020opticalcon" + "fig_id\030\001 \001(\0132\030.context.OpticalConfigId\022\016" + "\n\006config\030\002 \001(\t\022$\n\tdevice_id\030\003 \001(\0132\021.cont" + "ext.DeviceId\"C\n\021OpticalConfigList\022.\n\016opt" + "icalconfigs\030\001 \003(\0132\026.context.OpticalConfi" + "g\"g\n\022OpticalConfigEvent\022\035\n\005event\030\001 \001(\0132\016" + ".context.Event\0222\n\020opticalconfig_id\030\002 \001(\013" + "2\030.context.OpticalConfigId\"_\n\021OpticalEnd" + "PointId\022$\n\tdevice_id\030\002 \001(\0132\021.context.Dev" + "iceId\022$\n\rendpoint_uuid\030\003 \001(\0132\r.context.U" + "uid\">\n\017OpticalLinkList\022+\n\roptical_links\030" + "\001 \003(\0132\024.context.OpticalLink\"\304\003\n\022OpticalL" + "inkDetails\022\016\n\006length\030\001 \001(\002\022\020\n\010src_port\030\002" + " \001(\t\022\020\n\010dst_port\030\003 \001(\t\022\027\n\017local_peer_por" + "t\030\004 \001(\t\022\030\n\020remote_peer_port\030\005 \001(\t\022\014\n\004use" + "d\030\006 \001(\010\0228\n\007c_slots\030\007 \003(\0132\'.context.Optic" + "alLinkDetails.CSlotsEntry\0228\n\007l_slots\030\010 \003" + "(\0132\'.context.OpticalLinkDetails.LSlotsEn" + "try\0228\n\007s_slots\030\t \003(\0132\'.context.OpticalLi" + "nkDetails.SSlotsEntry\032-\n\013CSlotsEntry\022\013\n\003" + "key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\0028\001\032-\n\013LSlotsEn" + "try\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\0028\001\032-\n\013S" + "SlotsEntry\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\002" + "8\001\"\243\001\n\013OpticalLink\022\014\n\004name\030\001 \001(\t\0224\n\017opti" + "cal_details\030\002 \001(\0132\033.context.OpticalLinkD" + "etails\022 \n\007link_id\030\003 \001(\0132\017.context.LinkId" + "\022.\n\021link_endpoint_ids\030\004 \003(\0132\023.context.En" + "dPointId\"0\n\tChannelId\022#\n\014channel_uuid\030\001 " + "\001(\0132\r.context.Uuid\"8\n\rOpticalBandId\022\'\n\020o" + "pticalband_uuid\030\001 \001(\0132\r.context.Uuid\"\247\002\n" + "\013OpticalBand\022.\n\016opticalband_id\030\001 \001(\0132\026.c" + "ontext.OpticalBandId\022,\n\rconnection_id\030\002 " + "\001(\0132\025.context.ConnectionId\022&\n\nchannel_id" + "\030\003 \001(\0132\022.context.ChannelId\022&\n\nservice_id" + "\030\004 \001(\0132\022.context.ServiceId\022#\n\007service\030\005 " + "\001(\0132\020.context.ServiceH\000\022)\n\nconnection\030\006 " + "\001(\0132\023.context.ConnectionH\000\022\021\n\007channel\030\007 " + "\001(\tH\000B\007\n\005field\"=\n\017OpticalBandList\022*\n\014opt" + "icalbands\030\001 \003(\0132\024.context.OpticalBand\"r\n" + "\021ServiceConfigRule\022&\n\nservice_id\030\001 \001(\0132\022" + ".context.ServiceId\0225\n\021configrule_custom\030" + "\002 \001(\0132\032.context.ConfigRule_Custom*j\n\rEve" + "ntTypeEnum\022\027\n\023EVENTTYPE_UNDEFINED\020\000\022\024\n\020E" + "VENTTYPE_CREATE\020\001\022\024\n\020EVENTTYPE_UPDATE\020\002\022" + "\024\n\020EVENTTYPE_REMOVE\020\003*\333\004\n\020DeviceDriverEn" + "um\022\032\n\026DEVICEDRIVER_UNDEFINED\020\000\022\033\n\027DEVICE" + "DRIVER_OPENCONFIG\020\001\022\036\n\032DEVICEDRIVER_TRAN" + "SPORT_API\020\002\022\023\n\017DEVICEDRIVER_P4\020\003\022&\n\"DEVI" + "CEDRIVER_IETF_NETWORK_TOPOLOGY\020\004\022\033\n\027DEVI" + "CEDRIVER_ONF_TR_532\020\005\022\023\n\017DEVICEDRIVER_XR" + "\020\006\022\033\n\027DEVICEDRIVER_IETF_L2VPN\020\007\022 \n\034DEVIC" + "EDRIVER_GNMI_OPENCONFIG\020\010\022\034\n\030DEVICEDRIVE" + "R_OPTICAL_TFS\020\t\022\032\n\026DEVICEDRIVER_IETF_ACT" + "N\020\n\022\023\n\017DEVICEDRIVER_OC\020\013\022\024\n\020DEVICEDRIVER" + "_QKD\020\014\022\033\n\027DEVICEDRIVER_IETF_L3VPN\020\r\022\033\n\027D" + "EVICEDRIVER_IETF_SLICE\020\016\022\024\n\020DEVICEDRIVER" + "_NCE\020\017\022\031\n\025DEVICEDRIVER_SMARTNIC\020\020\022\031\n\025DEV" + "ICEDRIVER_MORPHEUS\020\021\022\024\n\020DEVICEDRIVER_RYU" + "\020\022\022#\n\037DEVICEDRIVER_GNMI_NOKIA_SRLINUX\020\023\022" + "\032\n\026DEVICEDRIVER_OPENROADM\020\024*\217\001\n\033DeviceOp" + "erationalStatusEnum\022%\n!DEVICEOPERATIONAL" + "STATUS_UNDEFINED\020\000\022$\n DEVICEOPERATIONALS" + "TATUS_DISABLED\020\001\022#\n\037DEVICEOPERATIONALSTA" + "TUS_ENABLED\020\002*\245\001\n\014LinkTypeEnum\022\024\n\020LINKTY" + "PE_UNKNOWN\020\000\022\023\n\017LINKTYPE_COPPER\020\001\022\022\n\016LIN" + "KTYPE_FIBER\020\002\022\022\n\016LINKTYPE_RADIO\020\003\022\024\n\020LIN" + "KTYPE_VIRTUAL\020\004\022\027\n\023LINKTYPE_MANAGEMENT\020\005" + "\022\023\n\017LINKTYPE_REMOTE\020\006*\360\002\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\022\023\n\017SERV" + "ICETYPE_QKD\020\007\022\024\n\020SERVICETYPE_L1NM\020\010\022\023\n\017S" + "ERVICETYPE_INT\020\t\022\023\n\017SERVICETYPE_ACL\020\n\022\027\n" + "\023SERVICETYPE_IP_LINK\020\013\022\030\n\024SERVICETYPE_TA" + "PI_LSP\020\014\022\026\n\022SERVICETYPE_IPOWDM\020\r*\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*\\\n\020AclDirectionEnum\022\025" + "\n\021ACLDIRECTION_BOTH\020\000\022\030\n\024ACLDIRECTION_IN" + "GRESS\020\001\022\027\n\023ACLDIRECTION_EGRESS\020\002*m\n\024Cons" + "traintActionEnum\022\036\n\032CONSTRAINTACTION_UND" + "EFINED\020\000\022\030\n\024CONSTRAINTACTION_SET\020\001\022\033\n\027CO" + "NSTRAINTACTION_DELETE\020\002*\203\002\n\022IsolationLev" + "elEnum\022\020\n\014NO_ISOLATION\020\000\022\026\n\022PHYSICAL_ISO" + "LATION\020\001\022\025\n\021LOGICAL_ISOLATION\020\002\022\025\n\021PROCE" + "SS_ISOLATION\020\003\022\035\n\031PHYSICAL_MEMORY_ISOLAT" + "ION\020\004\022\036\n\032PHYSICAL_NETWORK_ISOLATION\020\005\022\036\n" + "\032VIRTUAL_RESOURCE_ISOLATION\020\006\022\037\n\033NETWORK" + "_FUNCTIONS_ISOLATION\020\007\022\025\n\021SERVICE_ISOLAT" + "ION\020\0102\274\035\n\016ContextService\022:\n\016ListContextI" + "ds\022\016.context.Empty\032\026.context.ContextIdLi" + "st\"\000\0226\n\014ListContexts\022\016.context.Empty\032\024.c" + "ontext.ContextList\"\000\0224\n\nGetContext\022\022.con" + "text.ContextId\032\020.context.Context\"\000\0224\n\nSe" + "tContext\022\020.context.Context\032\022.context.Con" + "textId\"\000\0225\n\rRemoveContext\022\022.context.Cont" + "extId\032\016.context.Empty\"\000\022=\n\020GetContextEve" + "nts\022\016.context.Empty\032\025.context.ContextEve" + "nt\"\0000\001\022@\n\017ListTopologyIds\022\022.context.Cont" + "extId\032\027.context.TopologyIdList\"\000\022=\n\016List" + "Topologies\022\022.context.ContextId\032\025.context" + ".TopologyList\"\000\0227\n\013GetTopology\022\023.context" + ".TopologyId\032\021.context.Topology\"\000\022E\n\022GetT" + "opologyDetails\022\023.context.TopologyId\032\030.co" + "ntext.TopologyDetails\"\000\0227\n\013SetTopology\022\021" + ".context.Topology\032\023.context.TopologyId\"\000" + "\0227\n\016RemoveTopology\022\023.context.TopologyId\032" + "\016.context.Empty\"\000\022?\n\021GetTopologyEvents\022\016" + ".context.Empty\032\026.context.TopologyEvent\"\000" + "0\001\0228\n\rListDeviceIds\022\016.context.Empty\032\025.co" + "ntext.DeviceIdList\"\000\0224\n\013ListDevices\022\016.co" + "ntext.Empty\032\023.context.DeviceList\"\000\0221\n\tGe" + "tDevice\022\021.context.DeviceId\032\017.context.Dev" + "ice\"\000\0221\n\tSetDevice\022\017.context.Device\032\021.co" + "ntext.DeviceId\"\000\0223\n\014RemoveDevice\022\021.conte" + "xt.DeviceId\032\016.context.Empty\"\000\022;\n\017GetDevi" + "ceEvents\022\016.context.Empty\032\024.context.Devic" + "eEvent\"\0000\001\022<\n\014SelectDevice\022\025.context.Dev" + "iceFilter\032\023.context.DeviceList\"\000\022I\n\021List" + "EndPointNames\022\027.context.EndPointIdList\032\031" + ".context.EndPointNameList\"\000\0224\n\013ListLinkI" + "ds\022\016.context.Empty\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.Li" + "nk\032\017.context.LinkId\"\000\022/\n\nRemoveLink\022\017.co" + "ntext.LinkId\032\016.context.Empty\"\000\0227\n\rGetLin" + "kEvents\022\016.context.Empty\032\022.context.LinkEv" + "ent\"\0000\001\022>\n\016ListServiceIds\022\022.context.Cont" + "extId\032\026.context.ServiceIdList\"\000\022:\n\014ListS" + "ervices\022\022.context.ContextId\032\024.context.Se" + "rviceList\"\000\0224\n\nGetService\022\022.context.Serv" + "iceId\032\020.context.Service\"\000\0224\n\nSetService\022" + "\020.context.Service\032\022.context.ServiceId\"\000\022" + "6\n\014UnsetService\022\020.context.Service\032\022.cont" + "ext.ServiceId\"\000\0225\n\rRemoveService\022\022.conte" + "xt.ServiceId\032\016.context.Empty\"\000\022=\n\020GetSer" + "viceEvents\022\016.context.Empty\032\025.context.Ser", "viceEvent\"\0000\001\022?\n\rSelectService\022\026.context" + ".ServiceFilter\032\024.context.ServiceList\"\000\022:" + "\n\014ListSliceIds\022\022.context.ContextId\032\024.con" + "text.SliceIdList\"\000\0226\n\nListSlices\022\022.conte" + "xt.ContextId\032\022.context.SliceList\"\000\022.\n\010Ge" + "tSlice\022\020.context.SliceId\032\016.context.Slice" + "\"\000\022.\n\010SetSlice\022\016.context.Slice\032\020.context" + ".SliceId\"\000\0220\n\nUnsetSlice\022\016.context.Slice" + "\032\020.context.SliceId\"\000\0221\n\013RemoveSlice\022\020.co" + "ntext.SliceId\032\016.context.Empty\"\000\0229\n\016GetSl" + "iceEvents\022\016.context.Empty\032\023.context.Slic" + "eEvent\"\0000\001\0229\n\013SelectSlice\022\024.context.Slic" + "eFilter\032\022.context.SliceList\"\000\022D\n\021ListCon" + "nectionIds\022\022.context.ServiceId\032\031.context" + ".ConnectionIdList\"\000\022@\n\017ListConnections\022\022" + ".context.ServiceId\032\027.context.ConnectionL" + "ist\"\000\022=\n\rGetConnection\022\025.context.Connect" + "ionId\032\023.context.Connection\"\000\022=\n\rSetConne" + "ction\022\023.context.Connection\032\025.context.Con" + "nectionId\"\000\022;\n\020RemoveConnection\022\025.contex" + "t.ConnectionId\032\016.context.Empty\"\000\022C\n\023GetC" + "onnectionEvents\022\016.context.Empty\032\030.contex" + "t.ConnectionEvent\"\0000\001\0225\n\014GetAllEvents\022\016." + "context.Empty\032\021.context.AnyEvent\"\0000\001\022@\n\020" + "GetOpticalConfig\022\016.context.Empty\032\032.conte" + "xt.OpticalConfigList\"\000\022F\n\020SetOpticalConf" + "ig\022\026.context.OpticalConfig\032\030.context.Opt" + "icalConfigId\"\000\022I\n\023UpdateOpticalConfig\022\026." + "context.OpticalConfig\032\030.context.OpticalC" + "onfigId\"\000\022I\n\023SelectOpticalConfig\022\030.conte" + "xt.OpticalConfigId\032\026.context.OpticalConf" + "ig\"\000\022A\n\023DeleteOpticalConfig\022\030.context.Op" + "ticalConfigId\032\016.context.Empty\"\000\022@\n\024Delet" + "eOpticalChannel\022\026.context.OpticalConfig\032" + "\016.context.Empty\"\000\0228\n\016SetOpticalLink\022\024.co" + "ntext.OpticalLink\032\016.context.Empty\"\000\0229\n\016G" + "etOpticalLink\022\017.context.LinkId\032\024.context" + ".OpticalLink\"\000\0226\n\021DeleteOpticalLink\022\017.co" + "ntext.LinkId\032\016.context.Empty\"\000\022@\n\022GetOpt" + "icalLinkList\022\016.context.Empty\032\030.context.O" + "pticalLinkList\"\000\022<\n\016GetOpticalBand\022\016.con" + "text.Empty\032\030.context.OpticalBandList\"\000\022C" + "\n\021SelectOpticalBand\022\026.context.OpticalBan" + "dId\032\024.context.OpticalBand\"\000\022G\n\027DeleteSer" + "viceConfigRule\022\032.context.ServiceConfigRu" + "le\032\016.context.Empty\"\000b\006proto3" };
         descriptor = com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] { com.google.protobuf.AnyProto.getDescriptor(), acl.Acl.getDescriptor(), ipowdm.Ipowdm.getDescriptor(), ip_link.IpLink.getDescriptor(), kpi_sample_types.KpiSampleTypes.getDescriptor(), tapi_lsp.TapiLsp.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[] {});
@@ -90461,7 +90503,7 @@ public final class ContextOuterClass {
         internal_static_context_ConfigRule_Custom_descriptor = getDescriptor().getMessageTypes().get(62);
         internal_static_context_ConfigRule_Custom_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_ConfigRule_Custom_descriptor, new java.lang.String[] { "ResourceKey", "ResourceValue" });
         internal_static_context_ConfigRule_ACL_descriptor = getDescriptor().getMessageTypes().get(63);
-        internal_static_context_ConfigRule_ACL_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_ConfigRule_ACL_descriptor, new java.lang.String[] { "EndpointId", "RuleSet" });
+        internal_static_context_ConfigRule_ACL_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_ConfigRule_ACL_descriptor, new java.lang.String[] { "EndpointId", "Direction", "RuleSet" });
         internal_static_context_ConfigRule_IPOWDM_descriptor = getDescriptor().getMessageTypes().get(64);
         internal_static_context_ConfigRule_IPOWDM_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(internal_static_context_ConfigRule_IPOWDM_descriptor, new java.lang.String[] { "EndpointId", "RuleSet" });
         internal_static_context_ConfigRule_TAPI_LSP_descriptor = getDescriptor().getMessageTypes().get(65);
diff --git a/src/ztp/target/generated-sources/grpc/device/Device.java b/src/ztp/target/generated-sources/grpc/device/Device.java
index 2390aa92d..87c434732 100644
--- a/src/ztp/target/generated-sources/grpc/device/Device.java
+++ b/src/ztp/target/generated-sources/grpc/device/Device.java
@@ -14,8 +14,8 @@ public final class Device {
         registerAllExtensions((com.google.protobuf.ExtensionRegistryLite) registry);
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:device.MonitoringSettings)
-    MonitoringSettingsOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface MonitoringSettingsOrBuilder extends // @@protoc_insertion_point(interface_extends:device.MonitoringSettings)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * 
@@ -91,9 +91,8 @@ public final class Device {
     /**
      * Protobuf type {@code device.MonitoringSettings}
      */
-    public static final class // @@protoc_insertion_point(message_implements:device.MonitoringSettings)
-    // @@protoc_insertion_point(message_implements:device.MonitoringSettings)
-    MonitoringSettings extends com.google.protobuf.GeneratedMessageV3 implements MonitoringSettingsOrBuilder {
+    public static final class MonitoringSettings extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:device.MonitoringSettings)
+    MonitoringSettingsOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -412,9 +411,8 @@ public final class Device {
         /**
          * Protobuf type {@code device.MonitoringSettings}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:device.MonitoringSettings)
-        // @@protoc_insertion_point(builder_implements:device.MonitoringSettings)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements device.Device.MonitoringSettingsOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:device.MonitoringSettings)
+        device.Device.MonitoringSettingsOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return device.Device.internal_static_device_MonitoringSettings_descriptor;
diff --git a/src/ztp/target/generated-sources/grpc/ip_link/IpLink.java b/src/ztp/target/generated-sources/grpc/ip_link/IpLink.java
index 6b89ffcef..865a27401 100644
--- a/src/ztp/target/generated-sources/grpc/ip_link/IpLink.java
+++ b/src/ztp/target/generated-sources/grpc/ip_link/IpLink.java
@@ -14,8 +14,8 @@ public final class IpLink {
         registerAllExtensions((com.google.protobuf.ExtensionRegistryLite) registry);
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:ip_link.IpLinkRuleSet)
-    IpLinkRuleSetOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface IpLinkRuleSetOrBuilder extends // @@protoc_insertion_point(interface_extends:ip_link.IpLinkRuleSet)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * string ip = 1;
@@ -57,9 +57,8 @@ public final class IpLink {
     /**
      * Protobuf type {@code ip_link.IpLinkRuleSet}
      */
-    public static final class // @@protoc_insertion_point(message_implements:ip_link.IpLinkRuleSet)
-    // @@protoc_insertion_point(message_implements:ip_link.IpLinkRuleSet)
-    IpLinkRuleSet extends com.google.protobuf.GeneratedMessageV3 implements IpLinkRuleSetOrBuilder {
+    public static final class IpLinkRuleSet extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:ip_link.IpLinkRuleSet)
+    IpLinkRuleSetOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -363,9 +362,8 @@ public final class IpLink {
         /**
          * Protobuf type {@code ip_link.IpLinkRuleSet}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:ip_link.IpLinkRuleSet)
-        // @@protoc_insertion_point(builder_implements:ip_link.IpLinkRuleSet)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements ip_link.IpLink.IpLinkRuleSetOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:ip_link.IpLinkRuleSet)
+        ip_link.IpLink.IpLinkRuleSetOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return ip_link.IpLink.internal_static_ip_link_IpLinkRuleSet_descriptor;
diff --git a/src/ztp/target/generated-sources/grpc/monitoring/Monitoring.java b/src/ztp/target/generated-sources/grpc/monitoring/Monitoring.java
index ddd75a0db..8394fe275 100644
--- a/src/ztp/target/generated-sources/grpc/monitoring/Monitoring.java
+++ b/src/ztp/target/generated-sources/grpc/monitoring/Monitoring.java
@@ -14,8 +14,8 @@ public final class Monitoring {
         registerAllExtensions((com.google.protobuf.ExtensionRegistryLite) registry);
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.KpiDescriptor)
-    KpiDescriptorOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface KpiDescriptorOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.KpiDescriptor)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.KpiId kpi_id = 1;
@@ -189,9 +189,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.KpiDescriptor}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.KpiDescriptor)
-    // @@protoc_insertion_point(message_implements:monitoring.KpiDescriptor)
-    KpiDescriptor extends com.google.protobuf.GeneratedMessageV3 implements KpiDescriptorOrBuilder {
+    public static final class KpiDescriptor extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.KpiDescriptor)
+    KpiDescriptorOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -811,9 +810,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.KpiDescriptor}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.KpiDescriptor)
-        // @@protoc_insertion_point(builder_implements:monitoring.KpiDescriptor)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.KpiDescriptorOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.KpiDescriptor)
+        monitoring.Monitoring.KpiDescriptorOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_KpiDescriptor_descriptor;
@@ -2396,8 +2394,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.MonitorKpiRequest)
-    MonitorKpiRequestOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface MonitorKpiRequestOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.MonitorKpiRequest)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.KpiId kpi_id = 1;
@@ -2436,9 +2434,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.MonitorKpiRequest}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.MonitorKpiRequest)
-    // @@protoc_insertion_point(message_implements:monitoring.MonitorKpiRequest)
-    MonitorKpiRequest extends com.google.protobuf.GeneratedMessageV3 implements MonitorKpiRequestOrBuilder {
+    public static final class MonitorKpiRequest extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.MonitorKpiRequest)
+    MonitorKpiRequestOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -2691,9 +2688,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.MonitorKpiRequest}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.MonitorKpiRequest)
-        // @@protoc_insertion_point(builder_implements:monitoring.MonitorKpiRequest)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.MonitorKpiRequestOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.MonitorKpiRequest)
+        monitoring.Monitoring.MonitorKpiRequestOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_MonitorKpiRequest_descriptor;
@@ -3111,8 +3107,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.KpiQuery)
-    KpiQueryOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface KpiQueryOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.KpiQuery)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .monitoring.KpiId kpi_ids = 1;
@@ -3217,9 +3213,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.KpiQuery}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.KpiQuery)
-    // @@protoc_insertion_point(message_implements:monitoring.KpiQuery)
-    KpiQuery extends com.google.protobuf.GeneratedMessageV3 implements KpiQueryOrBuilder {
+    public static final class KpiQuery extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.KpiQuery)
+    KpiQueryOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -3600,9 +3595,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.KpiQuery}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.KpiQuery)
-        // @@protoc_insertion_point(builder_implements:monitoring.KpiQuery)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.KpiQueryOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.KpiQuery)
+        monitoring.Monitoring.KpiQueryOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_KpiQuery_descriptor;
@@ -4521,8 +4515,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.RawKpi)
-    RawKpiOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface RawKpiOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.RawKpi)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Timestamp timestamp = 1;
@@ -4566,9 +4560,8 @@ public final class Monitoring {
      *
      * Protobuf type {@code monitoring.RawKpi}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.RawKpi)
-    // @@protoc_insertion_point(message_implements:monitoring.RawKpi)
-    RawKpi extends com.google.protobuf.GeneratedMessageV3 implements RawKpiOrBuilder {
+    public static final class RawKpi extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.RawKpi)
+    RawKpiOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -4821,9 +4814,8 @@ public final class Monitoring {
          *
          * Protobuf type {@code monitoring.RawKpi}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.RawKpi)
-        // @@protoc_insertion_point(builder_implements:monitoring.RawKpi)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.RawKpiOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.RawKpi)
+        monitoring.Monitoring.RawKpiOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_RawKpi_descriptor;
@@ -5269,8 +5261,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.RawKpiList)
-    RawKpiListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface RawKpiListOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.RawKpiList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.KpiId kpi_id = 1;
@@ -5322,9 +5314,8 @@ public final class Monitoring {
      *
      * Protobuf type {@code monitoring.RawKpiList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.RawKpiList)
-    // @@protoc_insertion_point(message_implements:monitoring.RawKpiList)
-    RawKpiList extends com.google.protobuf.GeneratedMessageV3 implements RawKpiListOrBuilder {
+    public static final class RawKpiList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.RawKpiList)
+    RawKpiListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -5589,9 +5580,8 @@ public final class Monitoring {
          *
          * Protobuf type {@code monitoring.RawKpiList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.RawKpiList)
-        // @@protoc_insertion_point(builder_implements:monitoring.RawKpiList)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.RawKpiListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.RawKpiList)
+        monitoring.Monitoring.RawKpiListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_RawKpiList_descriptor;
@@ -6194,8 +6184,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.RawKpiTable)
-    RawKpiTableOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface RawKpiTableOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.RawKpiTable)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .monitoring.RawKpiList raw_kpi_lists = 1;
@@ -6230,9 +6220,8 @@ public final class Monitoring {
      *
      * Protobuf type {@code monitoring.RawKpiTable}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.RawKpiTable)
-    // @@protoc_insertion_point(message_implements:monitoring.RawKpiTable)
-    RawKpiTable extends com.google.protobuf.GeneratedMessageV3 implements RawKpiTableOrBuilder {
+    public static final class RawKpiTable extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.RawKpiTable)
+    RawKpiTableOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -6451,9 +6440,8 @@ public final class Monitoring {
          *
          * Protobuf type {@code monitoring.RawKpiTable}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.RawKpiTable)
-        // @@protoc_insertion_point(builder_implements:monitoring.RawKpiTable)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.RawKpiTableOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.RawKpiTable)
+        monitoring.Monitoring.RawKpiTableOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_RawKpiTable_descriptor;
@@ -6920,8 +6908,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.KpiId)
-    KpiIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface KpiIdOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.KpiId)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid kpi_id = 1;
@@ -6944,9 +6932,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.KpiId}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.KpiId)
-    // @@protoc_insertion_point(message_implements:monitoring.KpiId)
-    KpiId extends com.google.protobuf.GeneratedMessageV3 implements KpiIdOrBuilder {
+    public static final class KpiId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.KpiId)
+    KpiIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -7149,9 +7136,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.KpiId}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.KpiId)
-        // @@protoc_insertion_point(builder_implements:monitoring.KpiId)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.KpiIdOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.KpiId)
+        monitoring.Monitoring.KpiIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_KpiId_descriptor;
@@ -7461,8 +7447,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.Kpi)
-    KpiOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface KpiOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.Kpi)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.KpiId kpi_id = 1;
@@ -7519,9 +7505,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.Kpi}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.Kpi)
-    // @@protoc_insertion_point(message_implements:monitoring.Kpi)
-    Kpi extends com.google.protobuf.GeneratedMessageV3 implements KpiOrBuilder {
+    public static final class Kpi extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.Kpi)
+    KpiOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -7816,9 +7801,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.Kpi}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.Kpi)
-        // @@protoc_insertion_point(builder_implements:monitoring.Kpi)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.KpiOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.Kpi)
+        monitoring.Monitoring.KpiOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_Kpi_descriptor;
@@ -8400,8 +8384,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.KpiValueRange)
-    KpiValueRangeOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface KpiValueRangeOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.KpiValueRange)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.KpiValue kpiMinValue = 1;
@@ -8471,9 +8455,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.KpiValueRange}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.KpiValueRange)
-    // @@protoc_insertion_point(message_implements:monitoring.KpiValueRange)
-    KpiValueRange extends com.google.protobuf.GeneratedMessageV3 implements KpiValueRangeOrBuilder {
+    public static final class KpiValueRange extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.KpiValueRange)
+    KpiValueRangeOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -8803,9 +8786,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.KpiValueRange}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.KpiValueRange)
-        // @@protoc_insertion_point(builder_implements:monitoring.KpiValueRange)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.KpiValueRangeOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.KpiValueRange)
+        monitoring.Monitoring.KpiValueRangeOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_KpiValueRange_descriptor;
@@ -9431,8 +9413,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.KpiValue)
-    KpiValueOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface KpiValueOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.KpiValue)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * int32 int32Val = 1;
@@ -9530,9 +9512,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.KpiValue}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.KpiValue)
-    // @@protoc_insertion_point(message_implements:monitoring.KpiValue)
-    KpiValue extends com.google.protobuf.GeneratedMessageV3 implements KpiValueOrBuilder {
+    public static final class KpiValue extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.KpiValue)
+    KpiValueOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -10050,9 +10031,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.KpiValue}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.KpiValue)
-        // @@protoc_insertion_point(builder_implements:monitoring.KpiValue)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.KpiValueOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.KpiValue)
+        monitoring.Monitoring.KpiValueOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_KpiValue_descriptor;
@@ -10702,8 +10682,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.KpiList)
-    KpiListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface KpiListOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.KpiList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .monitoring.Kpi kpi = 1;
@@ -10734,9 +10714,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.KpiList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.KpiList)
-    // @@protoc_insertion_point(message_implements:monitoring.KpiList)
-    KpiList extends com.google.protobuf.GeneratedMessageV3 implements KpiListOrBuilder {
+    public static final class KpiList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.KpiList)
+    KpiListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -10951,9 +10930,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.KpiList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.KpiList)
-        // @@protoc_insertion_point(builder_implements:monitoring.KpiList)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.KpiListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.KpiList)
+        monitoring.Monitoring.KpiListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_KpiList_descriptor;
@@ -11420,8 +11398,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.KpiDescriptorList)
-    KpiDescriptorListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface KpiDescriptorListOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.KpiDescriptorList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .monitoring.KpiDescriptor kpi_descriptor_list = 1;
@@ -11452,9 +11430,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.KpiDescriptorList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.KpiDescriptorList)
-    // @@protoc_insertion_point(message_implements:monitoring.KpiDescriptorList)
-    KpiDescriptorList extends com.google.protobuf.GeneratedMessageV3 implements KpiDescriptorListOrBuilder {
+    public static final class KpiDescriptorList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.KpiDescriptorList)
+    KpiDescriptorListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -11669,9 +11646,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.KpiDescriptorList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.KpiDescriptorList)
-        // @@protoc_insertion_point(builder_implements:monitoring.KpiDescriptorList)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.KpiDescriptorListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.KpiDescriptorList)
+        monitoring.Monitoring.KpiDescriptorListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_KpiDescriptorList_descriptor;
@@ -12138,8 +12114,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.SubsDescriptor)
-    SubsDescriptorOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface SubsDescriptorOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.SubsDescriptor)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.SubscriptionID subs_id = 1;
@@ -12249,9 +12225,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.SubsDescriptor}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.SubsDescriptor)
-    // @@protoc_insertion_point(message_implements:monitoring.SubsDescriptor)
-    SubsDescriptor extends com.google.protobuf.GeneratedMessageV3 implements SubsDescriptorOrBuilder {
+    public static final class SubsDescriptor extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.SubsDescriptor)
+    SubsDescriptorOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -12662,9 +12637,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.SubsDescriptor}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.SubsDescriptor)
-        // @@protoc_insertion_point(builder_implements:monitoring.SubsDescriptor)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.SubsDescriptorOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.SubsDescriptor)
+        monitoring.Monitoring.SubsDescriptorOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_SubsDescriptor_descriptor;
@@ -13550,8 +13524,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.SubscriptionID)
-    SubscriptionIDOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface SubscriptionIDOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.SubscriptionID)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid subs_id = 1;
@@ -13574,9 +13548,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.SubscriptionID}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.SubscriptionID)
-    // @@protoc_insertion_point(message_implements:monitoring.SubscriptionID)
-    SubscriptionID extends com.google.protobuf.GeneratedMessageV3 implements SubscriptionIDOrBuilder {
+    public static final class SubscriptionID extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.SubscriptionID)
+    SubscriptionIDOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -13779,9 +13752,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.SubscriptionID}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.SubscriptionID)
-        // @@protoc_insertion_point(builder_implements:monitoring.SubscriptionID)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.SubscriptionIDOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.SubscriptionID)
+        monitoring.Monitoring.SubscriptionIDOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_SubscriptionID_descriptor;
@@ -14091,8 +14063,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.SubsResponse)
-    SubsResponseOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface SubsResponseOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.SubsResponse)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.SubscriptionID subs_id = 1;
@@ -14132,9 +14104,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.SubsResponse}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.SubsResponse)
-    // @@protoc_insertion_point(message_implements:monitoring.SubsResponse)
-    SubsResponse extends com.google.protobuf.GeneratedMessageV3 implements SubsResponseOrBuilder {
+    public static final class SubsResponse extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.SubsResponse)
+    SubsResponseOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -14383,9 +14354,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.SubsResponse}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.SubsResponse)
-        // @@protoc_insertion_point(builder_implements:monitoring.SubsResponse)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.SubsResponseOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.SubsResponse)
+        monitoring.Monitoring.SubsResponseOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_SubsResponse_descriptor;
@@ -14831,8 +14801,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.SubsList)
-    SubsListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface SubsListOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.SubsList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .monitoring.SubsDescriptor subs_descriptor = 1;
@@ -14863,9 +14833,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.SubsList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.SubsList)
-    // @@protoc_insertion_point(message_implements:monitoring.SubsList)
-    SubsList extends com.google.protobuf.GeneratedMessageV3 implements SubsListOrBuilder {
+    public static final class SubsList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.SubsList)
+    SubsListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -15080,9 +15049,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.SubsList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.SubsList)
-        // @@protoc_insertion_point(builder_implements:monitoring.SubsList)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.SubsListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.SubsList)
+        monitoring.Monitoring.SubsListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_SubsList_descriptor;
@@ -15549,8 +15517,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.AlarmDescriptor)
-    AlarmDescriptorOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface AlarmDescriptorOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.AlarmDescriptor)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.AlarmID alarm_id = 1;
@@ -15648,9 +15616,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.AlarmDescriptor}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.AlarmDescriptor)
-    // @@protoc_insertion_point(message_implements:monitoring.AlarmDescriptor)
-    AlarmDescriptor extends com.google.protobuf.GeneratedMessageV3 implements AlarmDescriptorOrBuilder {
+    public static final class AlarmDescriptor extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.AlarmDescriptor)
+    AlarmDescriptorOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -16089,9 +16056,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.AlarmDescriptor}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.AlarmDescriptor)
-        // @@protoc_insertion_point(builder_implements:monitoring.AlarmDescriptor)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.AlarmDescriptorOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.AlarmDescriptor)
+        monitoring.Monitoring.AlarmDescriptorOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_AlarmDescriptor_descriptor;
@@ -16991,8 +16957,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.AlarmID)
-    AlarmIDOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface AlarmIDOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.AlarmID)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid alarm_id = 1;
@@ -17015,9 +16981,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.AlarmID}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.AlarmID)
-    // @@protoc_insertion_point(message_implements:monitoring.AlarmID)
-    AlarmID extends com.google.protobuf.GeneratedMessageV3 implements AlarmIDOrBuilder {
+    public static final class AlarmID extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.AlarmID)
+    AlarmIDOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -17220,9 +17185,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.AlarmID}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.AlarmID)
-        // @@protoc_insertion_point(builder_implements:monitoring.AlarmID)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.AlarmIDOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.AlarmID)
+        monitoring.Monitoring.AlarmIDOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_AlarmID_descriptor;
@@ -17532,8 +17496,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.AlarmSubscription)
-    AlarmSubscriptionOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface AlarmSubscriptionOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.AlarmSubscription)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.AlarmID alarm_id = 1;
@@ -17568,9 +17532,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.AlarmSubscription}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.AlarmSubscription)
-    // @@protoc_insertion_point(message_implements:monitoring.AlarmSubscription)
-    AlarmSubscription extends com.google.protobuf.GeneratedMessageV3 implements AlarmSubscriptionOrBuilder {
+    public static final class AlarmSubscription extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.AlarmSubscription)
+    AlarmSubscriptionOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -17819,9 +17782,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.AlarmSubscription}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.AlarmSubscription)
-        // @@protoc_insertion_point(builder_implements:monitoring.AlarmSubscription)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.AlarmSubscriptionOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.AlarmSubscription)
+        monitoring.Monitoring.AlarmSubscriptionOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_AlarmSubscription_descriptor;
@@ -18227,8 +18189,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.AlarmResponse)
-    AlarmResponseOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface AlarmResponseOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.AlarmResponse)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .monitoring.AlarmID alarm_id = 1;
@@ -18280,9 +18242,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.AlarmResponse}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.AlarmResponse)
-    // @@protoc_insertion_point(message_implements:monitoring.AlarmResponse)
-    AlarmResponse extends com.google.protobuf.GeneratedMessageV3 implements AlarmResponseOrBuilder {
+    public static final class AlarmResponse extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.AlarmResponse)
+    AlarmResponseOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -18580,9 +18541,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.AlarmResponse}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.AlarmResponse)
-        // @@protoc_insertion_point(builder_implements:monitoring.AlarmResponse)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.AlarmResponseOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.AlarmResponse)
+        monitoring.Monitoring.AlarmResponseOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_AlarmResponse_descriptor;
@@ -19119,8 +19079,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.AlarmList)
-    AlarmListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface AlarmListOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.AlarmList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .monitoring.AlarmDescriptor alarm_descriptor = 1;
@@ -19151,9 +19111,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.AlarmList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.AlarmList)
-    // @@protoc_insertion_point(message_implements:monitoring.AlarmList)
-    AlarmList extends com.google.protobuf.GeneratedMessageV3 implements AlarmListOrBuilder {
+    public static final class AlarmList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.AlarmList)
+    AlarmListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -19368,9 +19327,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.AlarmList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.AlarmList)
-        // @@protoc_insertion_point(builder_implements:monitoring.AlarmList)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.AlarmListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.AlarmList)
+        monitoring.Monitoring.AlarmListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_AlarmList_descriptor;
@@ -19837,8 +19795,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.SSEMonitoringSubscriptionConfig)
-    SSEMonitoringSubscriptionConfigOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface SSEMonitoringSubscriptionConfigOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.SSEMonitoringSubscriptionConfig)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.DeviceId device_id = 1;
@@ -19917,9 +19875,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.SSEMonitoringSubscriptionConfig}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.SSEMonitoringSubscriptionConfig)
-    // @@protoc_insertion_point(message_implements:monitoring.SSEMonitoringSubscriptionConfig)
-    SSEMonitoringSubscriptionConfig extends com.google.protobuf.GeneratedMessageV3 implements SSEMonitoringSubscriptionConfigOrBuilder {
+    public static final class SSEMonitoringSubscriptionConfig extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.SSEMonitoringSubscriptionConfig)
+    SSEMonitoringSubscriptionConfigOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -20424,9 +20381,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.SSEMonitoringSubscriptionConfig}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.SSEMonitoringSubscriptionConfig)
-        // @@protoc_insertion_point(builder_implements:monitoring.SSEMonitoringSubscriptionConfig)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.SSEMonitoringSubscriptionConfigOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.SSEMonitoringSubscriptionConfig)
+        monitoring.Monitoring.SSEMonitoringSubscriptionConfigOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_SSEMonitoringSubscriptionConfig_descriptor;
@@ -21102,8 +21058,8 @@ public final class Monitoring {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:monitoring.SSEMonitoringSubscriptionResponse)
-    SSEMonitoringSubscriptionResponseOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface SSEMonitoringSubscriptionResponseOrBuilder extends // @@protoc_insertion_point(interface_extends:monitoring.SSEMonitoringSubscriptionResponse)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * string identifier = 1;
@@ -21133,9 +21089,8 @@ public final class Monitoring {
     /**
      * Protobuf type {@code monitoring.SSEMonitoringSubscriptionResponse}
      */
-    public static final class // @@protoc_insertion_point(message_implements:monitoring.SSEMonitoringSubscriptionResponse)
-    // @@protoc_insertion_point(message_implements:monitoring.SSEMonitoringSubscriptionResponse)
-    SSEMonitoringSubscriptionResponse extends com.google.protobuf.GeneratedMessageV3 implements SSEMonitoringSubscriptionResponseOrBuilder {
+    public static final class SSEMonitoringSubscriptionResponse extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:monitoring.SSEMonitoringSubscriptionResponse)
+    SSEMonitoringSubscriptionResponseOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -21390,9 +21345,8 @@ public final class Monitoring {
         /**
          * Protobuf type {@code monitoring.SSEMonitoringSubscriptionResponse}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:monitoring.SSEMonitoringSubscriptionResponse)
-        // @@protoc_insertion_point(builder_implements:monitoring.SSEMonitoringSubscriptionResponse)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements monitoring.Monitoring.SSEMonitoringSubscriptionResponseOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:monitoring.SSEMonitoringSubscriptionResponse)
+        monitoring.Monitoring.SSEMonitoringSubscriptionResponseOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return monitoring.Monitoring.internal_static_monitoring_SSEMonitoringSubscriptionResponse_descriptor;
diff --git a/src/ztp/target/generated-sources/grpc/ztp/Ztp.java b/src/ztp/target/generated-sources/grpc/ztp/Ztp.java
index 4e1c6ae37..0812fc8eb 100644
--- a/src/ztp/target/generated-sources/grpc/ztp/Ztp.java
+++ b/src/ztp/target/generated-sources/grpc/ztp/Ztp.java
@@ -262,8 +262,8 @@ public final class Ztp {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:ztp.DeviceRoleId)
-    DeviceRoleIdOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface DeviceRoleIdOrBuilder extends // @@protoc_insertion_point(interface_extends:ztp.DeviceRoleId)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .context.Uuid devRoleId = 1;
@@ -303,9 +303,8 @@ public final class Ztp {
     /**
      * Protobuf type {@code ztp.DeviceRoleId}
      */
-    public static final class // @@protoc_insertion_point(message_implements:ztp.DeviceRoleId)
-    // @@protoc_insertion_point(message_implements:ztp.DeviceRoleId)
-    DeviceRoleId extends com.google.protobuf.GeneratedMessageV3 implements DeviceRoleIdOrBuilder {
+    public static final class DeviceRoleId extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:ztp.DeviceRoleId)
+    DeviceRoleIdOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -554,9 +553,8 @@ public final class Ztp {
         /**
          * Protobuf type {@code ztp.DeviceRoleId}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:ztp.DeviceRoleId)
-        // @@protoc_insertion_point(builder_implements:ztp.DeviceRoleId)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements ztp.Ztp.DeviceRoleIdOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:ztp.DeviceRoleId)
+        ztp.Ztp.DeviceRoleIdOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return ztp.Ztp.internal_static_ztp_DeviceRoleId_descriptor;
@@ -1002,8 +1000,8 @@ public final class Ztp {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:ztp.DeviceRole)
-    DeviceRoleOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface DeviceRoleOrBuilder extends // @@protoc_insertion_point(interface_extends:ztp.DeviceRole)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .ztp.DeviceRoleId devRoleId = 1;
@@ -1038,9 +1036,8 @@ public final class Ztp {
     /**
      * Protobuf type {@code ztp.DeviceRole}
      */
-    public static final class // @@protoc_insertion_point(message_implements:ztp.DeviceRole)
-    // @@protoc_insertion_point(message_implements:ztp.DeviceRole)
-    DeviceRole extends com.google.protobuf.GeneratedMessageV3 implements DeviceRoleOrBuilder {
+    public static final class DeviceRole extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:ztp.DeviceRole)
+    DeviceRoleOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -1277,9 +1274,8 @@ public final class Ztp {
         /**
          * Protobuf type {@code ztp.DeviceRole}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:ztp.DeviceRole)
-        // @@protoc_insertion_point(builder_implements:ztp.DeviceRole)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements ztp.Ztp.DeviceRoleOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:ztp.DeviceRole)
+        ztp.Ztp.DeviceRoleOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return ztp.Ztp.internal_static_ztp_DeviceRole_descriptor;
@@ -1662,8 +1658,8 @@ public final class Ztp {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:ztp.DeviceRoleConfig)
-    DeviceRoleConfigOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface DeviceRoleConfigOrBuilder extends // @@protoc_insertion_point(interface_extends:ztp.DeviceRoleConfig)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .ztp.DeviceRole devRole = 1;
@@ -1703,9 +1699,8 @@ public final class Ztp {
     /**
      * Protobuf type {@code ztp.DeviceRoleConfig}
      */
-    public static final class // @@protoc_insertion_point(message_implements:ztp.DeviceRoleConfig)
-    // @@protoc_insertion_point(message_implements:ztp.DeviceRoleConfig)
-    DeviceRoleConfig extends com.google.protobuf.GeneratedMessageV3 implements DeviceRoleConfigOrBuilder {
+    public static final class DeviceRoleConfig extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:ztp.DeviceRoleConfig)
+    DeviceRoleConfigOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -1954,9 +1949,8 @@ public final class Ztp {
         /**
          * Protobuf type {@code ztp.DeviceRoleConfig}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:ztp.DeviceRoleConfig)
-        // @@protoc_insertion_point(builder_implements:ztp.DeviceRoleConfig)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements ztp.Ztp.DeviceRoleConfigOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:ztp.DeviceRoleConfig)
+        ztp.Ztp.DeviceRoleConfigOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return ztp.Ztp.internal_static_ztp_DeviceRoleConfig_descriptor;
@@ -2402,8 +2396,8 @@ public final class Ztp {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:ztp.DeviceRoleList)
-    DeviceRoleListOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface DeviceRoleListOrBuilder extends // @@protoc_insertion_point(interface_extends:ztp.DeviceRoleList)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated .ztp.DeviceRole devRole = 1;
@@ -2434,9 +2428,8 @@ public final class Ztp {
     /**
      * Protobuf type {@code ztp.DeviceRoleList}
      */
-    public static final class // @@protoc_insertion_point(message_implements:ztp.DeviceRoleList)
-    // @@protoc_insertion_point(message_implements:ztp.DeviceRoleList)
-    DeviceRoleList extends com.google.protobuf.GeneratedMessageV3 implements DeviceRoleListOrBuilder {
+    public static final class DeviceRoleList extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:ztp.DeviceRoleList)
+    DeviceRoleListOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -2651,9 +2644,8 @@ public final class Ztp {
         /**
          * Protobuf type {@code ztp.DeviceRoleList}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:ztp.DeviceRoleList)
-        // @@protoc_insertion_point(builder_implements:ztp.DeviceRoleList)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements ztp.Ztp.DeviceRoleListOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:ztp.DeviceRoleList)
+        ztp.Ztp.DeviceRoleListOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return ztp.Ztp.internal_static_ztp_DeviceRoleList_descriptor;
@@ -3120,8 +3112,8 @@ public final class Ztp {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:ztp.DeviceRoleState)
-    DeviceRoleStateOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface DeviceRoleStateOrBuilder extends // @@protoc_insertion_point(interface_extends:ztp.DeviceRoleState)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * .ztp.DeviceRoleId devRoleId = 1;
@@ -3156,9 +3148,8 @@ public final class Ztp {
     /**
      * Protobuf type {@code ztp.DeviceRoleState}
      */
-    public static final class // @@protoc_insertion_point(message_implements:ztp.DeviceRoleState)
-    // @@protoc_insertion_point(message_implements:ztp.DeviceRoleState)
-    DeviceRoleState extends com.google.protobuf.GeneratedMessageV3 implements DeviceRoleStateOrBuilder {
+    public static final class DeviceRoleState extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:ztp.DeviceRoleState)
+    DeviceRoleStateOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -3395,9 +3386,8 @@ public final class Ztp {
         /**
          * Protobuf type {@code ztp.DeviceRoleState}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:ztp.DeviceRoleState)
-        // @@protoc_insertion_point(builder_implements:ztp.DeviceRoleState)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements ztp.Ztp.DeviceRoleStateOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:ztp.DeviceRoleState)
+        ztp.Ztp.DeviceRoleStateOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return ztp.Ztp.internal_static_ztp_DeviceRoleState_descriptor;
@@ -3780,8 +3770,8 @@ public final class Ztp {
         }
     }
 
-    public interface // @@protoc_insertion_point(interface_extends:ztp.DeviceDeletionResult)
-    DeviceDeletionResultOrBuilder extends com.google.protobuf.MessageOrBuilder {
+    public interface DeviceDeletionResultOrBuilder extends // @@protoc_insertion_point(interface_extends:ztp.DeviceDeletionResult)
+    com.google.protobuf.MessageOrBuilder {
 
         /**
          * repeated string deleted = 1;
@@ -3813,9 +3803,8 @@ public final class Ztp {
     /**
      * Protobuf type {@code ztp.DeviceDeletionResult}
      */
-    public static final class // @@protoc_insertion_point(message_implements:ztp.DeviceDeletionResult)
-    // @@protoc_insertion_point(message_implements:ztp.DeviceDeletionResult)
-    DeviceDeletionResult extends com.google.protobuf.GeneratedMessageV3 implements DeviceDeletionResultOrBuilder {
+    public static final class DeviceDeletionResult extends com.google.protobuf.GeneratedMessageV3 implements // @@protoc_insertion_point(message_implements:ztp.DeviceDeletionResult)
+    DeviceDeletionResultOrBuilder {
 
         private static final long serialVersionUID = 0L;
 
@@ -4029,9 +4018,8 @@ public final class Ztp {
         /**
          * Protobuf type {@code ztp.DeviceDeletionResult}
          */
-        public static final class // @@protoc_insertion_point(builder_implements:ztp.DeviceDeletionResult)
-        // @@protoc_insertion_point(builder_implements:ztp.DeviceDeletionResult)
-        Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements ztp.Ztp.DeviceDeletionResultOrBuilder {
+        public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder implements // @@protoc_insertion_point(builder_implements:ztp.DeviceDeletionResult)
+        ztp.Ztp.DeviceDeletionResultOrBuilder {
 
             public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
                 return ztp.Ztp.internal_static_ztp_DeviceDeletionResult_descriptor;
diff --git a/src/ztp/target/kubernetes/kubernetes.yml b/src/ztp/target/kubernetes/kubernetes.yml
index 2d153068e..23494d5c7 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: f6ca78538c88e1affff6dd8908e6f14379f5d9ac
-    app.quarkus.io/build-timestamp: 2025-10-27 - 16:23:04 +0000
+    app.quarkus.io/commit-id: 0539e363a3349889ebd7d3d7b0509744e2a4d0aa
+    app.quarkus.io/build-timestamp: 2025-10-28 - 10:09:20 +0000
     prometheus.io/scrape: "true"
     prometheus.io/path: /q/metrics
     prometheus.io/port: "8080"
@@ -17,18 +17,18 @@ metadata:
   name: ztpservice
 spec:
   ports:
-    - name: grpc
-      port: 5050
+    - name: https
+      port: 443
       protocol: TCP
-      targetPort: 5050
+      targetPort: 8443
     - name: http
       port: 9192
       protocol: TCP
       targetPort: 8080
-    - name: https
-      port: 443
+    - name: grpc
+      port: 5050
       protocol: TCP
-      targetPort: 8443
+      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: f6ca78538c88e1affff6dd8908e6f14379f5d9ac
-    app.quarkus.io/build-timestamp: 2025-10-27 - 16:23:04 +0000
+    app.quarkus.io/commit-id: 0539e363a3349889ebd7d3d7b0509744e2a4d0aa
+    app.quarkus.io/build-timestamp: 2025-10-28 - 10:09:20 +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/name: ztpservice
     app.kubernetes.io/version: 0.2.0
+    app.kubernetes.io/name: ztpservice
   name: ztpservice
 spec:
   replicas: 1
@@ -57,8 +57,8 @@ spec:
   template:
     metadata:
       annotations:
-        app.quarkus.io/commit-id: f6ca78538c88e1affff6dd8908e6f14379f5d9ac
-        app.quarkus.io/build-timestamp: 2025-10-27 - 16:23:04 +0000
+        app.quarkus.io/commit-id: 0539e363a3349889ebd7d3d7b0509744e2a4d0aa
+        app.quarkus.io/build-timestamp: 2025-10-28 - 10:09:20 +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/name: ztpservice
         app.kubernetes.io/version: 0.2.0
+        app.kubernetes.io/name: ztpservice
     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: 5050
-              name: grpc
+            - containerPort: 8443
+              name: https
               protocol: TCP
             - containerPort: 8080
               name: http
               protocol: TCP
-            - containerPort: 8443
-              name: https
+            - containerPort: 5050
+              name: grpc
               protocol: TCP
           readinessProbe:
             failureThreshold: 3
-- 
GitLab


From ab2376f083271002e0c2bc439553208c476c5e50 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 28 Oct 2025 10:37:56 +0000
Subject: [PATCH 031/111] Dockerfiles for images based on Python 3.10:

- Fixed versions of pip, setuptools, wheel, pip-tools, as there is an update on pip>25.2 forcing pep_517
---
 src/osm_client/Dockerfile               | 6 +++---
 src/tests/tools/mock_osm_nbi/Dockerfile | 6 +++---
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/src/osm_client/Dockerfile b/src/osm_client/Dockerfile
index 28ffc7001..9c8e7b6f4 100644
--- a/src/osm_client/Dockerfile
+++ b/src/osm_client/Dockerfile
@@ -31,9 +31,9 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
     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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/tests/tools/mock_osm_nbi/Dockerfile b/src/tests/tools/mock_osm_nbi/Dockerfile
index 57d097166..4264ab46d 100644
--- a/src/tests/tools/mock_osm_nbi/Dockerfile
+++ b/src/tests/tools/mock_osm_nbi/Dockerfile
@@ -18,9 +18,9 @@ FROM python:3.10.16-slim
 ENV PYTHONUNBUFFERED=0
 
 # Get Python dependencies
-RUN python3 -m pip install --upgrade pip
-RUN python3 -m pip install --upgrade setuptools wheel
-RUN python3 -m pip install --upgrade pip-tools
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Create component sub-folders, and get requirements
 RUN mkdir -p /var/mock_osm_nbi
-- 
GitLab


From b0868e725b1745481b4eea0dc3950c9e9b17b415 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Tue, 28 Oct 2025 14:00:32 +0000
Subject: [PATCH 032/111] Refactor test scripts and update frequency handling
 in JSON to Proto conversion

---
 scripts/run_tests_locally-nbi-dscm.sh         |  14 --
 .../dscm_oc/json_to_proto_conversion.py       |   6 +-
 .../rest_server/nbi_plugins/dscm_oc/routes.py |   6 +-
 src/nbi/tests/DSCM_MockWebServer.py           |  52 +----
 src/nbi/tests/messages/dscm_messages.py       |   6 +-
 src/nbi/tests/test_dscm_restconf.py           |  36 +---
 src/nbi/tests/test_json_to_proto.py           | 178 ------------------
 7 files changed, 17 insertions(+), 281 deletions(-)
 delete mode 100644 src/nbi/tests/test_json_to_proto.py

diff --git a/scripts/run_tests_locally-nbi-dscm.sh b/scripts/run_tests_locally-nbi-dscm.sh
index c43f2f171..f8562d0dd 100755
--- a/scripts/run_tests_locally-nbi-dscm.sh
+++ b/scripts/run_tests_locally-nbi-dscm.sh
@@ -17,19 +17,11 @@
 
 PROJECTDIR=`pwd`
 
-# Activate the dscm virtual environment
-source /home/ubuntu/dscm/bin/activate
-
 cd $PROJECTDIR/src
 
-echo "======================================"
-echo "Running NBI DSCM RESTCONF Tests"
-echo "======================================"
-
 # test DSCM NBI functions
 /home/ubuntu/dscm/bin/python -m pytest --log-level=INFO --log-cli-level=INFO --verbose \
     nbi/tests/test_dscm_restconf.py::test_post_get_delete_leaf_optical_channel_frequency
-    # nbi/tests/test_dscm_restconf.py::test_post_hub_optical_channel_frequency \
 
 # # test JSON to Proto conversion functions
 # /home/ubuntu/dscm/bin/python -m pytest --log-level=INFO --log-cli-level=INFO --verbose \
@@ -38,9 +30,3 @@ echo "======================================"
 #     nbi/tests/test_json_to_proto.py::test_configure_pluggable_request_hub_format \
 #     nbi/tests/test_json_to_proto.py::test_configure_pluggable_request_leaf_format \
 #     nbi/tests/test_json_to_proto.py::test_empty_payload
-
-
-echo ""
-echo "======================================"
-echo "Test execution completed"
-echo "======================================"
diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/json_to_proto_conversion.py b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/json_to_proto_conversion.py
index 28d8e508e..d8eb2bbad 100644
--- a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/json_to_proto_conversion.py
+++ b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/json_to_proto_conversion.py
@@ -17,7 +17,7 @@ Helper functions to convert JSON payload from RESTCONF to Pluggables proto messa
 """
 
 from typing import Dict, Any
-from common.proto import pluggables_pb2                                                                                   # pyright: ignore[reportAttributeAccessIssue]
+from common.proto import pluggables_pb2
 
 
 def json_to_get_pluggable_request(
@@ -183,7 +183,7 @@ def _add_dsc_groups_from_hub_format(
             
             # Set frequency and power from top-level payload
             if "frequency" in payload:
-                subcarrier.center_frequency_hz = float(payload["frequency"]) * 1e6                                        # type: ignore[attr-defined]
+                subcarrier.center_frequency_hz = float(payload["frequency"])                                              # type: ignore[attr-defined]
             
             if "target_output_power" in payload:
                 subcarrier.target_output_power_dbm = float(payload["target_output_power"])                                # type: ignore[attr-defined]
@@ -230,7 +230,7 @@ def _add_dsc_groups_from_leaf_format(
             
             # Set frequency and power from channel data
             if "frequency" in channel_data:
-                subcarrier.center_frequency_hz = float(channel_data["frequency"]) * 1e6                                   # type: ignore[attr-defined]  # MHz to Hz
+                subcarrier.center_frequency_hz = float(channel_data["frequency"])                                         # type: ignore[attr-defined]  # MHz to Hz
             
             if "target_output_power" in channel_data:
                 subcarrier.target_output_power_dbm = float(channel_data["target_output_power"])                           # type: ignore[attr-defined]
diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/routes.py b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/routes.py
index 328ba0a8b..ab49af758 100644
--- a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/routes.py
+++ b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/routes.py
@@ -90,7 +90,7 @@ def rc_get(rc_path, device_uuid=None):
         LOGGER.warning(f"Pluggable not found for device {device_uuid}: {e.details}")
         return _not_found(f"Pluggable not found: {e.details}", path=rc_path)
     
-    except Exception as e:
+    except ServiceException as e:
         LOGGER.error(f"Unexpected error getting pluggable for device {device_uuid}: {str(e)}", exc_info=True)
         return _bad_request(f"Failed to get pluggable: {str(e)}", path=rc_path)
     
@@ -132,7 +132,7 @@ def rc_post(rc_path, device_uuid=None):
         LOGGER.warning(f"Invalid argument creating pluggable for device {device_uuid}: {e.details}")
         return _bad_request(f"Invalid argument: {e.details}", path=rc_path)
     
-    except Exception as e:
+    except ServiceException as e:
         LOGGER.error(f"Unexpected error creating pluggable for device {device_uuid}: {str(e)}", exc_info=True)
         return _bad_request(f"Failed to create pluggable: {str(e)}", path=rc_path)
 
@@ -157,7 +157,7 @@ def rc_delete(rc_path, device_uuid=None):
         # DELETE is idempotent - return 204 even if resource doesn't exist
         return Response(status=204)
     
-    except Exception as e:
+    except ServiceException as e:
         LOGGER.error(f"Unexpected error deleting pluggable for device {device_uuid}: {str(e)}", exc_info=True)
         return _bad_request(f"Failed to delete pluggable: {str(e)}", path=rc_path)
 
diff --git a/src/nbi/tests/DSCM_MockWebServer.py b/src/nbi/tests/DSCM_MockWebServer.py
index a5eb1ce01..604da6810 100644
--- a/src/nbi/tests/DSCM_MockWebServer.py
+++ b/src/nbi/tests/DSCM_MockWebServer.py
@@ -13,7 +13,7 @@
 # limitations under the License.
 
 
-import logging, threading, pytest, time
+import logging, threading
 from nbi.service.NbiApplication import NbiApplication
 from nbi.service.rest_server.nbi_plugins.dscm_oc import register_dscm_oc
 from .Constants import LOCAL_HOST, NBI_SERVICE_PORT, NBI_SERVICE_PREFIX_URL
@@ -38,53 +38,3 @@ class MockWebServer(threading.Thread):
             )
         except: # pylint: disable=bare-except
             LOGGER.exception('[MockWebServer::run] Unhandled Exception')
-
-
-
-# import os, pytest, time
-# from common.Constants import ServiceNameEnum
-# from common.Settings import (
-#     ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_HTTP,
-#     get_env_var_name, get_service_baseurl_http, get_service_port_http
-# )
-# from nbi.service.rest_server.RestServer import RestServer
-# from nbi.service.rest_server.nbi_plugins.dscm_oc import register_dscm_oc
-# 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
-
-
-# LOCAL_HOST = '127.0.0.1'
-# MOCKSERVICE_PORT = 10000
-# NBI_SERVICE_PORT = MOCKSERVICE_PORT + get_service_port_http(ServiceNameEnum.NBI)    # avoid privileged ports
-# 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)
-
-# @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 : MockService_Dependencies):  # pylint: disable=redefined-outer-name, unused-argument
-#     _rest_server = RestServer()
-#     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)
-#     register_dscm_oc(_rest_server)
-
-#     _rest_server.start()
-#     time.sleep(1) # bring time for the server to start
-#     yield _rest_server
-#     _rest_server.shutdown()
-#     _rest_server.join()
diff --git a/src/nbi/tests/messages/dscm_messages.py b/src/nbi/tests/messages/dscm_messages.py
index 34afe31e9..ef97a4c8b 100644
--- a/src/nbi/tests/messages/dscm_messages.py
+++ b/src/nbi/tests/messages/dscm_messages.py
@@ -37,21 +37,21 @@ def get_leaf_payload():
         "channels": [
             {
                 "name"                      : "channel-1",
-                "frequency"                 : "195006250",
+                "frequency"                 : "195006250000000",
                 "target_output_power"       : "-99.0",
                 "operational_mode"          : "1",
                 "digital_subcarriers_groups": [{ "group_id": 1 }]
             },
             {
                 "name"                      : "channel-3",
-                "frequency"                 : "195018750",
+                "frequency"                 : "195018750000000",
                 "target_output_power"       : "-99.0",
                 "operational_mode"          : "1",
                 "digital_subcarriers_groups": [{ "group_id": 2 }]
             },
             {
                 "name"                      : "channel-5",
-                "frequency"                 : "195031250",
+                "frequency"                 : "195031250000000",
                 "target_output_power"       : "-99.0",
                 "operational_mode"          : "1",
                 "digital_subcarriers_groups": [{ "group_id": 3 }]
diff --git a/src/nbi/tests/test_dscm_restconf.py b/src/nbi/tests/test_dscm_restconf.py
index c9b5804a4..6ee0a946b 100644
--- a/src/nbi/tests/test_dscm_restconf.py
+++ b/src/nbi/tests/test_dscm_restconf.py
@@ -12,6 +12,10 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+from typing import Union
+import logging
+import os, pytest
+import requests
 from .DSCM_MockWebServer import nbi_service_rest
 from .messages.dscm_messages import get_hub_payload, get_leaf_payload
 from common.Constants import ServiceNameEnum
@@ -23,11 +27,6 @@ from common.tests.MockServicerImpl_Context import MockServicerImpl_Context
 from common.tools.service.GenericGrpcService import GenericGrpcService
 from pluggables.client.PluggablesClient import PluggablesClient
 from pluggables.service.PluggablesService import PluggablesService
-from typing import Union
-import grpc
-import logging
-import os, pytest
-import requests
 
 
 LOGGER = logging.getLogger(__name__)
@@ -43,35 +42,30 @@ HEADERS = { "Accept"      : "application/yang-data+json",
 
 LOCAL_HOST = '127.0.0.1'
 
-DSCMPLUGGABLE_SERVICE_PORT = get_service_port_grpc(ServiceNameEnum.DSCMPLUGGABLE)  # type: ignore
+DSCMPLUGGABLE_SERVICE_PORT = get_service_port_grpc(ServiceNameEnum.DSCMPLUGGABLE)  
 os.environ[get_env_var_name(ServiceNameEnum.DSCMPLUGGABLE, ENVVAR_SUFIX_SERVICE_HOST     )] = str(LOCAL_HOST)
 os.environ[get_env_var_name(ServiceNameEnum.DSCMPLUGGABLE, ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(DSCMPLUGGABLE_SERVICE_PORT)
 
 class MockContextService(GenericGrpcService):
-    # Mock Service implementing Context to simplify unitary tests of DSCM pluggables
-
     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)
 
-# This fixture will be requested by test cases and last during testing session
+
 @pytest.fixture(scope='session')
 def pluggables_service():
     LOGGER.info('Initializing DscmPluggableService...')
     _service = PluggablesService()
     _service.start()
 
-    # yield the server, when test finishes, execution will resume to stop it
     LOGGER.info('Yielding DscmPluggableService...')
     yield _service
 
     LOGGER.info('Terminating DscmPluggableService...')
     _service.stop()
-
     LOGGER.info('Terminated DscmPluggableService...')
 
 @pytest.fixture(scope='function')
@@ -84,7 +78,6 @@ def dscm_pluggable_client(pluggables_service : PluggablesService):
 
     LOGGER.info('Closing PluggablesClient...')
     _client.close()
-
     LOGGER.info('Closed PluggablesClient...')
 
 @pytest.fixture(autouse=True)
@@ -93,34 +86,19 @@ def log_each(request):
     yield
     LOGGER.info(f"<<<<<< END   {request.node.name} <<<<<<")
 
-# Add here the test case of POST method to create a new device configuration
 def test_post_hub_optical_channel_frequency(nbi_service_rest, dscm_pluggable_client: PluggablesClient):
     """Test PATCH to update optical channel frequency."""
-    # Use simple path with / and encode manually for component name
-    component_name = "optical-channel-1/1/1"
     device = "device=T1.1/"
     encoded_path = f"{device}openconfig-platform:components/component=1/optical-channel/config"
     
-    # Update frequency
     post_data = get_hub_payload()
     response = requests.post(f"{BASE_URL}{encoded_path}", 
                             json=post_data, 
                             headers=HEADERS)
     assert response.status_code == 201
 
-
-
-# Add a complete test case of POST, GET, DELETE methods to create, get and delete a new device configuration
-# - 1. POST to create a new device configuration
-# - 2. GET to retrieve the created device configuration
-# - 3. DELETE to remove the created device configuration
-# - 4. GET again to verify the device configuration has been deleted
-# - 5. Catch and handle exceptions appropriately assert the expected outcomes at each step
-# - Use assertions to validate the responses and states after each operation
-# - Use both hub and leaf device types for the test
 def test_post_get_delete_leaf_optical_channel_frequency(nbi_service_rest, dscm_pluggable_client: PluggablesClient):
     """Test POST, GET, DELETE to manage optical channel frequency for leaf device."""
-    # Use simple path with / and encode manually for component name
     device = "device=T1.2/"
     encoded_path = f"{device}openconfig-platform:components/component=1/optical-channel/config"
     
@@ -143,4 +121,4 @@ def test_post_get_delete_leaf_optical_channel_frequency(nbi_service_rest, dscm_p
 
     # Step 4: GET again to verify the device configuration has been deleted
     response = requests.get(f"{BASE_URL}{encoded_path}", headers={"Accept": "application/yang-data+json"})
-    assert response.status_code == 400  # Assuming 404 is returned for non-existing resource
+    assert response.status_code == 400  # Assuming 400 is returned for non-existing resource
diff --git a/src/nbi/tests/test_json_to_proto.py b/src/nbi/tests/test_json_to_proto.py
deleted file mode 100644
index cb0bd7acf..000000000
--- a/src/nbi/tests/test_json_to_proto.py
+++ /dev/null
@@ -1,178 +0,0 @@
-# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 pytest
-from nbi.service.rest_server.nbi_plugins.dscm_oc.json_to_proto_conversion import (
-    json_to_create_pluggable_request,
-    json_to_configure_pluggable_request
-)
-
-
-def get_hub_payload():
-    """Example HUB format payload."""
-    return {
-        "name"               : "channel-1",
-        "frequency"          : "195000000",
-        "target_output_power": "-3.0",
-        "operational_mode"   : "1",
-        "operation"          : "merge",
-        "digital_subcarriers_groups": [
-            { "group_id": 1, "digital-subcarrier-id": [{ "subcarrier-id": 1, "active": True}, ]},
-            { "group_id": 2, "digital-subcarrier-id": [{ "subcarrier-id": 2, "active": True}, ]},
-            { "group_id": 3, "digital-subcarrier-id": [{ "subcarrier-id": 3, "active": True}, ]},
-            { "group_id": 4, "digital-subcarrier-id": [{ "subcarrier-id": 4, "active": True}, ]},
-        ],
-    }
-
-def get_leaf_payload():
-    """Example LEAF format payload."""
-    return {
-        "channels": [
-            {
-                "name": "channel-1",
-                "frequency": "195006250",
-                "target_output_power": "-99.0",
-                "operational_mode": "1",
-                "digital_subcarriers_groups": [{"group_id": 1}]
-            },
-            {
-                "name": "channel-3",
-                "frequency": "195018750",
-                "target_output_power": "-99.0",
-                "operational_mode": "1",
-                "digital_subcarriers_groups": [{"group_id": 2}]
-            }
-        ]
-    }
-
-def test_create_pluggable_request_hub_format():
-    """Test conversion of HUB format to CreatePluggableRequest."""
-    device_uuid = "test-device-uuid-123"
-    payload     = get_hub_payload()
-    
-    request = json_to_create_pluggable_request(
-        device_uuid=device_uuid,
-        initial_config=payload,
-        preferred_pluggable_index=0
-    )
-    
-    # Verify device ID
-    assert request.device.device_uuid.uuid == device_uuid                                                                 # type: ignore[attr-defined]
-    assert request.preferred_pluggable_index == 0                                                                         # type: ignore[attr-defined]
-    
-    # Verify initial config
-    assert request.initial_config.id.device.device_uuid.uuid == device_uuid                                               # type: ignore[attr-defined]
-    assert request.initial_config.id.pluggable_index == 0                                                                 # type: ignore[attr-defined]
-    
-    # Verify DSC groups
-    assert len(request.initial_config.dsc_groups) == 4                                                                    # type: ignore[attr-defined]
-    
-    # Check first group
-    group1 = request.initial_config.dsc_groups[0]                                                                         # type: ignore[attr-defined]
-    assert group1.id.group_index == 1                                                                                     # type: ignore[attr-defined]
-    assert group1.group_size == 1                                                                                         # type: ignore[attr-defined]
-    assert len(group1.subcarriers) == 1                                                                                   # type: ignore[attr-defined]
-    assert group1.subcarriers[0].active is True                                                                           # type: ignore[attr-defined]
-
-
-def test_create_pluggable_request_leaf_format():
-    """Test conversion of LEAF format to CreatePluggableRequest."""
-    device_uuid = "test-device-uuid-456"
-    payload = get_leaf_payload()
-    
-    request = json_to_create_pluggable_request(
-        device_uuid=device_uuid,
-        initial_config=payload,
-        preferred_pluggable_index=-1
-    )
-    
-    # Verify device ID
-    assert request.device.device_uuid.uuid == device_uuid                                                                 # type: ignore[attr-defined]
-    assert request.preferred_pluggable_index == -1                                                                        # type: ignore[attr-defined]
-    
-    # Verify DSC groups (one per channel)
-    assert len(request.initial_config.dsc_groups) == 2                                                                    # type: ignore[attr-defined]
-    
-    # Check first channel group
-    group1 = request.initial_config.dsc_groups[0]                                                                         # type: ignore[attr-defined]
-    assert group1.id.group_index == 1                                                                                     # type: ignore[attr-defined]
-    assert group1.group_size == 1                                                                                         # type: ignore[attr-defined]
-    assert len(group1.subcarriers) == 1                                                                                   # type: ignore[attr-defined]
-    
-    # Verify frequency conversion (MHz to Hz)
-    subcarrier1 = group1.subcarriers[0]                                                                                   # type: ignore[attr-defined]
-    assert subcarrier1.center_frequency_hz == 195006250 * 1e6                                                             # type: ignore[attr-defined]
-
-
-def test_configure_pluggable_request_hub_format():
-    """Test conversion to ConfigurePluggableRequest with HUB format."""
-    device_uuid = "test-device-uuid-789"
-    pluggable_index = 1
-    payload = get_hub_payload()
-    
-    request = json_to_configure_pluggable_request(
-        device_uuid=device_uuid,
-        pluggable_index=pluggable_index,
-        payload=payload
-    )
-    
-    # Verify config ID
-    assert request.config.id.device.device_uuid.uuid == device_uuid                                                       # type: ignore[attr-defined]
-    assert request.config.id.pluggable_index == pluggable_index                                                           # type: ignore[attr-defined]
-    
-    # Verify timeout and view level
-    assert request.apply_timeout_seconds == 30                                                                            # type: ignore[attr-defined]
-    
-    # Verify DSC groups
-    assert len(request.config.dsc_groups) == 4                                                                            # type: ignore[attr-defined]
-
-
-def test_configure_pluggable_request_leaf_format():
-    """Test conversion to ConfigurePluggableRequest with LEAF format."""
-    device_uuid = "test-device-uuid-abc"
-    pluggable_index = 0
-    payload = get_leaf_payload()
-    
-    request = json_to_configure_pluggable_request(
-        device_uuid=device_uuid,
-        pluggable_index=pluggable_index,
-        payload=payload,
-        apply_timeout_seconds=60
-    )
-    
-    # Verify config ID
-    assert request.config.id.device.device_uuid.uuid == device_uuid                                                       # type: ignore[attr-defined]
-    assert request.config.id.pluggable_index == pluggable_index                                                           # type: ignore[attr-defined]
-    
-    # Verify custom timeout
-    assert request.apply_timeout_seconds == 60                                                                            # type: ignore[attr-defined]
-    
-    # Verify DSC groups (one per channel)
-    assert len(request.config.dsc_groups) == 2                                                                            # type: ignore[attr-defined]
-
-
-def test_empty_payload():
-    """Test handling of empty payload."""
-    device_uuid = "test-device-uuid-empty"
-    payload = {}
-    
-    request = json_to_create_pluggable_request(
-        device_uuid=device_uuid,
-        initial_config=payload,
-        preferred_pluggable_index=-1
-    )
-    
-    # Should create request with device ID but no initial config
-    assert request.device.device_uuid.uuid == device_uuid                                                                 # type: ignore[attr-defined]
-    assert request.preferred_pluggable_index == -1                                                                        # type: ignore[attr-defined]
-- 
GitLab


From 09b8ca59baf41064624b598a8b0dca8eb622ad8e Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Wed, 29 Oct 2025 17:39:12 +0000
Subject: [PATCH 033/111] Updates in SBI to add support of DSCM pluggables

- Remove unused DeviceDriverEnum entry
- Update test script for integration testing
- added new templates for DSCM configuration
- update jinja main file to prcess DSCM pluggables request
---
 proto/context.proto                           |  1 -
 .../run_tests_locally-service-pluggable.sh    |  7 +++--
 .../drivers/openconfig/templates/__init__.py  | 21 +++++++++++++
 .../1/config/edit_config_hub_template.xml     | 31 +++++++++++++++++++
 .../1/config/edit_config_leaf_template.xml    | 31 +++++++++++++++++++
 5 files changed, 88 insertions(+), 3 deletions(-)
 create mode 100644 src/device/service/drivers/openconfig/templates/pluggable/1/config/edit_config_hub_template.xml
 create mode 100644 src/device/service/drivers/openconfig/templates/pluggable/1/config/edit_config_leaf_template.xml

diff --git a/proto/context.proto b/proto/context.proto
index 4833d9c22..9fde6a3c1 100644
--- a/proto/context.proto
+++ b/proto/context.proto
@@ -252,7 +252,6 @@ enum DeviceDriverEnum {
   DEVICEDRIVER_RYU = 18;
   DEVICEDRIVER_GNMI_NOKIA_SRLINUX = 19;
   DEVICEDRIVER_OPENROADM = 20;
-  DRVICEDRIVER_NETCONF_DSCM = 21;
 }
 
 enum DeviceOperationalStatusEnum {
diff --git a/scripts/run_tests_locally-service-pluggable.sh b/scripts/run_tests_locally-service-pluggable.sh
index 600c1edf7..e749bd43c 100755
--- a/scripts/run_tests_locally-service-pluggable.sh
+++ b/scripts/run_tests_locally-service-pluggable.sh
@@ -17,7 +17,10 @@ PROJECTDIR=`pwd`
 cd $PROJECTDIR/src
 RCFILE=$PROJECTDIR/coverage/.coveragerc
 
-python3 -m pytest --log-level=info --log-cli-level=info --verbose \
-    pluggables/tests/test_Pluggables.py
+# to run integration test: -m integration
+python3 -m pytest --log-level=info --log-cli-level=info --verbose -m "not integration" \
+    pluggables/tests/test_pluggables_with_SBI.py
+# python3 -m pytest --log-level=info --log-cli-level=info --verbose \
+#     pluggables/tests/test_Pluggables.py
 
 echo "Bye!"
diff --git a/src/device/service/drivers/openconfig/templates/__init__.py b/src/device/service/drivers/openconfig/templates/__init__.py
index 3704791d8..514c3a696 100644
--- a/src/device/service/drivers/openconfig/templates/__init__.py
+++ b/src/device/service/drivers/openconfig/templates/__init__.py
@@ -136,6 +136,27 @@ def compose_config( # template generation
                 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))
+        elif "pluggable" in resource_key:  # MANAGING DSCM (Digital Subcarrier Modules)
+            # Resource key format: /pluggable/{template_index}/config/{template_identifier}
+            # Example: /pluggable/1/config/hub or /pluggable/1/config/leaf
+            # Extract template identifier (hub or leaf) from the resource key
+            key_parts = resource_key.strip('/').split('/')
+            if len(key_parts) >= 4 and key_parts[-1] in ['hub', 'leaf']:
+                template_identifier = key_parts[-1]  # 'hub' or 'leaf'
+                template_index = key_parts[1] if len(key_parts) > 1 else '1'
+                
+                # Build template path: pluggable/{index}/config/edit_config_{hub|leaf}_template.xml
+                template_path = f'pluggable/{template_index}/config/edit_config_{template_identifier}_template.xml'
+                templates.append(JINJA_ENV.get_template(template_path))
+                
+                LOGGER.info(f"Loading DSCM template: {template_path}")
+            else:
+                # Fallback to generic template if format doesn't match expected pattern
+                LOGGER.warning(f"Unexpected DSCM resource key format: {resource_key}, using default template")
+                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)
         else:
             template_name = '{:s}/edit_config.xml'.format(RE_REMOVE_FILTERS.sub('', resource_key))
             templates.append(JINJA_ENV.get_template(template_name))
diff --git a/src/device/service/drivers/openconfig/templates/pluggable/1/config/edit_config_hub_template.xml b/src/device/service/drivers/openconfig/templates/pluggable/1/config/edit_config_hub_template.xml
new file mode 100644
index 000000000..4149bccda
--- /dev/null
+++ b/src/device/service/drivers/openconfig/templates/pluggable/1/config/edit_config_hub_template.xml
@@ -0,0 +1,31 @@
+
+    
+        {{name}}
+        
+            {% if operation is defined and operation != 'delete' %}
+            
+                {% if frequency is defined %}{{frequency}}{% endif %}
+                {% if target_output_power is defined %}{{target_output_power}}{% endif %}
+                {% if operational_mode is defined %}{{operational_mode}}{% endif %}
+
+                {% if digital_sub_carriers_group is defined and digital_sub_carriers_group %}
+                    {% for group in digital_sub_carriers_group %}
+                    
+                        {{group.digital_sub_carriers_group_id}}
+
+                        {% if group.digital_sub_carrier_id is defined and group.digital_sub_carrier_id %}
+                            {% for sub_carrier in group.digital_sub_carrier_id %}
+                            
+                                {{sub_carrier.sub_carrier_id}}
+                                {{sub_carrier.active}}
+                            
+                            {% endfor %}
+                        {% endif %}
+                    
+                    {% endfor %}
+                {% endif %}
+            
+            {% endif %}
+        
+    
+
diff --git a/src/device/service/drivers/openconfig/templates/pluggable/1/config/edit_config_leaf_template.xml b/src/device/service/drivers/openconfig/templates/pluggable/1/config/edit_config_leaf_template.xml
new file mode 100644
index 000000000..4149bccda
--- /dev/null
+++ b/src/device/service/drivers/openconfig/templates/pluggable/1/config/edit_config_leaf_template.xml
@@ -0,0 +1,31 @@
+
+    
+        {{name}}
+        
+            {% if operation is defined and operation != 'delete' %}
+            
+                {% if frequency is defined %}{{frequency}}{% endif %}
+                {% if target_output_power is defined %}{{target_output_power}}{% endif %}
+                {% if operational_mode is defined %}{{operational_mode}}{% endif %}
+
+                {% if digital_sub_carriers_group is defined and digital_sub_carriers_group %}
+                    {% for group in digital_sub_carriers_group %}
+                    
+                        {{group.digital_sub_carriers_group_id}}
+
+                        {% if group.digital_sub_carrier_id is defined and group.digital_sub_carrier_id %}
+                            {% for sub_carrier in group.digital_sub_carrier_id %}
+                            
+                                {{sub_carrier.sub_carrier_id}}
+                                {{sub_carrier.active}}
+                            
+                            {% endfor %}
+                        {% endif %}
+                    
+                    {% endfor %}
+                {% endif %}
+            
+            {% endif %}
+        
+    
+
-- 
GitLab


From c6085005b0987b2bf76b79d76764c426f46a09fc Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Wed, 29 Oct 2025 17:43:12 +0000
Subject: [PATCH 034/111] Refactor Pluggables Service and add SBI support

- Removed unused import of google.protobuf.field_mask from pluggables.proto.
- Updated DigitalSubcarrierGroupState and PluggableConfig messages in pluggables.proto to include additional fields for configuration management.
- Enhanced PluggablesServiceServicerImpl to support pushing configurations to devices, including error handling and logging.
- Added new methods for translating pluggable configurations to NETCONF format in config_translator.py.
- Created CommonObjects.py and PreparePluggablesTestScenario.py for test setup and device configuration.
- Implemented comprehensive tests for creating, configuring, retrieving, and deleting pluggables with NETCONF devices in test_pluggables_with_SBI.py.
- Updated pytest.ini to include integration test marker for better test categorization.
---
 proto/pluggables.proto                        |  14 +-
 proto/policy.proto                            |   2 +-
 src/device/service/drivers/__init__.py        |  26 +-
 .../service/PluggablesServiceServicerImpl.py  | 139 +++++++-
 src/pluggables/service/config_translator.py   | 101 ++++++
 src/pluggables/tests/CommonObjects.py         | 176 +++++++++++
 .../tests/PreparePluggablesTestScenario.py    | 170 ++++++++++
 .../tests/test_pluggables_with_SBI.py         | 296 ++++++++++++++++++
 src/pluggables/tests/testmessages.py          |  12 +
 src/pytest.ini                                |  18 ++
 10 files changed, 928 insertions(+), 26 deletions(-)
 create mode 100644 src/pluggables/service/config_translator.py
 create mode 100644 src/pluggables/tests/CommonObjects.py
 create mode 100644 src/pluggables/tests/PreparePluggablesTestScenario.py
 create mode 100644 src/pluggables/tests/test_pluggables_with_SBI.py
 create mode 100644 src/pytest.ini

diff --git a/proto/pluggables.proto b/proto/pluggables.proto
index 96661c02a..d6abe9daf 100644
--- a/proto/pluggables.proto
+++ b/proto/pluggables.proto
@@ -3,7 +3,6 @@ syntax = "proto3";
 package tfs.pluggables.v0;
 
 import "context.proto";
-import "google/protobuf/field_mask.proto";
 
 service PluggablesService {
   rpc CreatePluggable      (CreatePluggableRequest)      returns (Pluggable)              {}
@@ -56,7 +55,7 @@ message DigitalSubcarrierGroupConfig {
 
 message DigitalSubcarrierGroupState {
   DigitalSubcarrierGroupId id                 = 1;
-  int32 count                                 = 2;   // available DSCs
+  int32  count                                = 2;   // available DSCs
   double group_capacity_gbps                  = 3;
   double subcarrier_spacing_mhz               = 4;
   repeated DigitalSubcarrierState subcarriers = 10;
@@ -65,6 +64,10 @@ message DigitalSubcarrierGroupState {
 
 message PluggableConfig {
   PluggableId id                                   = 1;
+  double target_output_power_dbm                   = 2;   // target output power for the pluggable
+  double center_frequency_mhz                      = 3;   // center frequency in MHz
+  int32  operational_mode                          = 4;   // e.g., 0=off and 1=on 
+  int32  line_port                                 = 5;   // line port number
   repeated DigitalSubcarrierGroupConfig dsc_groups = 10;
 }
 
@@ -108,10 +111,9 @@ message DeletePluggableRequest {
 }
 
 message ConfigurePluggableRequest {
-  PluggableConfig config                = 1;
-  google.protobuf.FieldMask update_mask = 2;    // Not Implemented yet (for partial updates)
-  View view_level                       = 3;
-  int32 apply_timeout_seconds           = 10;   // Not Implemented yet (for timeout)
+  PluggableConfig config      = 1;
+  View view_level             = 2;
+  int32 apply_timeout_seconds = 10;   // Not Implemented yet (for timeout)
 }
 
 // to control the level of detail in responses
diff --git a/proto/policy.proto b/proto/policy.proto
index d788f86aa..51ea63b7f 100644
--- a/proto/policy.proto
+++ b/proto/policy.proto
@@ -16,7 +16,7 @@ syntax = "proto3";
 package policy;
 
 import "context.proto";
-import "policy_condition.proto";    // WARNING: Not used  
+import "policy_condition.proto";
 import "policy_action.proto";
 import "monitoring.proto"; // to be migrated to: "kpi_manager.proto"
 
diff --git a/src/device/service/drivers/__init__.py b/src/device/service/drivers/__init__.py
index 5768e2310..21a0ec111 100644
--- a/src/device/service/drivers/__init__.py
+++ b/src/device/service/drivers/__init__.py
@@ -98,19 +98,19 @@ if LOAD_ALL_DEVICE_DRIVERS:
             }
         ]))
 
-if LOAD_ALL_DEVICE_DRIVERS:
-    from .gnmi_openconfig.GnmiOpenConfigDriver import GnmiOpenConfigDriver # pylint: disable=wrong-import-position
-    DRIVERS.append(
-        (GnmiOpenConfigDriver, [
-            {
-                # Real Packet Router, specifying gNMI OpenConfig Driver => use GnmiOpenConfigDriver
-                FilterFieldEnum.DEVICE_TYPE: [
-                    DeviceTypeEnum.PACKET_POP,
-                    DeviceTypeEnum.PACKET_ROUTER,
-                ],
-                FilterFieldEnum.DRIVER     : DeviceDriverEnum.DEVICEDRIVER_GNMI_OPENCONFIG,
-            }
-        ]))
+# if LOAD_ALL_DEVICE_DRIVERS:
+#     from .gnmi_openconfig.GnmiOpenConfigDriver import GnmiOpenConfigDriver # pylint: disable=wrong-import-position
+#     DRIVERS.append(
+#         (GnmiOpenConfigDriver, [
+#             {
+#                 # Real Packet Router, specifying gNMI OpenConfig Driver => use GnmiOpenConfigDriver
+#                 FilterFieldEnum.DEVICE_TYPE: [
+#                     DeviceTypeEnum.PACKET_POP,
+#                     DeviceTypeEnum.PACKET_ROUTER,
+#                 ],
+#                 FilterFieldEnum.DRIVER     : DeviceDriverEnum.DEVICEDRIVER_GNMI_OPENCONFIG,
+#             }
+#         ]))
 
 if LOAD_ALL_DEVICE_DRIVERS:
     from .gnmi_nokia_srlinux.GnmiNokiaSrLinuxDriver import GnmiNokiaSrLinuxDriver # pylint: disable=wrong-import-position
diff --git a/src/pluggables/service/PluggablesServiceServicerImpl.py b/src/pluggables/service/PluggablesServiceServicerImpl.py
index a12be3ca4..5509b9d66 100644
--- a/src/pluggables/service/PluggablesServiceServicerImpl.py
+++ b/src/pluggables/service/PluggablesServiceServicerImpl.py
@@ -12,22 +12,98 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import logging, grpc
+import json, logging, grpc
 from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method
-from common.proto.context_pb2 import Empty
+from common.proto.context_pb2 import Empty, Device, DeviceId
 from common.proto.pluggables_pb2_grpc import PluggablesServiceServicer
 from common.proto.pluggables_pb2 import (
     Pluggable, CreatePluggableRequest, ListPluggablesRequest, ListPluggablesResponse, 
     GetPluggableRequest, DeletePluggableRequest, ConfigurePluggableRequest)
-from common.method_wrappers.ServiceExceptions import NotFoundException, AlreadyExistsException 
+from common.method_wrappers.ServiceExceptions import (
+    NotFoundException, AlreadyExistsException, InvalidArgumentException)
+from common.tools.object_factory.ConfigRule import json_config_rule_set
+from context.client.ContextClient import ContextClient
+from device.client.DeviceClient import DeviceClient
+from .config_translator import translate_pluggable_config_to_netconf, create_config_rule_from_dict
 
 LOGGER = logging.getLogger(__name__)
-METRICS_POOL = MetricsPool('DscmPluggable', 'ServicegRPC')
+METRICS_POOL = MetricsPool('Pluggables', 'ServicegRPC')
 
 class PluggablesServiceServicerImpl(PluggablesServiceServicer):
     def __init__(self):
-        LOGGER.info('Init DscmPluggableService')
+        LOGGER.info('Initiate PluggablesService')
         self.pluggables = {}  # In-memory store for pluggables
+        self.context_client = ContextClient()
+        self.device_client = DeviceClient()
+
+    def _push_config_to_device(self, device_uuid: str, pluggable_index: int, pluggable_config):  # type: ignore
+        """
+        Push pluggable configuration to the actual device via DeviceClient.
+        Args:
+            device_uuid: UUID of the target device
+            pluggable_index: Index of the pluggable
+            pluggable_config: PluggableConfig protobuf message
+        """
+        LOGGER.info(f"Configuring device {device_uuid}, pluggable index {pluggable_index}")
+        
+        # Step 1: Get the device from Context service (to extract IP address and determine template)
+        try:
+            device = self.context_client.GetDevice(DeviceId(device_uuid={'uuid': device_uuid}))  # type: ignore
+            LOGGER.info(f"Retrieved device from Context: {device.name}")
+        except grpc.RpcError as e:
+            LOGGER.error(f"Failed to get device {device_uuid} from Context: {e}")
+            raise
+        
+        # Translate pluggable config to NETCONF format
+        component_name = f"channel-{pluggable_index}"
+        netconf_config = translate_pluggable_config_to_netconf(pluggable_config, component_name=component_name)
+        
+        LOGGER.info(f"Translated pluggable config to NETCONF format: {netconf_config}")
+        
+        # Step 2: Extract device IP address from _connect/address config rule
+        device_address = None
+        for config_rule in device.device_config.config_rules:  # type: ignore
+            if config_rule.custom.resource_key == '_connect/address':  # type: ignore
+                device_address = config_rule.custom.resource_value  # type: ignore
+                break
+        
+        # Step 3: Determine the appropriate template based on device IP address (TODO: This need to be updated later)
+        if device_address == '10.30.7.7':
+            template_identifier = 'hub'
+        elif device_address == '10.30.7.8':
+            template_identifier = 'leaf'
+        else:
+            # Default to hub template if IP address cannot be determined
+            LOGGER.warning(f"Cannot determine device type from IP address {device_address}, defaulting to hub template")
+            raise InvalidArgumentException( 'Device IP address', device_address, extra_details='Unknown device IP adress')
+        
+        LOGGER.info(f"Using template identifier: {template_identifier} for device {device.name} (IP: {device_address})")
+        
+        # Step 4: Create configuration rule with template-specific resource key
+        # For simplicity, we use a fixed pluggable index of 1 for template lookup
+        template_index = 1  # TODO: This should be dynamic based on actual pluggable index
+        resource_key = f"/pluggable/{template_index}/config/{template_identifier}"
+        
+        # Create config rule dict and convert to protobuf
+        config_json = json.dumps(netconf_config)
+        config_rule_dict = json_config_rule_set(resource_key, config_json)
+        config_rule = create_config_rule_from_dict(config_rule_dict)
+        
+        # Step 5: Create a minimal Device object with only the DSCM config rule
+        config_device = Device()
+        config_device.device_id.device_uuid.uuid = device_uuid  # type: ignore
+        config_device.device_config.config_rules.append(config_rule)  # type: ignore
+        
+        LOGGER.info(f"Created minimal device with config rule: resource_key={resource_key}, template={template_identifier}")
+
+        # Step 6: Call ConfigureDevice to push the configuration
+        try:
+            device_id = self.device_client.ConfigureDevice(config_device)
+            LOGGER.info(f"Successfully configured device {device_id.device_uuid.uuid}")  # type: ignore
+        except grpc.RpcError as e:
+            LOGGER.error(f"Failed to configure device {device_uuid}: {e}")
+            raise InvalidArgumentException(
+                'Device configuration', f'{device_uuid}:{pluggable_index}', extra_details=str(e))
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def CreatePluggable(
@@ -37,7 +113,7 @@ class PluggablesServiceServicerImpl(PluggablesServiceServicer):
         
         device_uuid = request.device.device_uuid.uuid
         
-        if request.preferred_pluggable_index and request.preferred_pluggable_index >= 0:
+        if request.preferred_pluggable_index >= 0:
             pluggable_index = request.preferred_pluggable_index
         else:
             pluggable_index = -1
@@ -70,6 +146,25 @@ class PluggablesServiceServicerImpl(PluggablesServiceServicer):
         
         pluggable.state.id.device.device_uuid.uuid = device_uuid
         pluggable.state.id.pluggable_index         = pluggable_index
+
+        # Verify device exists in Context service
+        try:
+            device = self.context_client.GetDevice(DeviceId(device_uuid={'uuid': device_uuid}))  # type: ignore
+            LOGGER.info(f"Device {device_uuid} found in Context service: {device.name}")
+        except grpc.RpcError as e:
+            LOGGER.error(f"Device {device_uuid} not found in Context service: {e}")
+            raise NotFoundException('Device', device_uuid, extra_details='Device must exist before creating pluggable')
+        
+        # If initial_config is provided, push configuration to device
+        if request.HasField('initial_config') and len(pluggable.config.dsc_groups) > 0:
+            LOGGER.info(f"Pushing initial configuration to device {device_uuid}")
+            try:
+                self._push_config_to_device(device_uuid, pluggable_index, pluggable.config)
+            except Exception as e:
+                LOGGER.error(f"Failed to push initial config to device: {e}")
+                raise 
+                # We still create the pluggable in memory, but log the error
+                # In production, you might want to raise the exception instead
         
         self.pluggables[pluggable_key] = pluggable
         
@@ -119,6 +214,21 @@ class PluggablesServiceServicerImpl(PluggablesServiceServicer):
             LOGGER.info(f'No matching pluggable found: device={device_uuid}, index={pluggable_index}')
             raise NotFoundException('Pluggable', pluggable_key)
         
+        # Remove pluggable config from device via DSCM driver
+        try:
+            pluggable = self.pluggables[pluggable_key]
+            # Create empty config to trigger deletion
+            from common.proto.pluggables_pb2 import PluggableConfig
+            empty_config = PluggableConfig()
+            empty_config.id.device.device_uuid.uuid = device_uuid
+            empty_config.id.pluggable_index = pluggable_index
+            
+            LOGGER.info(f"Removing configuration from device {device_uuid}")
+            self._push_config_to_device(device_uuid, pluggable_index, empty_config)
+        except Exception as e:
+            LOGGER.error(f"Failed to remove config from device: {e}")
+            # Continue with deletion from memory even if device config removal fails
+        
         del self.pluggables[pluggable_key]
         LOGGER.info(f"Deleted pluggable: device={device_uuid}, index={pluggable_index}")
         
@@ -184,6 +294,23 @@ class PluggablesServiceServicerImpl(PluggablesServiceServicer):
                 subcarrier.id.group.pluggable.pluggable_index         = pluggable_index
         
         has_config = len(pluggable.config.dsc_groups) > 0
+        
+        # Push pluggable config to device via DSCM driver
+        if has_config:
+            LOGGER.info(f"Pushing configuration to device {device_uuid}")
+            try:
+                self._push_config_to_device(device_uuid, pluggable_index, pluggable.config)
+            except Exception as e:
+                LOGGER.error(f"Failed to push config to device: {e}")
+                # Continue even if device configuration fails
+                # In production, you might want to raise the exception
+        else:
+            LOGGER.info(f"Empty configuration - removing config from device {device_uuid}")
+            try:
+                self._push_config_to_device(device_uuid, pluggable_index, pluggable.config)
+            except Exception as e:
+                LOGGER.error(f"Failed to remove config from device: {e}")
+        
         state_msg  = "configured" if has_config else "deconfigured (empty config)"
         LOGGER.info(f"Successfully {state_msg} pluggable: device={device_uuid}, index={pluggable_index}")
         
diff --git a/src/pluggables/service/config_translator.py b/src/pluggables/service/config_translator.py
new file mode 100644
index 000000000..3405fbb66
--- /dev/null
+++ b/src/pluggables/service/config_translator.py
@@ -0,0 +1,101 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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, Any, List, Optional
+from common.proto.pluggables_pb2 import PluggableConfig
+from common.proto.context_pb2 import ConfigRule, ConfigActionEnum
+
+LOGGER = logging.getLogger(__name__)
+
+
+def create_config_rule_from_dict(config_rule_dict: Dict[str, Any]) -> ConfigRule:  # type: ignore
+    config_rule = ConfigRule()
+    config_rule.action                = config_rule_dict['action']
+    config_rule.custom.resource_key   = config_rule_dict['custom']['resource_key']
+    config_rule.custom.resource_value = config_rule_dict['custom']['resource_value']
+    return config_rule
+
+
+def translate_pluggable_config_to_netconf(
+    pluggable_config: PluggableConfig,  # type: ignore
+    component_name: str = "channel-1"           # channel-1 for HUB and channel-1/3/5 for LEAF
+) -> Dict[str, Any]:
+    """
+    Translate PluggableConfig protobuf message to the format expected by NetConfDriver.
+    Args:
+        pluggable_config: PluggableConfig message containing DSC groups and subcarriers
+        component_name: Name of the optical channel component (default: "channel-1")
+    Returns:
+        Dictionary in the format expected by NetConfDriver templates:
+    """
+    
+    if not pluggable_config or not pluggable_config.dsc_groups:
+        LOGGER.warning("Empty pluggable config provided")
+        return {
+            "name": component_name,
+            "operation": "delete"
+        }
+    
+    if not hasattr(pluggable_config, 'center_frequency_mhz') or pluggable_config.center_frequency_mhz <= 0:
+        raise ValueError("center_frequency_mhz is required and must be greater than 0 in PluggableConfig")
+    center_frequency_mhz = int(pluggable_config.center_frequency_mhz)
+    
+    if not hasattr(pluggable_config, 'operational_mode') or pluggable_config.operational_mode <= 0:
+        raise ValueError("operational_mode is required and must be greater than 0 in PluggableConfig")
+    operational_mode = pluggable_config.operational_mode
+    
+    if not hasattr(pluggable_config, 'target_output_power_dbm'):
+        raise ValueError("target_output_power_dbm is required in PluggableConfig")
+    target_output_power = pluggable_config.target_output_power_dbm
+    
+    if not hasattr(pluggable_config, 'line_port'):
+        raise ValueError("line_port is required in PluggableConfig")
+    line_port = pluggable_config.line_port
+    
+    LOGGER.debug(f"Extracted config values: freq={center_frequency_mhz} MHz, "
+                 f"op_mode={operational_mode}, power={target_output_power} dBm, line_port={line_port}")
+    
+    # Build digital subcarriers groups
+    digital_sub_carriers_groups = []
+    
+    for group_dsc in pluggable_config.dsc_groups:
+        group_dsc_data = {
+            "digital_sub_carriers_group_id": group_dsc.id.group_index,
+            "digital_sub_carrier_id": []
+        }
+        
+        for subcarrier in group_dsc.subcarriers:
+            # Only subcarrier_index and active status are needed for Jinja2 template
+            subcarrier_data = {
+                "sub_carrier_id": subcarrier.id.subcarrier_index,
+                "active": "true" if subcarrier.active else "false"
+            }
+            group_dsc_data["digital_sub_carrier_id"].append(subcarrier_data)
+        
+        digital_sub_carriers_groups.append(group_dsc_data)
+    
+    # Build the final configuration dictionary
+    config = {
+        "name": component_name,
+        "frequency": center_frequency_mhz,
+        "operational_mode": operational_mode, 
+        "target_output_power": target_output_power,
+        "digital_sub_carriers_group": digital_sub_carriers_groups
+    }
+    
+    LOGGER.info(f"Translated pluggable config to NETCONF format: component={component_name}, "
+                f"frequency={center_frequency_mhz} MHz, groups={len(digital_sub_carriers_groups)}")
+    
+    return config
diff --git a/src/pluggables/tests/CommonObjects.py b/src/pluggables/tests/CommonObjects.py
new file mode 100644
index 000000000..4ddb57104
--- /dev/null
+++ b/src/pluggables/tests/CommonObjects.py
@@ -0,0 +1,176 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 copy, logging
+from typing import Dict, Any, Optional
+from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME
+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.context_pb2 import Device
+from common.tools.object_factory.Device import (
+    json_device_connect_rules, json_device_id, json_device_packetrouter_disabled
+)
+
+LOGGER = logging.getLogger(__name__)
+
+
+# ----- Context --------------------------------------------------------------------------------------------------------
+CONTEXT_ID = json_context_id(DEFAULT_CONTEXT_NAME)
+CONTEXT    = json_context(DEFAULT_CONTEXT_NAME)
+
+
+# ----- Topology -------------------------------------------------------------------------------------------------------
+TOPOLOGY_ID = json_topology_id(DEFAULT_TOPOLOGY_NAME, context_id=CONTEXT_ID)
+TOPOLOGY    = json_topology(DEFAULT_TOPOLOGY_NAME, context_id=CONTEXT_ID)
+
+
+# ----- Hub Device Configuration ---------------------------------------------
+
+DEVICE_HUB_UUID = 'hub-device-uuid-001'
+DEVICE_HUB_ADDRESS = '10.30.7.7'
+DEVICE_HUB_PORT = 2023
+DEVICE_HUB_USERNAME = 'admin'
+DEVICE_HUB_PASSWORD = 'admin'
+DEVICE_HUB_TIMEOUT = 15
+
+DEVICE_HUB_ID = json_device_id(DEVICE_HUB_UUID)
+DEVICE_HUB = json_device_packetrouter_disabled(DEVICE_HUB_UUID, name='Hub-Router')
+
+DEVICE_HUB_CONNECT_RULES = json_device_connect_rules(DEVICE_HUB_ADDRESS, DEVICE_HUB_PORT, {
+    'username': DEVICE_HUB_USERNAME,
+    'password': DEVICE_HUB_PASSWORD,
+    'force_running': False,
+    'hostkey_verify': False,
+    'look_for_keys': False,
+    'allow_agent': False,
+    'commit_per_rule': False,
+    'device_params': {'name': 'default'},
+    'manager_params': {'timeout': DEVICE_HUB_TIMEOUT},
+})
+
+# ----- Leaf Device Configuration --------------------------------------------
+
+DEVICE_LEAF_UUID = 'leaf-device-uuid-001'
+DEVICE_LEAF_ADDRESS = '10.30.7.8'
+DEVICE_LEAF_PORT = 2023
+DEVICE_LEAF_USERNAME = 'admin'
+DEVICE_LEAF_PASSWORD = 'admin'
+DEVICE_LEAF_TIMEOUT = 15
+
+DEVICE_LEAF_ID = json_device_id(DEVICE_LEAF_UUID)
+DEVICE_LEAF = json_device_packetrouter_disabled(DEVICE_LEAF_UUID, name='Leaf-Router')
+
+DEVICE_LEAF_CONNECT_RULES = json_device_connect_rules(DEVICE_LEAF_ADDRESS, DEVICE_LEAF_PORT, {
+    'username': DEVICE_LEAF_USERNAME,
+    'password': DEVICE_LEAF_PASSWORD,
+    'force_running': False,
+    'hostkey_verify': False,
+    'look_for_keys': False,
+    'allow_agent': False,
+    'commit_per_rule': False,
+    'device_params': {'name': 'default'},
+    'manager_params': {'timeout': DEVICE_LEAF_TIMEOUT},
+})
+
+# ----- Complete Device Objects with Connect Rules --------------------------
+
+def get_device_hub_with_connect_rules() -> Device:
+    """
+    Create a complete Hub device with connection rules.
+    
+    Returns:
+        Device protobuf object ready to be added to Context
+    """
+    device_dict = copy.deepcopy(DEVICE_HUB)
+    device_dict['device_config']['config_rules'].extend(DEVICE_HUB_CONNECT_RULES)
+    return Device(**device_dict)
+
+
+def get_device_leaf_with_connect_rules() -> Device:
+    """
+    Create a complete Leaf device with connection rules.
+    
+    Returns:
+        Device protobuf object ready to be added to Context
+    """
+    device_dict = copy.deepcopy(DEVICE_LEAF)
+    device_dict['device_config']['config_rules'].extend(DEVICE_LEAF_CONNECT_RULES)
+    return Device(**device_dict)
+
+# ----- Device Connection Mapping --------------------------------------------
+
+DEVICES_CONNECTION_INFO = {
+    'hub': {
+        'uuid': DEVICE_HUB_UUID,
+        'address': DEVICE_HUB_ADDRESS,
+        'port': DEVICE_HUB_PORT,
+        'settings': {},
+        'username': DEVICE_HUB_USERNAME,
+        'password': DEVICE_HUB_PASSWORD
+    },
+    'leaf': {
+        'uuid': DEVICE_LEAF_UUID,
+        'address': DEVICE_LEAF_ADDRESS,
+        'port': DEVICE_LEAF_PORT,
+        'settings': {},
+        'username': DEVICE_LEAF_USERNAME,
+        'password': DEVICE_LEAF_PASSWORD
+    },
+}
+
+
+def get_device_connection_info(device_uuid: str) -> Optional[Dict[str, Any]]:
+    """
+    Get device connection information for NETCONF driver.
+    
+    Args:
+        device_uuid: UUID of the device
+    
+    Returns:
+        Dictionary with connection info or None if not found
+    """
+    # Map device UUIDs to device types
+    device_mapping = {
+        DEVICE_HUB_UUID: 'hub',
+        DEVICE_LEAF_UUID: 'leaf',
+    }
+    
+    device_type = device_mapping.get(device_uuid)
+    
+    if device_type and device_type in DEVICES_CONNECTION_INFO:
+        return DEVICES_CONNECTION_INFO[device_type]
+    
+    return None
+
+
+def determine_node_identifier(device_uuid: str, pluggable_index: int) -> str:
+    """
+    Determine the node identifier (e.g., 'T2.1', 'T1.1', etc.) for the device.
+    
+    Args:
+        device_uuid: UUID of the device
+        pluggable_index: Index of the pluggable
+    
+    Returns:
+        Node identifier string
+    """
+    conn_info = get_device_connection_info(device_uuid)
+    
+    if conn_info and conn_info['address'] == DEVICE_HUB_ADDRESS:
+        return 'T2.1'  # Hub node
+    elif conn_info and conn_info['address'] == DEVICE_LEAF_ADDRESS:
+        # For multiple leaf nodes, use pluggable_index to differentiate
+        return f'T1.{pluggable_index + 1}'
+    else:
+        return 'T1.1'  # Default
diff --git a/src/pluggables/tests/PreparePluggablesTestScenario.py b/src/pluggables/tests/PreparePluggablesTestScenario.py
new file mode 100644
index 000000000..937f09099
--- /dev/null
+++ b/src/pluggables/tests/PreparePluggablesTestScenario.py
@@ -0,0 +1,170 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 copy, logging, os, pytest
+from typing import Union
+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
+)
+from common.proto.context_pb2 import Device, DeviceId, Topology, Context
+from common.tools.service.GenericGrpcService import GenericGrpcService
+from common.tests.MockServicerImpl_Context import MockServicerImpl_Context
+from common.proto.context_pb2_grpc import add_ContextServiceServicer_to_server
+from context.client.ContextClient import ContextClient
+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 pluggables.client.PluggablesClient import PluggablesClient
+from pluggables.service.PluggablesService import PluggablesService
+from pluggables.tests.CommonObjects import (
+    DEVICE_HUB, DEVICE_HUB_ID, DEVICE_HUB_UUID, DEVICE_HUB_CONNECT_RULES,
+    DEVICE_LEAF, DEVICE_LEAF_ID, DEVICE_LEAF_UUID, DEVICE_LEAF_CONNECT_RULES,
+    CONTEXT_ID, CONTEXT, TOPOLOGY_ID, TOPOLOGY,
+    get_device_hub_with_connect_rules, get_device_leaf_with_connect_rules
+)
+from common.tools.object_factory.Topology import json_topology
+
+LOGGER = logging.getLogger(__name__)
+
+LOCAL_HOST = '127.0.0.1'
+MOCKSERVICE_PORT = 10000
+
+# Configure service endpoints
+CONTEXT_SERVICE_PORT = MOCKSERVICE_PORT + get_service_port_grpc(ServiceNameEnum.CONTEXT)
+DEVICE_SERVICE_PORT = MOCKSERVICE_PORT + get_service_port_grpc(ServiceNameEnum.DEVICE)
+DSCMPLUGGABLE_SERVICE_PORT = get_service_port_grpc(ServiceNameEnum.DSCMPLUGGABLE)
+
+os.environ[get_env_var_name(ServiceNameEnum.CONTEXT, ENVVAR_SUFIX_SERVICE_HOST)]            = str(LOCAL_HOST)
+os.environ[get_env_var_name(ServiceNameEnum.CONTEXT, ENVVAR_SUFIX_SERVICE_PORT_GRPC)]       = str(CONTEXT_SERVICE_PORT)
+os.environ[get_env_var_name(ServiceNameEnum.DEVICE, ENVVAR_SUFIX_SERVICE_HOST)]             = str(LOCAL_HOST)
+os.environ[get_env_var_name(ServiceNameEnum.DEVICE, ENVVAR_SUFIX_SERVICE_PORT_GRPC)]        = str(DEVICE_SERVICE_PORT)
+os.environ[get_env_var_name(ServiceNameEnum.DSCMPLUGGABLE, ENVVAR_SUFIX_SERVICE_HOST)]      = str(LOCAL_HOST)
+os.environ[get_env_var_name(ServiceNameEnum.DSCMPLUGGABLE, ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(DSCMPLUGGABLE_SERVICE_PORT)
+
+
+class MockContextService(GenericGrpcService):
+    """Mock Context Service for testing"""
+    
+    def __init__(self, bind_port: Union[str, int]) -> None:
+        super().__init__(bind_port, LOCAL_HOST, enable_health_servicer=False, cls_name='MockContextService')
+    
+    def install_servicers(self):
+        self.context_servicer = MockServicerImpl_Context()
+        add_ContextServiceServicer_to_server(self.context_servicer, self.server)
+
+@pytest.fixture(scope='session')
+def mock_context_service():
+    """Start mock Context service for the test session"""
+    LOGGER.info('Initializing MockContextService...')
+    _service = MockContextService(CONTEXT_SERVICE_PORT)
+    _service.start()
+    yield _service
+    LOGGER.info('Terminating MockContextService...')
+    _service.stop()
+
+
+@pytest.fixture(scope='session')
+def context_client(mock_context_service):  # pylint: disable=redefined-outer-name
+    """Create Context client for the test session"""
+    LOGGER.info('Creating ContextClient...')
+    _client = ContextClient()
+    yield _client
+    LOGGER.info('Closing ContextClient...')
+    _client.close()
+
+@pytest.fixture(scope='session')
+def device_service(context_client : ContextClient):  # pylint: disable=redefined-outer-name
+    """Start Device service for the test session"""
+    LOGGER.info('Initializing DeviceService...')
+    _driver_factory = DriverFactory(DRIVERS)
+    _driver_instance_cache = DriverInstanceCache(_driver_factory)
+    _service = DeviceService(_driver_instance_cache)
+    _service.start()
+    yield _service
+    LOGGER.info('Terminating DeviceService...')
+    _service.stop()
+
+@pytest.fixture(scope='session')
+def device_client(device_service: DeviceService):  # pylint: disable=redefined-outer-name
+    """Create Device client for the test session"""
+    LOGGER.info('Creating DeviceClient...')
+    _client = DeviceClient()
+    yield _client
+    LOGGER.info('Closing DeviceClient...')
+    _client.close()
+
+
+@pytest.fixture(scope='session')
+def pluggables_service(context_client: ContextClient):
+    """Start Pluggables service for the test session"""
+    LOGGER.info('Initializing PluggablesService...')
+    _service = PluggablesService()
+    _service.start()
+    yield _service
+    LOGGER.info('Terminating PluggablesService...')
+    _service.stop()
+
+
+@pytest.fixture(scope='session')
+def pluggables_client(pluggables_service: PluggablesService,
+                      context_client: ContextClient,
+                      device_client: DeviceClient
+                      ):
+    """Create Pluggables client for the test session"""
+    LOGGER.info('Creating PluggablesClient...')
+    _client = PluggablesClient()
+    yield _client
+    LOGGER.info('Closing PluggablesClient...')
+    _client.close()
+
+
+def test_prepare_environment(
+    context_client: ContextClient,      # pylint: disable=redefined-outer-name
+    device_client: DeviceClient,        # pylint: disable=redefined-outer-name
+    pluggables_client: PluggablesClient, 
+    device_service: DeviceService ):  # pylint: disable=redefined-outer-name
+    """Prepare test environment by adding devices to Context"""
+    
+    LOGGER.info('Preparing test environment...')
+
+    
+    context_client.SetContext(Context(**CONTEXT))
+    context_client.SetTopology(Topology(**TOPOLOGY))
+    LOGGER.info('Created admin Context and Topology')
+    
+    # Add Hub device with connect rules
+    hub_device = get_device_hub_with_connect_rules()
+    context_client.SetDevice(hub_device)
+    LOGGER.info(f'Added Hub device: {DEVICE_HUB_UUID}')
+    
+    # Add Leaf device with connect rules
+    leaf_device = get_device_leaf_with_connect_rules()
+    context_client.SetDevice(leaf_device)
+    LOGGER.info(f'Added Leaf device: {DEVICE_LEAF_UUID}')
+    
+    # Verify devices were added
+    hub_device_retrieved = context_client.GetDevice(DeviceId(**DEVICE_HUB_ID))
+    assert hub_device_retrieved is not None
+    assert hub_device_retrieved.device_id.device_uuid.uuid == DEVICE_HUB_UUID
+    LOGGER.info(f'Verified Hub device: {hub_device_retrieved.name}')
+    
+    leaf_device_retrieved = context_client.GetDevice(DeviceId(**DEVICE_LEAF_ID))
+    assert leaf_device_retrieved is not None
+    assert leaf_device_retrieved.device_id.device_uuid.uuid == DEVICE_LEAF_UUID
+    LOGGER.info(f'Verified Leaf device: {leaf_device_retrieved.name}')
+
diff --git a/src/pluggables/tests/test_pluggables_with_SBI.py b/src/pluggables/tests/test_pluggables_with_SBI.py
new file mode 100644
index 000000000..7e8e56037
--- /dev/null
+++ b/src/pluggables/tests/test_pluggables_with_SBI.py
@@ -0,0 +1,296 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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, pytest
+from common.proto.context_pb2 import Empty
+from common.proto.pluggables_pb2 import Pluggable, View
+from context.client.ContextClient import ContextClient
+from device.client.DeviceClient import DeviceClient
+from pluggables.client.PluggablesClient import PluggablesClient
+from pluggables.tests.testmessages import (
+    create_pluggable_request, create_list_pluggables_request,
+    create_get_pluggable_request, create_delete_pluggable_request,
+    create_configure_pluggable_request
+)
+from pluggables.tests.CommonObjects import (
+    DEVICE_HUB_UUID, DEVICE_LEAF_UUID
+)
+from pluggables.tests.PreparePluggablesTestScenario import (  # pylint: disable=unused-import
+    # be careful, order of symbols is important here!
+    mock_context_service, context_client, device_service, device_client,
+    pluggables_service, pluggables_client, test_prepare_environment
+)
+
+logging.basicConfig(level=logging.DEBUG)
+LOGGER = logging.getLogger(__name__)
+LOGGER.setLevel(logging.DEBUG)
+
+@pytest.fixture(autouse=True)
+def log_all_methods(request):
+    '''
+    This fixture logs messages before and after each test function runs, indicating the start and end of the test.
+    The autouse=True parameter ensures that this logging happens automatically for all tests in the module.
+    '''
+    LOGGER.info(f" >>>>> Starting test: {request.node.name} ")
+    yield
+    LOGGER.info(f" <<<<< Finished test: {request.node.name} ")
+
+# ----- Pluggable Tests with NETCONF -----------------------------------------
+
+# Number 1.
+def test_create_pluggable_hub_without_config(pluggables_client: PluggablesClient):
+    """Test creating a pluggable on Hub device without initial configuration"""
+    LOGGER.info('Creating Pluggable on Hub device without config...')
+    
+    _request = create_pluggable_request(
+        device_uuid=DEVICE_HUB_UUID,
+        preferred_pluggable_index=1,    # set 1 for HUB and leaf-1, 2 for leaf-2 and 3 for leaf-3
+        with_initial_config=False
+    )
+    
+    _pluggable = pluggables_client.CreatePluggable(_request)
+    
+    assert isinstance(_pluggable, Pluggable)
+    assert _pluggable.id.device.device_uuid.uuid == DEVICE_HUB_UUID
+    assert _pluggable.id.pluggable_index == 1
+    LOGGER.info(f'Created Pluggable on Hub: {_pluggable.id}')
+
+# Number 2.
+@pytest.mark.integration
+def test_create_pluggable_hub_with_config(pluggables_client: PluggablesClient):
+    """Test creating a pluggable on Hub device with initial configuration
+    
+    Requires: Real NETCONF device at 10.30.7.7:2023
+    """
+    LOGGER.info('Creating Pluggable on Hub device with config...')
+    
+    _request = create_pluggable_request(
+        device_uuid=DEVICE_HUB_UUID,
+        preferred_pluggable_index=2,  # Use index 2 to avoid conflict with test #1
+        with_initial_config=True
+    )
+    
+    _pluggable = pluggables_client.CreatePluggable(_request)
+    
+    assert isinstance(_pluggable, Pluggable)
+    assert _pluggable.id.device.device_uuid.uuid == DEVICE_HUB_UUID
+    assert _pluggable.id.pluggable_index == 2
+    assert len(_pluggable.config.dsc_groups) == 1  # Should be 1, not 2 (check testmessages.py)
+    
+    # Verify DSC group configuration
+    dsc_group = _pluggable.config.dsc_groups[0]
+    assert dsc_group.group_size == 4  # From testmessages.py
+    assert len(dsc_group.subcarriers) == 2
+    
+    LOGGER.info(f'Created Pluggable on Hub with {len(dsc_group.subcarriers)} subcarriers')
+
+# Number 3.
+@pytest.mark.integration
+def test_create_pluggable_leaf_with_config(pluggables_client: PluggablesClient):
+    """Test creating a pluggable on Leaf device with initial configuration
+    
+    Requires: Real NETCONF device at 10.30.7.8:2023
+    """
+    LOGGER.info('Creating Pluggable on Leaf device with config...')
+    
+    _request = create_pluggable_request(
+        device_uuid=DEVICE_LEAF_UUID,
+        preferred_pluggable_index=1,
+        with_initial_config=True
+    )
+    
+    _pluggable = pluggables_client.CreatePluggable(_request)
+    
+    assert isinstance(_pluggable, Pluggable)
+    assert _pluggable.id.device.device_uuid.uuid == DEVICE_LEAF_UUID
+    assert _pluggable.id.pluggable_index == 1  # Should be 1, not 0
+    assert len(_pluggable.config.dsc_groups) == 1
+    
+    LOGGER.info(f'Created Pluggable on Leaf: {_pluggable.id}')
+
+# Number 4.
+@pytest.mark.integration
+def test_configure_pluggable_hub(pluggables_client: PluggablesClient):
+    """Test configuring an existing pluggable on Hub device"""
+    LOGGER.info('Configuring existing Pluggable on Hub device...')
+    
+    # First, create a pluggable without config
+    _create_request = create_pluggable_request(
+        device_uuid=DEVICE_HUB_UUID,
+        preferred_pluggable_index=3,  # Use index 3 to avoid conflicts
+        with_initial_config=False
+    )
+    _created = pluggables_client.CreatePluggable(_create_request)
+    assert _created.id.pluggable_index == 3
+    
+    # Now configure it
+    _config_request = create_configure_pluggable_request(
+        device_uuid=DEVICE_HUB_UUID,
+        pluggable_index=3,  # Match the created index
+        view_level=View.VIEW_FULL
+    )
+    
+    _configured = pluggables_client.ConfigurePluggable(_config_request)
+    
+    assert isinstance(_configured, Pluggable)
+    assert _configured.id.device.device_uuid.uuid == DEVICE_HUB_UUID
+    assert _configured.id.pluggable_index == 3
+    assert len(_configured.config.dsc_groups) == 1
+    
+    # Verify configuration was applied
+    dsc_group = _configured.config.dsc_groups[0]
+    assert dsc_group.group_size == 2
+    assert len(dsc_group.subcarriers) == 2
+    
+    LOGGER.info(f'Configured Pluggable on Hub with {len(dsc_group.subcarriers)} subcarriers')
+
+# Number 5.
+@pytest.mark.integration
+def test_get_pluggable(pluggables_client: PluggablesClient):
+    """Test retrieving an existing pluggable
+    
+    Requires: Real NETCONF device at 10.30.7.7:2023
+    """
+    LOGGER.info('Getting existing Pluggable...')
+    
+    # Create a pluggable first
+    _create_request = create_pluggable_request(
+        device_uuid=DEVICE_HUB_UUID,
+        preferred_pluggable_index=4,  # Use index 4 to avoid conflicts
+        with_initial_config=True
+    )
+    _created = pluggables_client.CreatePluggable(_create_request)
+    
+    # Now get it
+    _get_request = create_get_pluggable_request(
+        device_uuid=DEVICE_HUB_UUID,
+        pluggable_index=4,  # Match the created index
+        view_level=View.VIEW_FULL
+    )
+    
+    _retrieved = pluggables_client.GetPluggable(_get_request)
+    
+    assert isinstance(_retrieved, Pluggable)
+    assert _retrieved.id.device.device_uuid.uuid == DEVICE_HUB_UUID
+    assert _retrieved.id.pluggable_index == 4
+    assert len(_retrieved.config.dsc_groups) == len(_created.config.dsc_groups)
+    
+    LOGGER.info(f'Retrieved Pluggable: {_retrieved.id}')
+
+# Number 6.
+def test_list_pluggables(pluggables_client: PluggablesClient):
+    """Test listing all pluggables for a device"""
+    LOGGER.info('Listing Pluggables for Hub device...')
+    
+    _list_request = create_list_pluggables_request(
+        device_uuid=DEVICE_HUB_UUID,
+        view_level=View.VIEW_CONFIG
+    )
+    
+    _response = pluggables_client.ListPluggables(_list_request)
+    
+    assert _response is not None
+    assert len(_response.pluggables) >= 1  # At least one from previous tests
+    
+    for pluggable in _response.pluggables:
+        assert pluggable.id.device.device_uuid.uuid == DEVICE_HUB_UUID
+        LOGGER.info(f'Found Pluggable: index={pluggable.id.pluggable_index}')
+
+# Number 7.
+@pytest.mark.integration
+def test_delete_pluggable(pluggables_client: PluggablesClient):
+    """Test deleting a pluggable
+    
+    Requires: Real NETCONF device at 10.30.7.8:2023
+    """
+    LOGGER.info('Deleting Pluggable...')
+    
+    # Create a pluggable to delete
+    _create_request = create_pluggable_request(
+        device_uuid=DEVICE_LEAF_UUID,
+        preferred_pluggable_index=2,  # Use index 2 to avoid conflict with test #3
+        with_initial_config=True
+    )
+    _created = pluggables_client.CreatePluggable(_create_request)
+    assert _created.id.pluggable_index == 2
+    
+    # Delete it
+    _delete_request = create_delete_pluggable_request(
+        device_uuid=DEVICE_LEAF_UUID,
+        pluggable_index=2
+    )
+    
+    _response = pluggables_client.DeletePluggable(_delete_request)
+    assert isinstance(_response, Empty)
+    
+    # Verify it's deleted
+    with pytest.raises(grpc.RpcError) as e:
+        _get_request = create_get_pluggable_request(
+            device_uuid=DEVICE_LEAF_UUID,
+            pluggable_index=2
+        )
+        pluggables_client.GetPluggable(_get_request)
+    
+    assert e.value.code() == grpc.StatusCode.NOT_FOUND
+    LOGGER.info('Successfully deleted Pluggable and verified removal')
+
+# Number 8.
+def test_pluggable_already_exists_error(pluggables_client: PluggablesClient):
+    """Test that creating a pluggable with same key raises ALREADY_EXISTS"""
+    LOGGER.info('Testing ALREADY_EXISTS error...')
+    
+    _request = create_pluggable_request(
+        device_uuid=DEVICE_LEAF_UUID,
+        preferred_pluggable_index=3,  # Use index 3
+        with_initial_config=False
+    )
+    
+    # Create first time - should succeed
+    _pluggable = pluggables_client.CreatePluggable(_request)
+    assert _pluggable.id.pluggable_index == 3  # Should be 3, not 5
+    
+    # Try to create again - should fail
+    with pytest.raises(grpc.RpcError) as e:
+        pluggables_client.CreatePluggable(_request)
+    
+    assert e.value.code() == grpc.StatusCode.ALREADY_EXISTS
+    LOGGER.info('Successfully caught ALREADY_EXISTS error')
+
+# Number 9.
+def test_pluggable_not_found_error(pluggables_client: PluggablesClient):
+    """Test that getting non-existent pluggable raises NOT_FOUND"""
+    LOGGER.info('Testing NOT_FOUND error...')
+    
+    _request = create_get_pluggable_request(
+        device_uuid=DEVICE_HUB_UUID,
+        pluggable_index=999,  # Non-existent index
+        view_level=View.VIEW_FULL
+    )
+    
+    with pytest.raises(grpc.RpcError) as e:
+        pluggables_client.GetPluggable(_request)
+    
+    assert e.value.code() == grpc.StatusCode.NOT_FOUND
+    LOGGER.info('Successfully caught NOT_FOUND error')
+
+
+# ----- Cleanup Tests --------------------------------------------------------
+
+def test_cleanup_environment(
+    context_client: ContextClient,      # pylint: disable=redefined-outer-name
+    pluggables_client: PluggablesClient):  # pylint: disable=redefined-outer-name
+    """Cleanup test environment by removing test devices"""
+    
+    
+    LOGGER.info('Test environment cleanup completed')
diff --git a/src/pluggables/tests/testmessages.py b/src/pluggables/tests/testmessages.py
index d67a022c4..9a0fb5a05 100644
--- a/src/pluggables/tests/testmessages.py
+++ b/src/pluggables/tests/testmessages.py
@@ -52,6 +52,12 @@ def create_pluggable_request(
         _request.initial_config.id.device.device_uuid.uuid = device_uuid
         _request.initial_config.id.pluggable_index = preferred_pluggable_index or 0
         
+        # Set top-level PluggableConfig fields
+        _request.initial_config.center_frequency_mhz = 193100000  # 193.1 THz in MHz
+        _request.initial_config.operational_mode = 1  # Operational mode
+        _request.initial_config.target_output_power_dbm = -10.0  # Target output power
+        _request.initial_config.line_port = 1  # Line port number
+        
         # Add sample DSC group configuration
         dsc_group = _request.initial_config.dsc_groups.add()
         dsc_group.id.pluggable.device.device_uuid.uuid = device_uuid
@@ -188,6 +194,12 @@ def create_configure_pluggable_request(
     _request.config.id.device.device_uuid.uuid = device_uuid
     _request.config.id.pluggable_index         = pluggable_index
     
+    # Set top-level PluggableConfig fields
+    _request.config.center_frequency_mhz       = 193100000  # 193.1 THz in MHz
+    _request.config.operational_mode           = 1  # Operational mode
+    _request.config.target_output_power_dbm    = -10.0  # Target output power
+    _request.config.line_port                  = 1  # Line port number
+    
     # Add DSC group configuration
     group_1 = _request.config.dsc_groups.add()
     group_1.id.pluggable.device.device_uuid.uuid = device_uuid
diff --git a/src/pytest.ini b/src/pytest.ini
new file mode 100644
index 000000000..6dfc29442
--- /dev/null
+++ b/src/pytest.ini
@@ -0,0 +1,18 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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.
+
+
+[pytest]
+markers =
+    integration: tests that require real NETCONF devices or external infrastructure
-- 
GitLab


From 427ed4e3e40a46f45f0dcbd6e52eb443def094b0 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Thu, 30 Oct 2025 05:21:55 +0000
Subject: [PATCH 035/111] feat: Add Pluggables Component activation options in
 deployment scripts and CI configuration

---
 deploy/all.sh                 |   3 +
 my_deploy.sh                  |   3 +
 src/pluggables/.gitlab-ci.yml | 102 ++++++++++++++++++++++++++++++++++
 3 files changed, 108 insertions(+)

diff --git a/deploy/all.sh b/deploy/all.sh
index bd171eb66..85e27a640 100755
--- a/deploy/all.sh
+++ b/deploy/all.sh
@@ -69,6 +69,9 @@ export TFS_COMPONENTS=${TFS_COMPONENTS:-"context device pathcomp service slice n
 # Uncomment to activate E2E Orchestrator
 #export TFS_COMPONENTS="${TFS_COMPONENTS} e2e_orchestrator"
 
+# Uncomment to activate Pluggables Component
+#export TFS_COMPONENTS="${TFS_COMPONENTS} pluggables"
+
 # 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 86c1a86f4..b8ed95a82 100644
--- a/my_deploy.sh
+++ b/my_deploy.sh
@@ -95,6 +95,9 @@ export TFS_COMPONENTS="context device pathcomp service nbi webui"
 # Uncomment to activate Load Generator
 #export TFS_COMPONENTS="${TFS_COMPONENTS} load_generator"
 
+# Uncomment to activate Pluggables Component
+#export TFS_COMPONENTS="${TFS_COMPONENTS} pluggables"
+
 
 # Set the tag you want to use for your images.
 export TFS_IMAGE_TAG="dev"
diff --git a/src/pluggables/.gitlab-ci.yml b/src/pluggables/.gitlab-ci.yml
index 7363515f0..b9e58b0e8 100644
--- a/src/pluggables/.gitlab-ci.yml
+++ b/src/pluggables/.gitlab-ci.yml
@@ -11,3 +11,105 @@
 # 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 pluggables:
+  variables:
+    IMAGE_NAME: 'pluggables' # name of the microservice
+    IMAGE_TAG: 'latest' # tag of the container image (production, development, etc)
+  stage: build
+  before_script:
+    - docker image prune --force
+    - 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 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/Dockerfile
+      - src/$IMAGE_NAME/tests/*.py
+      - manifests/${IMAGE_NAME}service.yaml
+      - .gitlab-ci.yml
+
+# Apply unit test to the component
+unit_test pluggables:
+  variables:
+    IMAGE_NAME: 'pluggables' # name of the microservice
+    IMAGE_TAG: 'latest' # tag of the container image (production, development, etc)
+  stage: unit_test
+  needs:
+    - build pluggables
+  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 context; then docker rm -f context; else echo "context container 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 "$CI_REGISTRY_IMAGE/context:$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
+    - CRDB_ADDRESS=$(docker inspect crdb --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}")
+    - echo $CRDB_ADDRESS
+    - >
+      docker run --name context -d -p 1010:1010
+      --env "CRDB_URI=cockroachdb://tfs:tfs123@${CRDB_ADDRESS}:26257/tfs_test?sslmode=require"
+      --network=teraflowbridge
+      $CI_REGISTRY_IMAGE/context:$IMAGE_TAG
+    - docker ps -a
+    - CONTEXT_ADDRESS=$(docker inspect context --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}")
+    - echo $CONTEXT_ADDRESS
+    - >
+      docker run --name $IMAGE_NAME -d -p 30040:30040
+      --env "CONTEXTSERVICE_SERVICE_HOST=${CONTEXT_ADDRESS}"
+      --env "CONTEXTSERVICE_SERVICE_PORT_GRPC=1010"
+      --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 rm -f $IMAGE_NAME context crdb
+    - 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/Dockerfile
+      - src/$IMAGE_NAME/tests/*.py
+      - manifests/${IMAGE_NAME}service.yaml
+      - .gitlab-ci.yml
+  artifacts:
+    when: always
+    reports:
+      junit: src/$IMAGE_NAME/tests/${IMAGE_NAME}_report.xml
-- 
GitLab


From fd8fe619b71f90f8d622e12d2237775195d9ade7 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Thu, 30 Oct 2025 05:54:56 +0000
Subject: [PATCH 036/111] refactor: Pluggable component

- Removed DSCM form pluggable ServiceEnumName
- Other minor changes
---
 proto/pluggables.proto                        | 18 ++++++++-
 src/common/Constants.py                       |  4 +-
 src/device/service/drivers/__init__.py        | 26 ++++++-------
 src/pluggables/README.md                      | 38 +++++++++----------
 src/pluggables/client/PluggablesClient.py     |  4 +-
 src/pluggables/requirements.in                | 14 +++++++
 src/pluggables/service/PluggablesService.py   |  2 +-
 .../tests/PreparePluggablesTestScenario.py    |  6 +--
 src/pluggables/tests/test_Pluggables.py       |  6 +--
 9 files changed, 73 insertions(+), 45 deletions(-)

diff --git a/proto/pluggables.proto b/proto/pluggables.proto
index d6abe9daf..8036a24be 100644
--- a/proto/pluggables.proto
+++ b/proto/pluggables.proto
@@ -1,6 +1,21 @@
+// Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 tfs.pluggables.v0;
+package pluggables;
 
 import "context.proto";
 
@@ -13,7 +28,6 @@ service PluggablesService {
 }
 
 
-
 message PluggableId {
   context.DeviceId device = 1;
   int32 pluggable_index   = 2;  // physical slot number in the device
diff --git a/src/common/Constants.py b/src/common/Constants.py
index d00599ac2..e98807c96 100644
--- a/src/common/Constants.py
+++ b/src/common/Constants.py
@@ -75,7 +75,7 @@ class ServiceNameEnum(Enum):
     ANALYTICSBACKEND       = 'analytics-backend'
     QOSPROFILE             = 'qos-profile'
     OSMCLIENT              = 'osm-client'
-    DSCMPLUGGABLE          = 'dscm-pluggable'
+    PLUGGABLES              = 'dscm-pluggable'
 
     # Used for test and debugging only
     DLT_GATEWAY    = 'dltgateway'
@@ -118,7 +118,7 @@ DEFAULT_SERVICE_GRPC_PORTS = {
     ServiceNameEnum.ANALYTICSBACKEND       .value : 30090,
     ServiceNameEnum.AUTOMATION             .value : 30200,
     ServiceNameEnum.OSMCLIENT              .value : 30210,
-    ServiceNameEnum.DSCMPLUGGABLE          .value : 30220,
+    ServiceNameEnum.PLUGGABLES             .value : 30220,
 
     # Used for test and debugging only
     ServiceNameEnum.DLT_GATEWAY   .value : 50051,
diff --git a/src/device/service/drivers/__init__.py b/src/device/service/drivers/__init__.py
index 21a0ec111..5768e2310 100644
--- a/src/device/service/drivers/__init__.py
+++ b/src/device/service/drivers/__init__.py
@@ -98,19 +98,19 @@ if LOAD_ALL_DEVICE_DRIVERS:
             }
         ]))
 
-# if LOAD_ALL_DEVICE_DRIVERS:
-#     from .gnmi_openconfig.GnmiOpenConfigDriver import GnmiOpenConfigDriver # pylint: disable=wrong-import-position
-#     DRIVERS.append(
-#         (GnmiOpenConfigDriver, [
-#             {
-#                 # Real Packet Router, specifying gNMI OpenConfig Driver => use GnmiOpenConfigDriver
-#                 FilterFieldEnum.DEVICE_TYPE: [
-#                     DeviceTypeEnum.PACKET_POP,
-#                     DeviceTypeEnum.PACKET_ROUTER,
-#                 ],
-#                 FilterFieldEnum.DRIVER     : DeviceDriverEnum.DEVICEDRIVER_GNMI_OPENCONFIG,
-#             }
-#         ]))
+if LOAD_ALL_DEVICE_DRIVERS:
+    from .gnmi_openconfig.GnmiOpenConfigDriver import GnmiOpenConfigDriver # pylint: disable=wrong-import-position
+    DRIVERS.append(
+        (GnmiOpenConfigDriver, [
+            {
+                # Real Packet Router, specifying gNMI OpenConfig Driver => use GnmiOpenConfigDriver
+                FilterFieldEnum.DEVICE_TYPE: [
+                    DeviceTypeEnum.PACKET_POP,
+                    DeviceTypeEnum.PACKET_ROUTER,
+                ],
+                FilterFieldEnum.DRIVER     : DeviceDriverEnum.DEVICEDRIVER_GNMI_OPENCONFIG,
+            }
+        ]))
 
 if LOAD_ALL_DEVICE_DRIVERS:
     from .gnmi_nokia_srlinux.GnmiNokiaSrLinuxDriver import GnmiNokiaSrLinuxDriver # pylint: disable=wrong-import-position
diff --git a/src/pluggables/README.md b/src/pluggables/README.md
index b76723ecf..c679a8c7c 100644
--- a/src/pluggables/README.md
+++ b/src/pluggables/README.md
@@ -1,8 +1,8 @@
-# DSCM (Digital Subcarrier Multipelxed) Service
+# Pluggables Service (Digital Subcarrier Multiplexed)
 
 ## Overview
 
-The DSCM service provides gRPC-based management for optical pluggables and their digital subcarrier groups. It enables configuration and monitoring of coherent optical transceivers with support for multi-carrier operation.
+The Pluggables service provides gRPC-based management for optical pluggables and their digital subcarrier groups. It enables configuration and monitoring of coherent optical transceivers with support for multi-carrier operation.
 
 ## Key Concepts
 
@@ -47,11 +47,11 @@ Control the level of detail in responses:
 ### 1. Creating a Pluggable Without Configuration
 
 ```python
-from dscm.client.DscmPluggableClient import DscmPluggableClient
-from dscm.tests.testmessages import create_pluggable_request
+from pluggables.client.PluggablesClient import PluggablesClient
+from pluggables.tests.testmessages import create_pluggable_request
 
 # Create client
-client = DscmPluggableClient()
+client = PluggablesClient()
 
 # Create pluggable request (auto-assign index)
 request = create_pluggable_request(
@@ -70,7 +70,7 @@ client.close()
 ### 2. Creating a Pluggable With Initial Configuration
 
 ```python
-from dscm.tests.testmessages import create_pluggable_request
+from pluggables.tests.testmessages import create_pluggable_request
 
 # Create pluggable with optical channel configuration
 request = create_pluggable_request(
@@ -91,8 +91,8 @@ assert dsc_group.group_capacity_gbps == 400.0
 ### 3. Listing Pluggables with View Filtering
 
 ```python
-from common.proto.dscm_pluggable_pb2 import View
-from dscm.tests.testmessages import create_list_pluggables_request
+from common.proto.pluggables_pb2 import View
+from pluggables.tests.testmessages import create_list_pluggables_request
 
 # List only configuration (no state data)
 request = create_list_pluggables_request(
@@ -108,7 +108,7 @@ for pluggable in response.pluggables:
 ### 4. Getting a Specific Pluggable
 
 ```python
-from dscm.tests.testmessages import create_get_pluggable_request
+from pluggables.tests.testmessages import create_get_pluggable_request
 
 # Get full pluggable details
 request = create_get_pluggable_request(
@@ -126,7 +126,7 @@ print(f"DSC Groups: {len(pluggable.config.dsc_groups)}")
 ### 5. Configuring a Pluggable
 
 ```python
-from dscm.tests.testmessages import create_configure_pluggable_request
+from pluggables.tests.testmessages import create_configure_pluggable_request
 
 # Apply full configuration (reconfigure optical channels)
 request = create_configure_pluggable_request(
@@ -148,7 +148,7 @@ print(f"Configured {len(pluggable.config.dsc_groups[0].subcarriers)} subcarriers
 ### 6. Deleting a Pluggable
 
 ```python
-from dscm.tests.testmessages import create_delete_pluggable_request
+from pluggables.tests.testmessages import create_delete_pluggable_request
 
 # Delete pluggable from management
 request = create_delete_pluggable_request(
@@ -165,10 +165,10 @@ print("Pluggable deleted successfully")
 ### Complete Configuration Example
 
 ```python
-from common.proto import dscm_pluggable_pb2
+from common.proto import pluggables_pb2
 
 # Create configuration request
-request = dscm_pluggable_pb2.ConfigurePluggableRequest()
+request = pluggables_pb2.ConfigurePluggableRequest()
 
 # Set pluggable ID
 request.config.id.device.device_uuid.uuid = "550e8400-e29b-41d4-a716-446655440000"
@@ -199,15 +199,15 @@ subcarrier2 = dsc_group.subcarriers.add()
 # ... (similar configuration for second subcarrier)
 
 # Set view level and timeout
-request.view_level = dscm_pluggable_pb2.VIEW_FULL
+request.view_level = pluggables_pb2.VIEW_FULL
 request.apply_timeout_seconds = 30
 ```
 
 ## API Reference
 
 For complete API documentation, see:
-- Protocol Buffer definitions: `/home/ubuntu/tfs-ctrl/proto/dscm_pluggable.proto`
-- Client implementation: `/home/ubuntu/tfs-ctrl/src/dscm/client/DscmPluggableClient.py`
-- Service implementation: `/home/ubuntu/tfs-ctrl/src/dscm/service/DscmPluggableServiceServicerImpl.py`
-- Test examples: `/home/ubuntu/tfs-ctrl/src/dscm/tests/test_DscmPluggables.py`
-- Message helpers: `/home/ubuntu/tfs-ctrl/src/dscm/tests/testmessages.py`
+- Protocol Buffer definitions: `proto/pluggables.proto`
+- Client implementation: `src/pluggables/client/PluggablesClient.py`
+- Service implementation: `src/pluggables/service/PluggablesServiceServicerImpl.py`
+- Test examples: `src/pluggables/tests/test_Pluggables.py`
+- Message helpers: `src/pluggables/tests/testmessages.py`
diff --git a/src/pluggables/client/PluggablesClient.py b/src/pluggables/client/PluggablesClient.py
index f8e7deadb..559619294 100644
--- a/src/pluggables/client/PluggablesClient.py
+++ b/src/pluggables/client/PluggablesClient.py
@@ -32,8 +32,8 @@ RETRY_DECORATOR = retry(max_retries=MAX_RETRIES, delay_function=DELAY_FUNCTION,
 
 class PluggablesClient:
     def __init__(self, host=None, port=None):
-        if not host: host = get_service_host(ServiceNameEnum.DSCMPLUGGABLE) 
-        if not port: port = get_service_port_grpc(ServiceNameEnum.DSCMPLUGGABLE) 
+        if not host: host = get_service_host(ServiceNameEnum.PLUGGABLES) 
+        if not port: port = get_service_port_grpc(ServiceNameEnum.PLUGGABLES) 
         self.endpoint     = '{:s}:{:s}'.format(str(host), str(port))
         LOGGER.debug('Creating channel to {:s}...'.format(str(self.endpoint)))
 
diff --git a/src/pluggables/requirements.in b/src/pluggables/requirements.in
index e69de29bb..3ccc21c7d 100644
--- a/src/pluggables/requirements.in
+++ b/src/pluggables/requirements.in
@@ -0,0 +1,14 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/pluggables/service/PluggablesService.py b/src/pluggables/service/PluggablesService.py
index 92e9aa6e1..65675ec3c 100644
--- a/src/pluggables/service/PluggablesService.py
+++ b/src/pluggables/service/PluggablesService.py
@@ -20,7 +20,7 @@ from pluggables.service.PluggablesServiceServicerImpl import PluggablesServiceSe
 
 class PluggablesService(GenericGrpcService):
     def __init__(self, cls_name: str = __name__) -> None:
-        port = get_service_port_grpc(ServiceNameEnum.DSCMPLUGGABLE)
+        port = get_service_port_grpc(ServiceNameEnum.PLUGGABLES)
         super().__init__(port, cls_name=cls_name)
         self.dscmPluggableService_servicer = PluggablesServiceServicerImpl()
 
diff --git a/src/pluggables/tests/PreparePluggablesTestScenario.py b/src/pluggables/tests/PreparePluggablesTestScenario.py
index 937f09099..c6fdd62fd 100644
--- a/src/pluggables/tests/PreparePluggablesTestScenario.py
+++ b/src/pluggables/tests/PreparePluggablesTestScenario.py
@@ -47,14 +47,14 @@ MOCKSERVICE_PORT = 10000
 # Configure service endpoints
 CONTEXT_SERVICE_PORT = MOCKSERVICE_PORT + get_service_port_grpc(ServiceNameEnum.CONTEXT)
 DEVICE_SERVICE_PORT = MOCKSERVICE_PORT + get_service_port_grpc(ServiceNameEnum.DEVICE)
-DSCMPLUGGABLE_SERVICE_PORT = get_service_port_grpc(ServiceNameEnum.DSCMPLUGGABLE)
+DSCMPLUGGABLE_SERVICE_PORT = get_service_port_grpc(ServiceNameEnum.PLUGGABLES)
 
 os.environ[get_env_var_name(ServiceNameEnum.CONTEXT, ENVVAR_SUFIX_SERVICE_HOST)]            = str(LOCAL_HOST)
 os.environ[get_env_var_name(ServiceNameEnum.CONTEXT, ENVVAR_SUFIX_SERVICE_PORT_GRPC)]       = str(CONTEXT_SERVICE_PORT)
 os.environ[get_env_var_name(ServiceNameEnum.DEVICE, ENVVAR_SUFIX_SERVICE_HOST)]             = str(LOCAL_HOST)
 os.environ[get_env_var_name(ServiceNameEnum.DEVICE, ENVVAR_SUFIX_SERVICE_PORT_GRPC)]        = str(DEVICE_SERVICE_PORT)
-os.environ[get_env_var_name(ServiceNameEnum.DSCMPLUGGABLE, ENVVAR_SUFIX_SERVICE_HOST)]      = str(LOCAL_HOST)
-os.environ[get_env_var_name(ServiceNameEnum.DSCMPLUGGABLE, ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(DSCMPLUGGABLE_SERVICE_PORT)
+os.environ[get_env_var_name(ServiceNameEnum.PLUGGABLES, ENVVAR_SUFIX_SERVICE_HOST)]      = str(LOCAL_HOST)
+os.environ[get_env_var_name(ServiceNameEnum.PLUGGABLES, ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(DSCMPLUGGABLE_SERVICE_PORT)
 
 
 class MockContextService(GenericGrpcService):
diff --git a/src/pluggables/tests/test_Pluggables.py b/src/pluggables/tests/test_Pluggables.py
index 5e12ad1a3..8528c4330 100644
--- a/src/pluggables/tests/test_Pluggables.py
+++ b/src/pluggables/tests/test_Pluggables.py
@@ -43,9 +43,9 @@ from pluggables.tests.testmessages import (create_pluggable_request,
 
 LOCAL_HOST = '127.0.0.1'
 
-DSCMPLUGGABLE_SERVICE_PORT = get_service_port_grpc(ServiceNameEnum.DSCMPLUGGABLE)  # type: ignore
-os.environ[get_env_var_name(ServiceNameEnum.DSCMPLUGGABLE, ENVVAR_SUFIX_SERVICE_HOST     )] = str(LOCAL_HOST)
-os.environ[get_env_var_name(ServiceNameEnum.DSCMPLUGGABLE, ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(DSCMPLUGGABLE_SERVICE_PORT)
+DSCMPLUGGABLE_SERVICE_PORT = get_service_port_grpc(ServiceNameEnum.PLUGGABLES)  # type: ignore
+os.environ[get_env_var_name(ServiceNameEnum.PLUGGABLES, ENVVAR_SUFIX_SERVICE_HOST     )] = str(LOCAL_HOST)
+os.environ[get_env_var_name(ServiceNameEnum.PLUGGABLES, ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(DSCMPLUGGABLE_SERVICE_PORT)
 
 LOGGER = logging.getLogger(__name__)
 
-- 
GitLab


From 889cb6e1390cb8793637c5f01c27aa77631f5878 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Thu, 30 Oct 2025 06:18:32 +0000
Subject: [PATCH 037/111] Remove unused DSCM plugin files and related
 components

- Deleted the `datastore.py`, `dscm.py`, `path_resolver.py`, and `requirements.txt` files as they are no longer needed.
- Removed the global store instance and device-specific store logic from `routes.py`.
- Commented out and removed unused route handlers for device configuration in `routes.py`.
- Updated test messages in `dscm_messages.py` to maintain consistency.
- Added backward compatibility in L3VPN handlers
---
 proto/context.proto                           |   1 -
 src/nbi/Dockerfile                            |   2 -
 src/nbi/service/ietf_l3vpn/Handlers.py        |  25 +-
 .../dscm_oc/datamodels/__init__.py            |  14 -
 .../dscm_oc/datamodels/device_dscm-1.json     | 710 ------------------
 .../dscm_oc/datamodels/device_dscm-2.json     | 668 ----------------
 .../dscm_oc/datamodels/device_hub.json        |   1 -
 .../dscm_oc/datamodels/dscm_store.json        | 668 ----------------
 .../nbi_plugins/dscm_oc/datastore.py          | 265 -------
 .../rest_server/nbi_plugins/dscm_oc/dscm.py   |  60 --
 .../nbi_plugins/dscm_oc/path_resolver.py      | 143 ----
 .../nbi_plugins/dscm_oc/requirements.txt      |   5 -
 .../rest_server/nbi_plugins/dscm_oc/routes.py |  82 +-
 src/nbi/tests/messages/dscm_messages.py       |   2 +-
 14 files changed, 27 insertions(+), 2619 deletions(-)
 delete mode 100644 src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/__init__.py
 delete mode 100644 src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/device_dscm-1.json
 delete mode 100644 src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/device_dscm-2.json
 delete mode 100644 src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/device_hub.json
 delete mode 100644 src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/dscm_store.json
 delete mode 100644 src/nbi/service/rest_server/nbi_plugins/dscm_oc/datastore.py
 delete mode 100644 src/nbi/service/rest_server/nbi_plugins/dscm_oc/dscm.py
 delete mode 100644 src/nbi/service/rest_server/nbi_plugins/dscm_oc/path_resolver.py
 delete mode 100644 src/nbi/service/rest_server/nbi_plugins/dscm_oc/requirements.txt

diff --git a/proto/context.proto b/proto/context.proto
index 4833d9c22..9fde6a3c1 100644
--- a/proto/context.proto
+++ b/proto/context.proto
@@ -252,7 +252,6 @@ enum DeviceDriverEnum {
   DEVICEDRIVER_RYU = 18;
   DEVICEDRIVER_GNMI_NOKIA_SRLINUX = 19;
   DEVICEDRIVER_OPENROADM = 20;
-  DRVICEDRIVER_NETCONF_DSCM = 21;
 }
 
 enum DeviceOperationalStatusEnum {
diff --git a/src/nbi/Dockerfile b/src/nbi/Dockerfile
index 651a8e1ee..e34aaa36d 100644
--- a/src/nbi/Dockerfile
+++ b/src/nbi/Dockerfile
@@ -77,8 +77,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/device/service/drivers/netconf_dscm/. device/service/drivers/netconf_dscm/
-COPY src/device/service/driver_api/_Driver.py device/service/driver_api/_Driver.py
 COPY src/service/__init__.py service/__init__.py
 COPY src/service/client/. service/client/
 COPY src/slice/__init__.py slice/__init__.py
diff --git a/src/nbi/service/ietf_l3vpn/Handlers.py b/src/nbi/service/ietf_l3vpn/Handlers.py
index b48d96451..c5efc0d5a 100644
--- a/src/nbi/service/ietf_l3vpn/Handlers.py
+++ b/src/nbi/service/ietf_l3vpn/Handlers.py
@@ -115,8 +115,10 @@ def process_site_network_access(
 ) -> None:
     endpoint_uuid = network_access['site-network-access-id']
 
-    if network_access['site-network-access-type'] != 'ietf-l3vpn-svc:multipoint':
-    # if network_access['site-network-access-type'] != 'multipoint':
+    if 'ietf-l3vpn-svc' in network_access['site-network-access-type']:
+        # replace 'ietf-l3vpn-svc:multipoint' with 'multipoint' for backward compatibility
+        network_access['site-network-access-type'] = network_access['site-network-access-type'].replace('ietf-l3vpn-svc:', '')
+    if network_access['site-network-access-type'] != 'multipoint':
         MSG = 'Site Network Access Type: {:s}'
         raise NotImplementedError(MSG.format(str(network_access['site-network-access-type'])))
 
@@ -130,8 +132,10 @@ def process_site_network_access(
         raise NotImplementedError(MSG.format(str(network_access['site-network-access-type'])))
 
     ipv4_allocation = network_access['ip-connection']['ipv4']
-    if ipv4_allocation['address-allocation-type'] != 'ietf-l3vpn-svc:static-address':
-    # if ipv4_allocation['address-allocation-type'] != 'static-address':
+    if 'ietf-l3vpn-svc' in ipv4_allocation['address-allocation-type']:
+        # replace 'ietf-l3vpn-svc:static-address' with 'static-address' for backward compatibility
+        ipv4_allocation['address-allocation-type'] = ipv4_allocation['address-allocation-type'].replace('ietf-l3vpn-svc:', '')
+    if ipv4_allocation['address-allocation-type'] != 'static-address':
         MSG = 'Site Network Access IPv4 Allocation Type: {:s}'
         raise NotImplementedError(MSG.format(str(ipv4_allocation['address-allocation-type'])))
     ipv4_allocation_addresses = ipv4_allocation['addresses']
@@ -173,8 +177,10 @@ def process_site_network_access(
             MSG = 'Site Network Access QoS Class Id: {:s}'
             raise NotImplementedError(MSG.format(str(qos_profile_class['class-id'])))
 
-        if qos_profile_class['direction'] != 'ietf-l3vpn-svc:both':
-        # if qos_profile_class['direction'] != 'both':
+        if 'ietf-l3vpn-svc' in qos_profile_class['direction']:
+            # replace 'ietf-l3vpn-svc:both' with 'both' for backward compatibility
+            qos_profile_class['direction'] = qos_profile_class['direction'].replace('ietf-l3vpn-svc:', '')
+        if qos_profile_class['direction'] != 'both':
             MSG = 'Site Network Access QoS Class Direction: {:s}'
             raise NotImplementedError(MSG.format(str(qos_profile_class['direction'])))
 
@@ -192,6 +198,7 @@ def process_site_network_access(
 def process_site(site : Dict, errors : List[Dict]) -> None:
     site_id = site['site-id']
 
+    # this change is made for ECOC2025 demo purposes
     if site['management']['type'] != 'ietf-l3vpn-svc:provider-managed':
     # if site['management']['type'] == 'customer-managed':
         MSG = 'Site Management Type: {:s}'
@@ -202,8 +209,10 @@ def process_site(site : Dict, errors : List[Dict]) -> None:
     site_routing_protocols : Dict = site.get('routing-protocols', dict())
     site_routing_protocol : List = site_routing_protocols.get('routing-protocol', list())
     for rt_proto in site_routing_protocol:
-        if rt_proto['type'] != 'ietf-l3vpn-svc:static':
-        # if rt_proto['type'] != 'static':
+        if 'ietf-l3vpn-svc' in rt_proto['type']:
+            # replace 'ietf-l3vpn-svc:static' with 'static' for backward compatibility
+            rt_proto['type'] = rt_proto['type'].replace('ietf-l3vpn-svc:', '')
+        if rt_proto['type'] != 'static':
             MSG = 'Site Routing Protocol Type: {:s}'
             raise NotImplementedError(MSG.format(str(rt_proto['type'])))
 
diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/__init__.py b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/__init__.py
deleted file mode 100644
index 3ccc21c7d..000000000
--- a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/__init__.py
+++ /dev/null
@@ -1,14 +0,0 @@
-# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/device_dscm-1.json b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/device_dscm-1.json
deleted file mode 100644
index e3661ccbe..000000000
--- a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/device_dscm-1.json
+++ /dev/null
@@ -1,710 +0,0 @@
-{
-  "openconfig-terminal-device:terminal-device": {
-    "config": {},
-    "state": {},
-    "logical-channels": {
-      "channel": [
-        {
-          "index": 1,
-          "config": {
-            "index": 1,
-            "description": "Updated 100G client channel",
-            "admin-state": "DISABLED",
-            "rate-class": "openconfig-transport-types:TRIB_RATE_100G",
-            "trib-protocol": "openconfig-transport-types:PROT_100GE",
-            "logical-channel-type": "openconfig-transport-types:PROT_ETHERNET",
-            "loopback-mode": "NONE",
-            "test-signal": false
-          },
-          "state": {
-            "index": 1,
-            "description": "100G client channel",
-            "admin-state": "ENABLED",
-            "rate-class": "openconfig-transport-types:TRIB_RATE_100G",
-            "trib-protocol": "openconfig-transport-types:PROT_100GE",
-            "logical-channel-type": "openconfig-transport-types:PROT_ETHERNET",
-            "loopback-mode": "NONE",
-            "test-signal": false,
-            "link-state": "UP"
-          },
-          "ethernet": {
-            "config": {
-              "client-als": "ETHERNET",
-              "als-delay": 0
-            },
-            "state": {
-              "client-als": "ETHERNET",
-              "als-delay": 0,
-              "in-frames": 50000,
-              "out-frames": 48000,
-              "in-pcs-bip-errors": 0,
-              "out-pcs-bip-errors": 0,
-              "in-pcs-errored-seconds": 0,
-              "in-pcs-severely-errored-seconds": 0,
-              "in-pcs-unavailable-seconds": 0,
-              "out-crc-errors": 0,
-              "out-block-errors": 0,
-              "fec-uncorrectable-blocks": 0,
-              "pre-fec-ber": {
-                "instant": 1e-16,
-                "avg": 2e-16,
-                "min": 1e-16,
-                "max": 5e-16
-              },
-              "post-fec-ber": {
-                "instant": 0.0,
-                "avg": 0.0,
-                "min": 0.0,
-                "max": 0.0
-              },
-              "q-value": {
-                "instant": 12.5,
-                "avg": 12.3,
-                "min": 12.0,
-                "max": 12.8
-              },
-              "esnr": {
-                "instant": 15.2,
-                "avg": 15.0,
-                "min": 14.8,
-                "max": 15.5
-              }
-            },
-            "lldp": {
-              "config": {
-                "enabled": false,
-                "snooping": false
-              },
-              "state": {
-                "enabled": false,
-                "snooping": false,
-                "frame-in": 0,
-                "frame-out": 0,
-                "frame-error-in": 0,
-                "frame-discard": 0,
-                "tlv-discard": 0,
-                "tlv-unknown": 0,
-                "entries-aged-out": 0
-              },
-              "neighbors": {}
-            }
-          },
-          "ingress": {
-            "config": {
-              "transceiver": "transceiver-1/1"
-            },
-            "state": {
-              "transceiver": "transceiver-1/1"
-            }
-          },
-          "logical-channel-assignments": {
-            "assignment": [
-              null,
-              {
-                "index": 1,
-                "config": {
-                  "index": 1,
-                  "description": "Assignment to optical channel",
-                  "assignment-type": "OPTICAL_CHANNEL",
-                  "optical-channel": "optical-channel-1/1/1",
-                  "allocation": 100.0
-                },
-                "state": {
-                  "index": 1,
-                  "description": "Assignment to optical channel",
-                  "assignment-type": "OPTICAL_CHANNEL",
-                  "optical-channel": "optical-channel-1/1/1",
-                  "allocation": 100.0
-                }
-              }
-            ]
-          }
-        },
-        {
-          "index": 2,
-          "config": {
-            "index": 2,
-            "description": "400G optical channel",
-            "admin-state": "ENABLED",
-            "rate-class": "openconfig-transport-types:TRIB_RATE_400G",
-            "trib-protocol": "openconfig-transport-types:PROT_400GE",
-            "logical-channel-type": "openconfig-transport-types:PROT_OTN",
-            "loopback-mode": "NONE",
-            "test-signal": false
-          },
-          "state": {
-            "index": 2,
-            "description": "400G optical channel",
-            "admin-state": "ENABLED",
-            "rate-class": "openconfig-transport-types:TRIB_RATE_400G",
-            "trib-protocol": "openconfig-transport-types:PROT_400GE",
-            "logical-channel-type": "openconfig-transport-types:PROT_OTN",
-            "loopback-mode": "NONE",
-            "test-signal": false,
-            "link-state": "UP"
-          },
-          "otn": {
-            "config": {
-              "tti-msg-transmit": "TERM-DEV-1",
-              "tti-msg-expected": "TERM-DEV-2",
-              "tti-msg-auto": false,
-              "tributary-slot-granularity": "openconfig-transport-types:TRIB_SLOT_5G"
-            },
-            "state": {
-              "tti-msg-transmit": "TERM-DEV-1",
-              "tti-msg-expected": "TERM-DEV-2",
-              "tti-msg-auto": false,
-              "tributary-slot-granularity": "openconfig-transport-types:TRIB_SLOT_5G",
-              "tti-msg-recv": "TERM-DEV-2",
-              "rdi-msg": "",
-              "errored-seconds": 0,
-              "severely-errored-seconds": 0,
-              "unavailable-seconds": 0,
-              "code-violations": 0,
-              "errored-blocks": 0,
-              "fec-uncorrectable-words": 0,
-              "fec-corrected-bytes": 1000,
-              "fec-corrected-bits": 8000,
-              "background-block-errors": 0,
-              "fec-uncorrectable-blocks": 0,
-              "pre-fec-ber": {
-                "instant": 1e-16,
-                "avg": 2e-16,
-                "min": 1e-16,
-                "max": 5e-16
-              },
-              "post-fec-ber": {
-                "instant": 0.0,
-                "avg": 0.0,
-                "min": 0.0,
-                "max": 0.0
-              },
-              "q-value": {
-                "instant": 12.5,
-                "avg": 12.3,
-                "min": 12.0,
-                "max": 12.8
-              },
-              "esnr": {
-                "instant": 15.2,
-                "avg": 15.0,
-                "min": 14.8,
-                "max": 15.5
-              }
-            }
-          },
-          "logical-channel-assignments": {
-            "assignment": []
-          }
-        }
-      ]
-    },
-    "operational-modes": {
-      "mode": [
-        {
-          "mode-id": 1,
-          "state": {
-            "mode-id": 1,
-            "description": "100G DP-QPSK",
-            "vendor-id": "ACME-OPTICAL"
-          }
-        },
-        {
-          "mode-id": 2,
-          "state": {
-            "mode-id": 2,
-            "description": "400G DP-16QAM",
-            "vendor-id": "ACME-OPTICAL"
-          }
-        },
-        {
-          "mode-id": 3,
-          "state": {
-            "mode-id": 3,
-            "description": "400G DP-8QAM with digital subcarriers",
-            "vendor-id": "ACME-OPTICAL"
-          }
-        }
-      ]
-    }
-  },
-  "openconfig-platform:components": {
-    "component": [
-      {
-        "name": "optical-channel-1/1/1",
-        "config": {
-          "name": "optical-channel-1/1/1",
-          "type": "openconfig-platform-types:OPTICAL_CHANNEL"
-        },
-        "state": {
-          "name": "optical-channel-1/1/1",
-          "type": "openconfig-platform-types:OPTICAL_CHANNEL",
-          "oper-status": "ACTIVE"
-        },
-        "optical-channel": {
-          "config": {
-            "frequency": "195000000",
-            "target-output-power": 1.5,
-            "operational-mode": 1,
-            "line-port": "port-1/1/1",
-            "digital-subcarrier-spacing": 75.0,
-            "digital-subcarriers-group": [
-              {
-                "digital-subcarriers-group-id": 1,
-                "number-of-digital-subcarriers": 4,
-                "digital-subcarrier-group-size": 100,
-                "digital-subcarrier-id": [
-                  {
-                    "digital-subcarrier-id": 1,
-                    "active": true,
-                    "digital-subcarrier-output-power": -2.5
-                  },
-                  {
-                    "digital-subcarrier-id": 2,
-                    "active": true,
-                    "digital-subcarrier-output-power": -2.3
-                  },
-                  {
-                    "digital-subcarrier-id": 3,
-                    "active": true,
-                    "digital-subcarrier-output-power": -2.4
-                  },
-                  {
-                    "digital-subcarrier-id": 4,
-                    "active": true,
-                    "digital-subcarrier-output-power": -2.6
-                  }
-                ]
-              }
-            ],
-            "name": "channel-1",
-            "target_output_power": "-3.0",
-            "operational_mode": "1",
-            "operation": "merge",
-            "digital_subcarriers_groups": [
-              {
-                "group_id": 1,
-                "digital-subcarrier-id": [
-                  {
-                    "subcarrier-id": 1,
-                    "active": true
-                  }
-                ]
-              },
-              {
-                "group_id": 2,
-                "digital-subcarrier-id": [
-                  {
-                    "subcarrier-id": 2,
-                    "active": true
-                  }
-                ]
-              },
-              {
-                "group_id": 3,
-                "digital-subcarrier-id": [
-                  {
-                    "subcarrier-id": 3,
-                    "active": true
-                  }
-                ]
-              },
-              {
-                "group_id": 4,
-                "digital-subcarrier-id": [
-                  {
-                    "subcarrier-id": 4,
-                    "active": true
-                  }
-                ]
-              }
-            ]
-          },
-          "state": {
-            "frequency": 196100000,
-            "target-output-power": 0.0,
-            "operational-mode": 1,
-            "line-port": "port-1/1/1",
-            "input-power": {
-              "instant": -5.2,
-              "avg": -5.1,
-              "min": -5.5,
-              "max": -4.8
-            },
-            "output-power": {
-              "instant": 0.1,
-              "avg": 0.0,
-              "min": -0.2,
-              "max": 0.3
-            },
-            "total-number-of-digital-subcarriers": 4,
-            "digital-subcarrier-spacing": 75.0,
-            "digital-subcarriers-group": [
-              {
-                "digital-subcarriers-group-id": 1,
-                "number-of-digital-subcarriers": 4,
-                "digital-subcarrier-group-size": 100,
-                "digital-subcarrier-id": [
-                  {
-                    "digital-subcarrier-id": 1,
-                    "active": true,
-                    "digital-subcarrier-output-power": -2.5
-                  },
-                  {
-                    "digital-subcarrier-id": 2,
-                    "active": true,
-                    "digital-subcarrier-output-power": -2.3
-                  },
-                  {
-                    "digital-subcarrier-id": 3,
-                    "active": true,
-                    "digital-subcarrier-output-power": -2.4
-                  },
-                  {
-                    "digital-subcarrier-id": 4,
-                    "active": true,
-                    "digital-subcarrier-output-power": -2.6
-                  }
-                ],
-                "chromatic-dispersion": {
-                  "instant": 150.25,
-                  "avg": 149.8,
-                  "min": 148.5,
-                  "max": 151.0
-                },
-                "polarization-mode-dispersion": {
-                  "instant": 0.15,
-                  "avg": 0.14,
-                  "min": 0.12,
-                  "max": 0.17
-                },
-                "second-order-polarization-mode-dispersion": {
-                  "instant": 0.025,
-                  "avg": 0.023,
-                  "min": 0.02,
-                  "max": 0.028
-                },
-                "polarization-dependent-loss": {
-                  "instant": 0.8,
-                  "avg": 0.75,
-                  "min": 0.7,
-                  "max": 0.9
-                },
-                "modulator-bias-xi": {
-                  "instant": 50.25,
-                  "avg": 50.0,
-                  "min": 49.5,
-                  "max": 50.8
-                },
-                "modulator-bias-xq": {
-                  "instant": 49.75,
-                  "avg": 50.0,
-                  "min": 49.2,
-                  "max": 50.5
-                },
-                "modulator-bias-yi": {
-                  "instant": 50.1,
-                  "avg": 50.0,
-                  "min": 49.8,
-                  "max": 50.3
-                },
-                "modulator-bias-yq": {
-                  "instant": 49.9,
-                  "avg": 50.0,
-                  "min": 49.7,
-                  "max": 50.2
-                },
-                "modulator-bias-x-phase": {
-                  "instant": 0.5,
-                  "avg": 0.4,
-                  "min": 0.2,
-                  "max": 0.7
-                },
-                "modulator-bias-y-phase": {
-                  "instant": 0.3,
-                  "avg": 0.4,
-                  "min": 0.1,
-                  "max": 0.6
-                },
-                "osnr": {
-                  "instant": 25.5,
-                  "avg": 25.2,
-                  "min": 24.8,
-                  "max": 25.8
-                },
-                "carrier-frequency-offset": {
-                  "instant": 1.2,
-                  "avg": 1.1,
-                  "min": 0.8,
-                  "max": 1.5
-                },
-                "sop-roc": {
-                  "instant": 12.5,
-                  "avg": 12.0,
-                  "min": 11.5,
-                  "max": 13.0
-                },
-                "modulation-error-ratio": {
-                  "instant": -25.3,
-                  "avg": -25.5,
-                  "min": -26.0,
-                  "max": -25.0
-                },
-                "fec-uncorrectable-blocks": 0,
-                "pre-fec-ber": {
-                  "instant": 1e-15,
-                  "avg": 2e-15,
-                  "min": 1e-15,
-                  "max": 5e-15
-                },
-                "post-fec-ber": {
-                  "instant": 0.0,
-                  "avg": 0.0,
-                  "min": 0.0,
-                  "max": 0.0
-                },
-                "q-value": {
-                  "instant": 12.5,
-                  "avg": 12.3,
-                  "min": 12.0,
-                  "max": 12.8
-                },
-                "esnr": {
-                  "instant": 15.2,
-                  "avg": 15.0,
-                  "min": 14.8,
-                  "max": 15.5
-                }
-              }
-            ]
-          }
-        }
-      },
-      {
-        "name": "optical-channel-1/1/2",
-        "config": {
-          "name": "optical-channel-1/1/2",
-          "type": "openconfig-platform-types:OPTICAL_CHANNEL"
-        },
-        "state": {
-          "name": "optical-channel-1/1/2",
-          "type": "openconfig-platform-types:OPTICAL_CHANNEL",
-          "oper-status": "ACTIVE"
-        },
-        "optical-channel": {
-          "config": {
-            "frequency": 196200000,
-            "target-output-power": 2.0,
-            "operational-mode": 3,
-            "line-port": "port-1/1/2",
-            "digital-subcarrier-spacing": 50.0,
-            "digital-subcarriers-group": [
-              null,
-              {
-                "digital-subcarriers-group-id": 1,
-                "number-of-digital-subcarriers": 8,
-                "digital-subcarrier-group-size": 200,
-                "digital-subcarrier-id": [
-                  {
-                    "digital-subcarrier-id": 1,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.8
-                  },
-                  {
-                    "digital-subcarrier-id": 2,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.9
-                  },
-                  {
-                    "digital-subcarrier-id": 3,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.7
-                  },
-                  {
-                    "digital-subcarrier-id": 4,
-                    "active": true,
-                    "digital-subcarrier-output-power": 2.0
-                  },
-                  {
-                    "digital-subcarrier-id": 5,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.8
-                  },
-                  {
-                    "digital-subcarrier-id": 6,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.9
-                  },
-                  {
-                    "digital-subcarrier-id": 7,
-                    "active": false,
-                    "digital-subcarrier-output-power": 0.0
-                  },
-                  {
-                    "digital-subcarrier-id": 8,
-                    "active": false,
-                    "digital-subcarrier-output-power": 0.0
-                  }
-                ]
-              }
-            ]
-          },
-          "state": {
-            "frequency": 196200000,
-            "target-output-power": 2.0,
-            "operational-mode": 3,
-            "line-port": "port-1/1/2",
-            "input-power": {
-              "instant": -3.2,
-              "avg": -3.1,
-              "min": -3.5,
-              "max": -2.8
-            },
-            "output-power": {
-              "instant": 2.1,
-              "avg": 2.0,
-              "min": 1.8,
-              "max": 2.3
-            },
-            "total-number-of-digital-subcarriers": 12,
-            "digital-subcarrier-spacing": 50.0,
-            "digital-subcarriers-group": [
-              {
-                "digital-subcarriers-group-id": 1,
-                "number-of-digital-subcarriers": 8,
-                "digital-subcarrier-group-size": 200,
-                "digital-subcarrier-id": [
-                  {
-                    "digital-subcarrier-id": 1,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.8
-                  },
-                  {
-                    "digital-subcarrier-id": 2,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.9
-                  },
-                  {
-                    "digital-subcarrier-id": 3,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.7
-                  },
-                  {
-                    "digital-subcarrier-id": 4,
-                    "active": true,
-                    "digital-subcarrier-output-power": 2.0
-                  },
-                  {
-                    "digital-subcarrier-id": 5,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.8
-                  },
-                  {
-                    "digital-subcarrier-id": 6,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.9
-                  },
-                  {
-                    "digital-subcarrier-id": 7,
-                    "active": false,
-                    "digital-subcarrier-output-power": 0.0
-                  },
-                  {
-                    "digital-subcarrier-id": 8,
-                    "active": false,
-                    "digital-subcarrier-output-power": 0.0
-                  }
-                ]
-              },
-              {
-                "digital-subcarriers-group-id": 2,
-                "number-of-digital-subcarriers": 4,
-                "digital-subcarrier-group-size": 200,
-                "digital-subcarrier-id": [
-                  {
-                    "digital-subcarrier-id": 9,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.5
-                  },
-                  {
-                    "digital-subcarrier-id": 10,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.6
-                  },
-                  {
-                    "digital-subcarrier-id": 11,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.4
-                  },
-                  {
-                    "digital-subcarrier-id": 12,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.7
-                  }
-                ]
-              }
-            ]
-          }
-        }
-      },
-      {
-        "name": "transceiver-1/1",
-        "config": {
-          "name": "transceiver-1/1",
-          "type": "openconfig-platform-types:TRANSCEIVER"
-        },
-        "state": {
-          "name": "transceiver-1/1",
-          "type": "openconfig-platform-types:TRANSCEIVER",
-          "oper-status": "ACTIVE",
-          "description": "100G QSFP28 transceiver",
-          "mfg-name": "ACME Optics",
-          "part-no": "QSFP28-100G-LR4",
-          "serial-no": "AC123456789"
-        }
-      },
-      {
-        "name": "transceiver-1/2",
-        "config": {
-          "name": "transceiver-1/2",
-          "type": "openconfig-platform-types:TRANSCEIVER"
-        },
-        "state": {
-          "name": "transceiver-1/2",
-          "type": "openconfig-platform-types:TRANSCEIVER",
-          "oper-status": "ACTIVE",
-          "description": "400G QSFP-DD coherent transceiver",
-          "mfg-name": "ACME Optics",
-          "part-no": "QSFPDD-400G-ZR",
-          "serial-no": "AC987654321"
-        }
-      },
-      {
-        "name": "port-1/1/1",
-        "config": {
-          "name": "port-1/1/1",
-          "type": "openconfig-platform-types:PORT"
-        },
-        "state": {
-          "name": "port-1/1/1",
-          "type": "openconfig-platform-types:PORT",
-          "oper-status": "ACTIVE",
-          "description": "Line port for 100G channel"
-        }
-      },
-      {
-        "name": "port-1/1/2",
-        "config": {
-          "name": "port-1/1/2",
-          "type": "openconfig-platform-types:PORT"
-        },
-        "state": {
-          "name": "port-1/1/2",
-          "type": "openconfig-platform-types:PORT",
-          "oper-status": "ACTIVE",
-          "description": "Line port for 400G channel with digital subcarriers"
-        }
-      }
-    ]
-  }
-}
\ No newline at end of file
diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/device_dscm-2.json b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/device_dscm-2.json
deleted file mode 100644
index 2f268e60f..000000000
--- a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/device_dscm-2.json
+++ /dev/null
@@ -1,668 +0,0 @@
-{
-  "openconfig-terminal-device:terminal-device": {
-    "config": {},
-    "state": {},
-    "logical-channels": {
-      "channel": [
-        {
-          "index": 1,
-          "config": {
-            "index": 1,
-            "description": "Updated 100G client channel",
-            "admin-state": "DISABLED",
-            "rate-class": "openconfig-transport-types:TRIB_RATE_100G",
-            "trib-protocol": "openconfig-transport-types:PROT_100GE",
-            "logical-channel-type": "openconfig-transport-types:PROT_ETHERNET",
-            "loopback-mode": "NONE",
-            "test-signal": false
-          },
-          "state": {
-            "index": 1,
-            "description": "100G client channel",
-            "admin-state": "ENABLED",
-            "rate-class": "openconfig-transport-types:TRIB_RATE_100G",
-            "trib-protocol": "openconfig-transport-types:PROT_100GE",
-            "logical-channel-type": "openconfig-transport-types:PROT_ETHERNET",
-            "loopback-mode": "NONE",
-            "test-signal": false,
-            "link-state": "UP"
-          },
-          "ethernet": {
-            "config": {
-              "client-als": "ETHERNET",
-              "als-delay": 0
-            },
-            "state": {
-              "client-als": "ETHERNET",
-              "als-delay": 0,
-              "in-frames": 50000,
-              "out-frames": 48000,
-              "in-pcs-bip-errors": 0,
-              "out-pcs-bip-errors": 0,
-              "in-pcs-errored-seconds": 0,
-              "in-pcs-severely-errored-seconds": 0,
-              "in-pcs-unavailable-seconds": 0,
-              "out-crc-errors": 0,
-              "out-block-errors": 0,
-              "fec-uncorrectable-blocks": 0,
-              "pre-fec-ber": {
-                "instant": 1e-16,
-                "avg": 2e-16,
-                "min": 1e-16,
-                "max": 5e-16
-              },
-              "post-fec-ber": {
-                "instant": 0.0,
-                "avg": 0.0,
-                "min": 0.0,
-                "max": 0.0
-              },
-              "q-value": {
-                "instant": 12.5,
-                "avg": 12.3,
-                "min": 12.0,
-                "max": 12.8
-              },
-              "esnr": {
-                "instant": 15.2,
-                "avg": 15.0,
-                "min": 14.8,
-                "max": 15.5
-              }
-            },
-            "lldp": {
-              "config": {
-                "enabled": false,
-                "snooping": false
-              },
-              "state": {
-                "enabled": false,
-                "snooping": false,
-                "frame-in": 0,
-                "frame-out": 0,
-                "frame-error-in": 0,
-                "frame-discard": 0,
-                "tlv-discard": 0,
-                "tlv-unknown": 0,
-                "entries-aged-out": 0
-              },
-              "neighbors": {}
-            }
-          },
-          "ingress": {
-            "config": {
-              "transceiver": "transceiver-1/1"
-            },
-            "state": {
-              "transceiver": "transceiver-1/1"
-            }
-          },
-          "logical-channel-assignments": {
-            "assignment": [
-              null,
-              {
-                "index": 1,
-                "config": {
-                  "index": 1,
-                  "description": "Assignment to optical channel",
-                  "assignment-type": "OPTICAL_CHANNEL",
-                  "optical-channel": "optical-channel-1/1/1",
-                  "allocation": 100.0
-                },
-                "state": {
-                  "index": 1,
-                  "description": "Assignment to optical channel",
-                  "assignment-type": "OPTICAL_CHANNEL",
-                  "optical-channel": "optical-channel-1/1/1",
-                  "allocation": 100.0
-                }
-              }
-            ]
-          }
-        },
-        {
-          "index": 2,
-          "config": {
-            "index": 2,
-            "description": "400G optical channel",
-            "admin-state": "ENABLED",
-            "rate-class": "openconfig-transport-types:TRIB_RATE_400G",
-            "trib-protocol": "openconfig-transport-types:PROT_400GE",
-            "logical-channel-type": "openconfig-transport-types:PROT_OTN",
-            "loopback-mode": "NONE",
-            "test-signal": false
-          },
-          "state": {
-            "index": 2,
-            "description": "400G optical channel",
-            "admin-state": "ENABLED",
-            "rate-class": "openconfig-transport-types:TRIB_RATE_400G",
-            "trib-protocol": "openconfig-transport-types:PROT_400GE",
-            "logical-channel-type": "openconfig-transport-types:PROT_OTN",
-            "loopback-mode": "NONE",
-            "test-signal": false,
-            "link-state": "UP"
-          },
-          "otn": {
-            "config": {
-              "tti-msg-transmit": "TERM-DEV-1",
-              "tti-msg-expected": "TERM-DEV-2",
-              "tti-msg-auto": false,
-              "tributary-slot-granularity": "openconfig-transport-types:TRIB_SLOT_5G"
-            },
-            "state": {
-              "tti-msg-transmit": "TERM-DEV-1",
-              "tti-msg-expected": "TERM-DEV-2",
-              "tti-msg-auto": false,
-              "tributary-slot-granularity": "openconfig-transport-types:TRIB_SLOT_5G",
-              "tti-msg-recv": "TERM-DEV-2",
-              "rdi-msg": "",
-              "errored-seconds": 0,
-              "severely-errored-seconds": 0,
-              "unavailable-seconds": 0,
-              "code-violations": 0,
-              "errored-blocks": 0,
-              "fec-uncorrectable-words": 0,
-              "fec-corrected-bytes": 1000,
-              "fec-corrected-bits": 8000,
-              "background-block-errors": 0,
-              "fec-uncorrectable-blocks": 0,
-              "pre-fec-ber": {
-                "instant": 1e-16,
-                "avg": 2e-16,
-                "min": 1e-16,
-                "max": 5e-16
-              },
-              "post-fec-ber": {
-                "instant": 0.0,
-                "avg": 0.0,
-                "min": 0.0,
-                "max": 0.0
-              },
-              "q-value": {
-                "instant": 12.5,
-                "avg": 12.3,
-                "min": 12.0,
-                "max": 12.8
-              },
-              "esnr": {
-                "instant": 15.2,
-                "avg": 15.0,
-                "min": 14.8,
-                "max": 15.5
-              }
-            }
-          },
-          "logical-channel-assignments": {
-            "assignment": []
-          }
-        }
-      ]
-    },
-    "operational-modes": {
-      "mode": [
-        {
-          "mode-id": 1,
-          "state": {
-            "mode-id": 1,
-            "description": "100G DP-QPSK",
-            "vendor-id": "ACME-OPTICAL"
-          }
-        },
-        {
-          "mode-id": 2,
-          "state": {
-            "mode-id": 2,
-            "description": "400G DP-16QAM",
-            "vendor-id": "ACME-OPTICAL"
-          }
-        },
-        {
-          "mode-id": 3,
-          "state": {
-            "mode-id": 3,
-            "description": "400G DP-8QAM with digital subcarriers",
-            "vendor-id": "ACME-OPTICAL"
-          }
-        }
-      ]
-    }
-  },
-  "openconfig-platform:components": {
-    "component": [
-      {
-        "name": "optical-channel-1/1/1",
-        "config": {
-          "name": "optical-channel-1/1/1",
-          "type": "openconfig-platform-types:OPTICAL_CHANNEL"
-        },
-        "state": {
-          "name": "optical-channel-1/1/1",
-          "type": "openconfig-platform-types:OPTICAL_CHANNEL",
-          "oper-status": "ACTIVE"
-        },
-        "optical-channel": {
-          "config": {
-            "frequency": 196150000,
-            "target-output-power": 1.5,
-            "operational-mode": 1,
-            "line-port": "port-1/1/1",
-            "digital-subcarrier-spacing": 75.0,
-            "digital-subcarriers-group": [
-              {
-                "digital-subcarriers-group-id": 1,
-                "number-of-digital-subcarriers": 4,
-                "digital-subcarrier-group-size": 100,
-                "digital-subcarrier-id": [
-                  {
-                    "digital-subcarrier-id": 1,
-                    "active": true,
-                    "digital-subcarrier-output-power": -2.5
-                  },
-                  {
-                    "digital-subcarrier-id": 2,
-                    "active": true,
-                    "digital-subcarrier-output-power": -2.3
-                  },
-                  {
-                    "digital-subcarrier-id": 3,
-                    "active": true,
-                    "digital-subcarrier-output-power": -2.4
-                  },
-                  {
-                    "digital-subcarrier-id": 4,
-                    "active": true,
-                    "digital-subcarrier-output-power": -2.6
-                  }
-                ]
-              }
-            ]
-          },
-          "state": {
-            "frequency": 196100000,
-            "target-output-power": 0.0,
-            "operational-mode": 1,
-            "line-port": "port-1/1/1",
-            "input-power": {
-              "instant": -5.2,
-              "avg": -5.1,
-              "min": -5.5,
-              "max": -4.8
-            },
-            "output-power": {
-              "instant": 0.1,
-              "avg": 0.0,
-              "min": -0.2,
-              "max": 0.3
-            },
-            "total-number-of-digital-subcarriers": 4,
-            "digital-subcarrier-spacing": 75.0,
-            "digital-subcarriers-group": [
-              {
-                "digital-subcarriers-group-id": 1,
-                "number-of-digital-subcarriers": 4,
-                "digital-subcarrier-group-size": 100,
-                "digital-subcarrier-id": [
-                  {
-                    "digital-subcarrier-id": 1,
-                    "active": true,
-                    "digital-subcarrier-output-power": -2.5
-                  },
-                  {
-                    "digital-subcarrier-id": 2,
-                    "active": true,
-                    "digital-subcarrier-output-power": -2.3
-                  },
-                  {
-                    "digital-subcarrier-id": 3,
-                    "active": true,
-                    "digital-subcarrier-output-power": -2.4
-                  },
-                  {
-                    "digital-subcarrier-id": 4,
-                    "active": true,
-                    "digital-subcarrier-output-power": -2.6
-                  }
-                ],
-                "chromatic-dispersion": {
-                  "instant": 150.25,
-                  "avg": 149.8,
-                  "min": 148.5,
-                  "max": 151.0
-                },
-                "polarization-mode-dispersion": {
-                  "instant": 0.15,
-                  "avg": 0.14,
-                  "min": 0.12,
-                  "max": 0.17
-                },
-                "second-order-polarization-mode-dispersion": {
-                  "instant": 0.025,
-                  "avg": 0.023,
-                  "min": 0.02,
-                  "max": 0.028
-                },
-                "polarization-dependent-loss": {
-                  "instant": 0.8,
-                  "avg": 0.75,
-                  "min": 0.7,
-                  "max": 0.9
-                },
-                "modulator-bias-xi": {
-                  "instant": 50.25,
-                  "avg": 50.0,
-                  "min": 49.5,
-                  "max": 50.8
-                },
-                "modulator-bias-xq": {
-                  "instant": 49.75,
-                  "avg": 50.0,
-                  "min": 49.2,
-                  "max": 50.5
-                },
-                "modulator-bias-yi": {
-                  "instant": 50.1,
-                  "avg": 50.0,
-                  "min": 49.8,
-                  "max": 50.3
-                },
-                "modulator-bias-yq": {
-                  "instant": 49.9,
-                  "avg": 50.0,
-                  "min": 49.7,
-                  "max": 50.2
-                },
-                "modulator-bias-x-phase": {
-                  "instant": 0.5,
-                  "avg": 0.4,
-                  "min": 0.2,
-                  "max": 0.7
-                },
-                "modulator-bias-y-phase": {
-                  "instant": 0.3,
-                  "avg": 0.4,
-                  "min": 0.1,
-                  "max": 0.6
-                },
-                "osnr": {
-                  "instant": 25.5,
-                  "avg": 25.2,
-                  "min": 24.8,
-                  "max": 25.8
-                },
-                "carrier-frequency-offset": {
-                  "instant": 1.2,
-                  "avg": 1.1,
-                  "min": 0.8,
-                  "max": 1.5
-                },
-                "sop-roc": {
-                  "instant": 12.5,
-                  "avg": 12.0,
-                  "min": 11.5,
-                  "max": 13.0
-                },
-                "modulation-error-ratio": {
-                  "instant": -25.3,
-                  "avg": -25.5,
-                  "min": -26.0,
-                  "max": -25.0
-                },
-                "fec-uncorrectable-blocks": 0,
-                "pre-fec-ber": {
-                  "instant": 1e-15,
-                  "avg": 2e-15,
-                  "min": 1e-15,
-                  "max": 5e-15
-                },
-                "post-fec-ber": {
-                  "instant": 0.0,
-                  "avg": 0.0,
-                  "min": 0.0,
-                  "max": 0.0
-                },
-                "q-value": {
-                  "instant": 12.5,
-                  "avg": 12.3,
-                  "min": 12.0,
-                  "max": 12.8
-                },
-                "esnr": {
-                  "instant": 15.2,
-                  "avg": 15.0,
-                  "min": 14.8,
-                  "max": 15.5
-                }
-              }
-            ]
-          }
-        }
-      },
-      {
-        "name": "optical-channel-1/1/2",
-        "config": {
-          "name": "optical-channel-1/1/2",
-          "type": "openconfig-platform-types:OPTICAL_CHANNEL"
-        },
-        "state": {
-          "name": "optical-channel-1/1/2",
-          "type": "openconfig-platform-types:OPTICAL_CHANNEL",
-          "oper-status": "ACTIVE"
-        },
-        "optical-channel": {
-          "config": {
-            "frequency": 196200000,
-            "target-output-power": 2.0,
-            "operational-mode": 3,
-            "line-port": "port-1/1/2",
-            "digital-subcarrier-spacing": 50.0,
-            "digital-subcarriers-group": [
-              null,
-              {
-                "digital-subcarriers-group-id": 1,
-                "number-of-digital-subcarriers": 8,
-                "digital-subcarrier-group-size": 200,
-                "digital-subcarrier-id": [
-                  {
-                    "digital-subcarrier-id": 1,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.8
-                  },
-                  {
-                    "digital-subcarrier-id": 2,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.9
-                  },
-                  {
-                    "digital-subcarrier-id": 3,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.7
-                  },
-                  {
-                    "digital-subcarrier-id": 4,
-                    "active": true,
-                    "digital-subcarrier-output-power": 2.0
-                  },
-                  {
-                    "digital-subcarrier-id": 5,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.8
-                  },
-                  {
-                    "digital-subcarrier-id": 6,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.9
-                  },
-                  {
-                    "digital-subcarrier-id": 7,
-                    "active": false,
-                    "digital-subcarrier-output-power": 0.0
-                  },
-                  {
-                    "digital-subcarrier-id": 8,
-                    "active": false,
-                    "digital-subcarrier-output-power": 0.0
-                  }
-                ]
-              }
-            ]
-          },
-          "state": {
-            "frequency": 196200000,
-            "target-output-power": 2.0,
-            "operational-mode": 3,
-            "line-port": "port-1/1/2",
-            "input-power": {
-              "instant": -3.2,
-              "avg": -3.1,
-              "min": -3.5,
-              "max": -2.8
-            },
-            "output-power": {
-              "instant": 2.1,
-              "avg": 2.0,
-              "min": 1.8,
-              "max": 2.3
-            },
-            "total-number-of-digital-subcarriers": 12,
-            "digital-subcarrier-spacing": 50.0,
-            "digital-subcarriers-group": [
-              {
-                "digital-subcarriers-group-id": 1,
-                "number-of-digital-subcarriers": 8,
-                "digital-subcarrier-group-size": 200,
-                "digital-subcarrier-id": [
-                  {
-                    "digital-subcarrier-id": 1,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.8
-                  },
-                  {
-                    "digital-subcarrier-id": 2,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.9
-                  },
-                  {
-                    "digital-subcarrier-id": 3,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.7
-                  },
-                  {
-                    "digital-subcarrier-id": 4,
-                    "active": true,
-                    "digital-subcarrier-output-power": 2.0
-                  },
-                  {
-                    "digital-subcarrier-id": 5,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.8
-                  },
-                  {
-                    "digital-subcarrier-id": 6,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.9
-                  },
-                  {
-                    "digital-subcarrier-id": 7,
-                    "active": false,
-                    "digital-subcarrier-output-power": 0.0
-                  },
-                  {
-                    "digital-subcarrier-id": 8,
-                    "active": false,
-                    "digital-subcarrier-output-power": 0.0
-                  }
-                ]
-              },
-              {
-                "digital-subcarriers-group-id": 2,
-                "number-of-digital-subcarriers": 4,
-                "digital-subcarrier-group-size": 200,
-                "digital-subcarrier-id": [
-                  {
-                    "digital-subcarrier-id": 9,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.5
-                  },
-                  {
-                    "digital-subcarrier-id": 10,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.6
-                  },
-                  {
-                    "digital-subcarrier-id": 11,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.4
-                  },
-                  {
-                    "digital-subcarrier-id": 12,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.7
-                  }
-                ]
-              }
-            ]
-          }
-        }
-      },
-      {
-        "name": "transceiver-1/1",
-        "config": {
-          "name": "transceiver-1/1",
-          "type": "openconfig-platform-types:TRANSCEIVER"
-        },
-        "state": {
-          "name": "transceiver-1/1",
-          "type": "openconfig-platform-types:TRANSCEIVER",
-          "oper-status": "ACTIVE",
-          "description": "100G QSFP28 transceiver",
-          "mfg-name": "ACME Optics",
-          "part-no": "QSFP28-100G-LR4",
-          "serial-no": "AC123456789"
-        }
-      },
-      {
-        "name": "transceiver-1/2",
-        "config": {
-          "name": "transceiver-1/2",
-          "type": "openconfig-platform-types:TRANSCEIVER"
-        },
-        "state": {
-          "name": "transceiver-1/2",
-          "type": "openconfig-platform-types:TRANSCEIVER",
-          "oper-status": "ACTIVE",
-          "description": "400G QSFP-DD coherent transceiver",
-          "mfg-name": "ACME Optics",
-          "part-no": "QSFPDD-400G-ZR",
-          "serial-no": "AC987654321"
-        }
-      },
-      {
-        "name": "port-1/1/1",
-        "config": {
-          "name": "port-1/1/1",
-          "type": "openconfig-platform-types:PORT"
-        },
-        "state": {
-          "name": "port-1/1/1",
-          "type": "openconfig-platform-types:PORT",
-          "oper-status": "ACTIVE",
-          "description": "Line port for 100G channel"
-        }
-      },
-      {
-        "name": "port-1/1/2",
-        "config": {
-          "name": "port-1/1/2",
-          "type": "openconfig-platform-types:PORT"
-        },
-        "state": {
-          "name": "port-1/1/2",
-          "type": "openconfig-platform-types:PORT",
-          "oper-status": "ACTIVE",
-          "description": "Line port for 400G channel with digital subcarriers"
-        }
-      }
-    ]
-  }
-}
\ No newline at end of file
diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/device_hub.json b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/device_hub.json
deleted file mode 100644
index 0967ef424..000000000
--- a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/device_hub.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/dscm_store.json b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/dscm_store.json
deleted file mode 100644
index 2f268e60f..000000000
--- a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datamodels/dscm_store.json
+++ /dev/null
@@ -1,668 +0,0 @@
-{
-  "openconfig-terminal-device:terminal-device": {
-    "config": {},
-    "state": {},
-    "logical-channels": {
-      "channel": [
-        {
-          "index": 1,
-          "config": {
-            "index": 1,
-            "description": "Updated 100G client channel",
-            "admin-state": "DISABLED",
-            "rate-class": "openconfig-transport-types:TRIB_RATE_100G",
-            "trib-protocol": "openconfig-transport-types:PROT_100GE",
-            "logical-channel-type": "openconfig-transport-types:PROT_ETHERNET",
-            "loopback-mode": "NONE",
-            "test-signal": false
-          },
-          "state": {
-            "index": 1,
-            "description": "100G client channel",
-            "admin-state": "ENABLED",
-            "rate-class": "openconfig-transport-types:TRIB_RATE_100G",
-            "trib-protocol": "openconfig-transport-types:PROT_100GE",
-            "logical-channel-type": "openconfig-transport-types:PROT_ETHERNET",
-            "loopback-mode": "NONE",
-            "test-signal": false,
-            "link-state": "UP"
-          },
-          "ethernet": {
-            "config": {
-              "client-als": "ETHERNET",
-              "als-delay": 0
-            },
-            "state": {
-              "client-als": "ETHERNET",
-              "als-delay": 0,
-              "in-frames": 50000,
-              "out-frames": 48000,
-              "in-pcs-bip-errors": 0,
-              "out-pcs-bip-errors": 0,
-              "in-pcs-errored-seconds": 0,
-              "in-pcs-severely-errored-seconds": 0,
-              "in-pcs-unavailable-seconds": 0,
-              "out-crc-errors": 0,
-              "out-block-errors": 0,
-              "fec-uncorrectable-blocks": 0,
-              "pre-fec-ber": {
-                "instant": 1e-16,
-                "avg": 2e-16,
-                "min": 1e-16,
-                "max": 5e-16
-              },
-              "post-fec-ber": {
-                "instant": 0.0,
-                "avg": 0.0,
-                "min": 0.0,
-                "max": 0.0
-              },
-              "q-value": {
-                "instant": 12.5,
-                "avg": 12.3,
-                "min": 12.0,
-                "max": 12.8
-              },
-              "esnr": {
-                "instant": 15.2,
-                "avg": 15.0,
-                "min": 14.8,
-                "max": 15.5
-              }
-            },
-            "lldp": {
-              "config": {
-                "enabled": false,
-                "snooping": false
-              },
-              "state": {
-                "enabled": false,
-                "snooping": false,
-                "frame-in": 0,
-                "frame-out": 0,
-                "frame-error-in": 0,
-                "frame-discard": 0,
-                "tlv-discard": 0,
-                "tlv-unknown": 0,
-                "entries-aged-out": 0
-              },
-              "neighbors": {}
-            }
-          },
-          "ingress": {
-            "config": {
-              "transceiver": "transceiver-1/1"
-            },
-            "state": {
-              "transceiver": "transceiver-1/1"
-            }
-          },
-          "logical-channel-assignments": {
-            "assignment": [
-              null,
-              {
-                "index": 1,
-                "config": {
-                  "index": 1,
-                  "description": "Assignment to optical channel",
-                  "assignment-type": "OPTICAL_CHANNEL",
-                  "optical-channel": "optical-channel-1/1/1",
-                  "allocation": 100.0
-                },
-                "state": {
-                  "index": 1,
-                  "description": "Assignment to optical channel",
-                  "assignment-type": "OPTICAL_CHANNEL",
-                  "optical-channel": "optical-channel-1/1/1",
-                  "allocation": 100.0
-                }
-              }
-            ]
-          }
-        },
-        {
-          "index": 2,
-          "config": {
-            "index": 2,
-            "description": "400G optical channel",
-            "admin-state": "ENABLED",
-            "rate-class": "openconfig-transport-types:TRIB_RATE_400G",
-            "trib-protocol": "openconfig-transport-types:PROT_400GE",
-            "logical-channel-type": "openconfig-transport-types:PROT_OTN",
-            "loopback-mode": "NONE",
-            "test-signal": false
-          },
-          "state": {
-            "index": 2,
-            "description": "400G optical channel",
-            "admin-state": "ENABLED",
-            "rate-class": "openconfig-transport-types:TRIB_RATE_400G",
-            "trib-protocol": "openconfig-transport-types:PROT_400GE",
-            "logical-channel-type": "openconfig-transport-types:PROT_OTN",
-            "loopback-mode": "NONE",
-            "test-signal": false,
-            "link-state": "UP"
-          },
-          "otn": {
-            "config": {
-              "tti-msg-transmit": "TERM-DEV-1",
-              "tti-msg-expected": "TERM-DEV-2",
-              "tti-msg-auto": false,
-              "tributary-slot-granularity": "openconfig-transport-types:TRIB_SLOT_5G"
-            },
-            "state": {
-              "tti-msg-transmit": "TERM-DEV-1",
-              "tti-msg-expected": "TERM-DEV-2",
-              "tti-msg-auto": false,
-              "tributary-slot-granularity": "openconfig-transport-types:TRIB_SLOT_5G",
-              "tti-msg-recv": "TERM-DEV-2",
-              "rdi-msg": "",
-              "errored-seconds": 0,
-              "severely-errored-seconds": 0,
-              "unavailable-seconds": 0,
-              "code-violations": 0,
-              "errored-blocks": 0,
-              "fec-uncorrectable-words": 0,
-              "fec-corrected-bytes": 1000,
-              "fec-corrected-bits": 8000,
-              "background-block-errors": 0,
-              "fec-uncorrectable-blocks": 0,
-              "pre-fec-ber": {
-                "instant": 1e-16,
-                "avg": 2e-16,
-                "min": 1e-16,
-                "max": 5e-16
-              },
-              "post-fec-ber": {
-                "instant": 0.0,
-                "avg": 0.0,
-                "min": 0.0,
-                "max": 0.0
-              },
-              "q-value": {
-                "instant": 12.5,
-                "avg": 12.3,
-                "min": 12.0,
-                "max": 12.8
-              },
-              "esnr": {
-                "instant": 15.2,
-                "avg": 15.0,
-                "min": 14.8,
-                "max": 15.5
-              }
-            }
-          },
-          "logical-channel-assignments": {
-            "assignment": []
-          }
-        }
-      ]
-    },
-    "operational-modes": {
-      "mode": [
-        {
-          "mode-id": 1,
-          "state": {
-            "mode-id": 1,
-            "description": "100G DP-QPSK",
-            "vendor-id": "ACME-OPTICAL"
-          }
-        },
-        {
-          "mode-id": 2,
-          "state": {
-            "mode-id": 2,
-            "description": "400G DP-16QAM",
-            "vendor-id": "ACME-OPTICAL"
-          }
-        },
-        {
-          "mode-id": 3,
-          "state": {
-            "mode-id": 3,
-            "description": "400G DP-8QAM with digital subcarriers",
-            "vendor-id": "ACME-OPTICAL"
-          }
-        }
-      ]
-    }
-  },
-  "openconfig-platform:components": {
-    "component": [
-      {
-        "name": "optical-channel-1/1/1",
-        "config": {
-          "name": "optical-channel-1/1/1",
-          "type": "openconfig-platform-types:OPTICAL_CHANNEL"
-        },
-        "state": {
-          "name": "optical-channel-1/1/1",
-          "type": "openconfig-platform-types:OPTICAL_CHANNEL",
-          "oper-status": "ACTIVE"
-        },
-        "optical-channel": {
-          "config": {
-            "frequency": 196150000,
-            "target-output-power": 1.5,
-            "operational-mode": 1,
-            "line-port": "port-1/1/1",
-            "digital-subcarrier-spacing": 75.0,
-            "digital-subcarriers-group": [
-              {
-                "digital-subcarriers-group-id": 1,
-                "number-of-digital-subcarriers": 4,
-                "digital-subcarrier-group-size": 100,
-                "digital-subcarrier-id": [
-                  {
-                    "digital-subcarrier-id": 1,
-                    "active": true,
-                    "digital-subcarrier-output-power": -2.5
-                  },
-                  {
-                    "digital-subcarrier-id": 2,
-                    "active": true,
-                    "digital-subcarrier-output-power": -2.3
-                  },
-                  {
-                    "digital-subcarrier-id": 3,
-                    "active": true,
-                    "digital-subcarrier-output-power": -2.4
-                  },
-                  {
-                    "digital-subcarrier-id": 4,
-                    "active": true,
-                    "digital-subcarrier-output-power": -2.6
-                  }
-                ]
-              }
-            ]
-          },
-          "state": {
-            "frequency": 196100000,
-            "target-output-power": 0.0,
-            "operational-mode": 1,
-            "line-port": "port-1/1/1",
-            "input-power": {
-              "instant": -5.2,
-              "avg": -5.1,
-              "min": -5.5,
-              "max": -4.8
-            },
-            "output-power": {
-              "instant": 0.1,
-              "avg": 0.0,
-              "min": -0.2,
-              "max": 0.3
-            },
-            "total-number-of-digital-subcarriers": 4,
-            "digital-subcarrier-spacing": 75.0,
-            "digital-subcarriers-group": [
-              {
-                "digital-subcarriers-group-id": 1,
-                "number-of-digital-subcarriers": 4,
-                "digital-subcarrier-group-size": 100,
-                "digital-subcarrier-id": [
-                  {
-                    "digital-subcarrier-id": 1,
-                    "active": true,
-                    "digital-subcarrier-output-power": -2.5
-                  },
-                  {
-                    "digital-subcarrier-id": 2,
-                    "active": true,
-                    "digital-subcarrier-output-power": -2.3
-                  },
-                  {
-                    "digital-subcarrier-id": 3,
-                    "active": true,
-                    "digital-subcarrier-output-power": -2.4
-                  },
-                  {
-                    "digital-subcarrier-id": 4,
-                    "active": true,
-                    "digital-subcarrier-output-power": -2.6
-                  }
-                ],
-                "chromatic-dispersion": {
-                  "instant": 150.25,
-                  "avg": 149.8,
-                  "min": 148.5,
-                  "max": 151.0
-                },
-                "polarization-mode-dispersion": {
-                  "instant": 0.15,
-                  "avg": 0.14,
-                  "min": 0.12,
-                  "max": 0.17
-                },
-                "second-order-polarization-mode-dispersion": {
-                  "instant": 0.025,
-                  "avg": 0.023,
-                  "min": 0.02,
-                  "max": 0.028
-                },
-                "polarization-dependent-loss": {
-                  "instant": 0.8,
-                  "avg": 0.75,
-                  "min": 0.7,
-                  "max": 0.9
-                },
-                "modulator-bias-xi": {
-                  "instant": 50.25,
-                  "avg": 50.0,
-                  "min": 49.5,
-                  "max": 50.8
-                },
-                "modulator-bias-xq": {
-                  "instant": 49.75,
-                  "avg": 50.0,
-                  "min": 49.2,
-                  "max": 50.5
-                },
-                "modulator-bias-yi": {
-                  "instant": 50.1,
-                  "avg": 50.0,
-                  "min": 49.8,
-                  "max": 50.3
-                },
-                "modulator-bias-yq": {
-                  "instant": 49.9,
-                  "avg": 50.0,
-                  "min": 49.7,
-                  "max": 50.2
-                },
-                "modulator-bias-x-phase": {
-                  "instant": 0.5,
-                  "avg": 0.4,
-                  "min": 0.2,
-                  "max": 0.7
-                },
-                "modulator-bias-y-phase": {
-                  "instant": 0.3,
-                  "avg": 0.4,
-                  "min": 0.1,
-                  "max": 0.6
-                },
-                "osnr": {
-                  "instant": 25.5,
-                  "avg": 25.2,
-                  "min": 24.8,
-                  "max": 25.8
-                },
-                "carrier-frequency-offset": {
-                  "instant": 1.2,
-                  "avg": 1.1,
-                  "min": 0.8,
-                  "max": 1.5
-                },
-                "sop-roc": {
-                  "instant": 12.5,
-                  "avg": 12.0,
-                  "min": 11.5,
-                  "max": 13.0
-                },
-                "modulation-error-ratio": {
-                  "instant": -25.3,
-                  "avg": -25.5,
-                  "min": -26.0,
-                  "max": -25.0
-                },
-                "fec-uncorrectable-blocks": 0,
-                "pre-fec-ber": {
-                  "instant": 1e-15,
-                  "avg": 2e-15,
-                  "min": 1e-15,
-                  "max": 5e-15
-                },
-                "post-fec-ber": {
-                  "instant": 0.0,
-                  "avg": 0.0,
-                  "min": 0.0,
-                  "max": 0.0
-                },
-                "q-value": {
-                  "instant": 12.5,
-                  "avg": 12.3,
-                  "min": 12.0,
-                  "max": 12.8
-                },
-                "esnr": {
-                  "instant": 15.2,
-                  "avg": 15.0,
-                  "min": 14.8,
-                  "max": 15.5
-                }
-              }
-            ]
-          }
-        }
-      },
-      {
-        "name": "optical-channel-1/1/2",
-        "config": {
-          "name": "optical-channel-1/1/2",
-          "type": "openconfig-platform-types:OPTICAL_CHANNEL"
-        },
-        "state": {
-          "name": "optical-channel-1/1/2",
-          "type": "openconfig-platform-types:OPTICAL_CHANNEL",
-          "oper-status": "ACTIVE"
-        },
-        "optical-channel": {
-          "config": {
-            "frequency": 196200000,
-            "target-output-power": 2.0,
-            "operational-mode": 3,
-            "line-port": "port-1/1/2",
-            "digital-subcarrier-spacing": 50.0,
-            "digital-subcarriers-group": [
-              null,
-              {
-                "digital-subcarriers-group-id": 1,
-                "number-of-digital-subcarriers": 8,
-                "digital-subcarrier-group-size": 200,
-                "digital-subcarrier-id": [
-                  {
-                    "digital-subcarrier-id": 1,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.8
-                  },
-                  {
-                    "digital-subcarrier-id": 2,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.9
-                  },
-                  {
-                    "digital-subcarrier-id": 3,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.7
-                  },
-                  {
-                    "digital-subcarrier-id": 4,
-                    "active": true,
-                    "digital-subcarrier-output-power": 2.0
-                  },
-                  {
-                    "digital-subcarrier-id": 5,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.8
-                  },
-                  {
-                    "digital-subcarrier-id": 6,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.9
-                  },
-                  {
-                    "digital-subcarrier-id": 7,
-                    "active": false,
-                    "digital-subcarrier-output-power": 0.0
-                  },
-                  {
-                    "digital-subcarrier-id": 8,
-                    "active": false,
-                    "digital-subcarrier-output-power": 0.0
-                  }
-                ]
-              }
-            ]
-          },
-          "state": {
-            "frequency": 196200000,
-            "target-output-power": 2.0,
-            "operational-mode": 3,
-            "line-port": "port-1/1/2",
-            "input-power": {
-              "instant": -3.2,
-              "avg": -3.1,
-              "min": -3.5,
-              "max": -2.8
-            },
-            "output-power": {
-              "instant": 2.1,
-              "avg": 2.0,
-              "min": 1.8,
-              "max": 2.3
-            },
-            "total-number-of-digital-subcarriers": 12,
-            "digital-subcarrier-spacing": 50.0,
-            "digital-subcarriers-group": [
-              {
-                "digital-subcarriers-group-id": 1,
-                "number-of-digital-subcarriers": 8,
-                "digital-subcarrier-group-size": 200,
-                "digital-subcarrier-id": [
-                  {
-                    "digital-subcarrier-id": 1,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.8
-                  },
-                  {
-                    "digital-subcarrier-id": 2,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.9
-                  },
-                  {
-                    "digital-subcarrier-id": 3,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.7
-                  },
-                  {
-                    "digital-subcarrier-id": 4,
-                    "active": true,
-                    "digital-subcarrier-output-power": 2.0
-                  },
-                  {
-                    "digital-subcarrier-id": 5,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.8
-                  },
-                  {
-                    "digital-subcarrier-id": 6,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.9
-                  },
-                  {
-                    "digital-subcarrier-id": 7,
-                    "active": false,
-                    "digital-subcarrier-output-power": 0.0
-                  },
-                  {
-                    "digital-subcarrier-id": 8,
-                    "active": false,
-                    "digital-subcarrier-output-power": 0.0
-                  }
-                ]
-              },
-              {
-                "digital-subcarriers-group-id": 2,
-                "number-of-digital-subcarriers": 4,
-                "digital-subcarrier-group-size": 200,
-                "digital-subcarrier-id": [
-                  {
-                    "digital-subcarrier-id": 9,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.5
-                  },
-                  {
-                    "digital-subcarrier-id": 10,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.6
-                  },
-                  {
-                    "digital-subcarrier-id": 11,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.4
-                  },
-                  {
-                    "digital-subcarrier-id": 12,
-                    "active": true,
-                    "digital-subcarrier-output-power": 1.7
-                  }
-                ]
-              }
-            ]
-          }
-        }
-      },
-      {
-        "name": "transceiver-1/1",
-        "config": {
-          "name": "transceiver-1/1",
-          "type": "openconfig-platform-types:TRANSCEIVER"
-        },
-        "state": {
-          "name": "transceiver-1/1",
-          "type": "openconfig-platform-types:TRANSCEIVER",
-          "oper-status": "ACTIVE",
-          "description": "100G QSFP28 transceiver",
-          "mfg-name": "ACME Optics",
-          "part-no": "QSFP28-100G-LR4",
-          "serial-no": "AC123456789"
-        }
-      },
-      {
-        "name": "transceiver-1/2",
-        "config": {
-          "name": "transceiver-1/2",
-          "type": "openconfig-platform-types:TRANSCEIVER"
-        },
-        "state": {
-          "name": "transceiver-1/2",
-          "type": "openconfig-platform-types:TRANSCEIVER",
-          "oper-status": "ACTIVE",
-          "description": "400G QSFP-DD coherent transceiver",
-          "mfg-name": "ACME Optics",
-          "part-no": "QSFPDD-400G-ZR",
-          "serial-no": "AC987654321"
-        }
-      },
-      {
-        "name": "port-1/1/1",
-        "config": {
-          "name": "port-1/1/1",
-          "type": "openconfig-platform-types:PORT"
-        },
-        "state": {
-          "name": "port-1/1/1",
-          "type": "openconfig-platform-types:PORT",
-          "oper-status": "ACTIVE",
-          "description": "Line port for 100G channel"
-        }
-      },
-      {
-        "name": "port-1/1/2",
-        "config": {
-          "name": "port-1/1/2",
-          "type": "openconfig-platform-types:PORT"
-        },
-        "state": {
-          "name": "port-1/1/2",
-          "type": "openconfig-platform-types:PORT",
-          "oper-status": "ACTIVE",
-          "description": "Line port for 400G channel with digital subcarriers"
-        }
-      }
-    ]
-  }
-}
\ No newline at end of file
diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datastore.py b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datastore.py
deleted file mode 100644
index e6a704234..000000000
--- a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/datastore.py
+++ /dev/null
@@ -1,265 +0,0 @@
-# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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
-import os
-import threading
-from typing import Any, Dict, List
-
-DEFAULT_PATH = os.environ.get(
-    "DSCM_DATASTORE",
-    os.path.join(os.path.dirname(__file__), "datamodels", "dscm_store.json")
-)
-
-class Store:
-    """
-    Simple file-backed JSON store.
-    - Thread-safe (single lock).
-    - Access by JSON Pointer (RFC 6901) produced by path_resolver.
-    - Semantics:
-        get(ptr) -> value or None
-        create(ptr, obj) -> creates at ptr if not exists (for POST)
-        replace(ptr, obj) -> replaces/creates (for PUT)
-        merge(ptr, obj) -> deep merge dicts (for PATCH)
-        delete(ptr)
-    """
-    def __init__(self, filepath: str = DEFAULT_PATH):
-        self.filepath = filepath
-        self._lock = threading.RLock()
-        os.makedirs(os.path.dirname(self.filepath), exist_ok=True)
-        if not os.path.exists(self.filepath):
-            with open(self.filepath, "w", encoding="utf-8") as f:
-                json.dump({}, f)
-
-    def _read(self) -> Dict[str, Any]:
-        with open(self.filepath, "r", encoding="utf-8") as f:
-            return json.load(f)
-
-    def _write(self, data: Dict[str, Any]):
-        tmp = self.filepath + ".tmp"
-        with open(tmp, "w", encoding="utf-8") as f:
-            json.dump(data, f, ensure_ascii=False, indent=2)
-        os.replace(tmp, self.filepath)
-
-    # --- JSON Pointer helpers ---
-    @staticmethod
-    def _walk(root: Any, tokens: List[str], create_missing=False):
-        cur = root
-        for i, tok in enumerate(tokens[:-1]):
-            if isinstance(cur, list):
-                # For YANG lists, search for item with matching key field
-                # Common key fields: 'index', 'name', 'id', etc.
-                found = False
-                for item in cur:
-                    if isinstance(item, dict):
-                        # Try common YANG list key fields
-                        key_fields = ['index', 'name', 'id', 'mode-id', 'digital-subcarriers-group-id', 'digital-subcarrier-id']
-                        for key_field in key_fields:
-                            if key_field in item:
-                                # Convert both to strings for comparison
-                                if str(item[key_field]) == str(tok):
-                                    cur = item
-                                    found = True
-                                    break
-                        if found:
-                            break
-                if not found:
-                    if create_missing:
-                        # For lists, we can't create missing items without knowing the structure
-                        raise KeyError(f"Cannot create missing list item '{tok}' without context")
-                    else:
-                        raise KeyError(f"List item with key '{tok}' not found")
-            else:
-                if tok not in cur:
-                    if create_missing:
-                        cur[tok] = {}
-                    else:
-                        raise KeyError(f"Missing key '{tok}'")
-                cur = cur[tok]
-        return cur, tokens[-1] if tokens else None
-
-    @staticmethod
-    def _split(ptr: str) -> List[str]:
-        if not ptr or ptr == "/":
-            return []
-        if ptr[0] != "/":
-            raise KeyError("Pointer must start with '/'")
-        tokens = ptr.split("/")[1:]
-        # Unescape per RFC 6901
-        return [t.replace("~1", "/").replace("~0", "~") for t in tokens]
-
-    def get_root(self):
-        with self._lock:
-            return self._read()
-
-    def get(self, ptr: str):
-        with self._lock:
-            data = self._read()
-            tokens = self._split(ptr)
-            if not tokens:
-                return data
-            cur = data
-            for i, tok in enumerate(tokens):
-                if isinstance(cur, list):
-                    # For YANG lists, search for item with matching key field
-                    # Common key fields: 'index', 'name', 'id', etc.
-                    found = False
-                    for item in cur:
-                        if isinstance(item, dict):
-                            # Try common YANG list key fields
-                            key_fields = ['index', 'name', 'id', 'mode-id', 'digital-subcarriers-group-id', 'digital-subcarrier-id']
-                            for key_field in key_fields:
-                                if key_field in item:
-                                    # Convert both to strings for comparison
-                                    if str(item[key_field]) == str(tok):
-                                        cur = item
-                                        found = True
-                                        break
-                            if found:
-                                break
-                    if not found:
-                        return None
-                else:
-                    if tok not in cur:
-                        return None
-                    cur = cur[tok]
-            return cur
-
-    def create(self, ptr: str, obj: Any):
-        with self._lock:
-            data = self._read()
-            tokens = self._split(ptr)
-            if not tokens:
-                # POST at root merges keys if not exist
-                if not isinstance(obj, dict):
-                    raise ValueError("Root create expects an object")
-                for k in obj:
-                    if k in data:
-                        raise ValueError(f"Key '{k}' exists")
-                data.update(obj)
-                self._write(data)
-                return obj
-
-            parent, leaf = self._walk(data, tokens, create_missing=True)
-            if isinstance(parent, list):
-                if leaf != "-":
-                    raise ValueError("For lists, use '-' to append")
-                if not isinstance(obj, (dict, list)):
-                    raise ValueError("Append expects object or list item")
-                parent.append(obj)
-            else:
-                if leaf in parent:
-                    raise ValueError(f"Key '{leaf}' exists")
-                parent[leaf] = obj
-            self._write(data)
-            return obj
-
-    def replace(self, ptr: str, obj: Any):
-        with self._lock:
-            data = self._read()
-            tokens = self._split(ptr)
-            if not tokens:
-                if not isinstance(obj, dict):
-                    raise ValueError("Root replace expects an object")
-                self._write(obj)
-                return obj
-            parent, leaf = self._walk(data, tokens, create_missing=True)
-            if isinstance(parent, list):
-                idx = int(leaf)
-                while idx >= len(parent):
-                    parent.append(None)
-                parent[idx] = obj
-            else:
-                parent[leaf] = obj
-            self._write(data)
-            return obj
-
-    def merge(self, ptr: str, obj: Any):
-        def deep_merge(a, b):
-            if isinstance(a, dict) and isinstance(b, dict):
-                for k, v in b.items():
-                    a[k] = deep_merge(a.get(k), v) if k in a else v
-                return a
-            return b
-
-        with self._lock:
-            data = self._read()
-            tokens = self._split(ptr)
-            if not tokens:
-                if not isinstance(obj, dict):
-                    raise ValueError("Root merge expects an object")
-                merged = deep_merge(data, obj)
-                self._write(merged)
-                return merged
-            parent, leaf = self._walk(data, tokens, create_missing=True)
-            if isinstance(parent, list):
-                # Try to interpret as integer index first
-                try:
-                    idx = int(leaf)
-                    while idx >= len(parent):
-                        parent.append({})
-                    parent[idx] = deep_merge(parent[idx], obj)
-                    target = parent[idx]
-                except ValueError:
-                    # If not an integer, search for matching key in list items
-                    found = False
-                    for i, item in enumerate(parent):
-                        if isinstance(item, dict) and item.get('name') == leaf:
-                            parent[i] = deep_merge(item, obj)
-                            target = parent[i]
-                            found = True
-                            break
-                    if not found:
-                        raise KeyError(f"List item with name '{leaf}' not found for merge")
-            else:
-                cur = parent.get(leaf, {})
-                parent[leaf] = deep_merge(cur, obj)
-                target = parent[leaf]
-            self._write(data)
-            return target
-
-    def delete(self, ptr: str):
-        with self._lock:
-            data = self._read()
-            tokens = self._split(ptr)
-            if not tokens:
-                # wipe root
-                self._write({})
-                return
-            parent, leaf = self._walk(data, tokens)
-            if isinstance(parent, list):
-                # For YANG lists, find the item with matching key field
-                found_index = None
-                for i, item in enumerate(parent):
-                    if isinstance(item, dict):
-                        # Try common YANG list key fields
-                        key_fields = ['index', 'name', 'id', 'mode-id', 'digital-subcarriers-group-id', 'digital-subcarrier-id']
-                        for key_field in key_fields:
-                            if key_field in item:
-                                # Convert both to strings for comparison
-                                if str(item[key_field]) == str(leaf):
-                                    found_index = i
-                                    break
-                        if found_index is not None:
-                            break
-                if found_index is not None:
-                    del parent[found_index]
-                else:
-                    raise KeyError(f"List item with key '{leaf}' not found")
-            else:
-                if leaf not in parent:
-                    raise KeyError("Missing key")
-                del parent[leaf]
-            self._write(data)
diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/dscm.py b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/dscm.py
deleted file mode 100644
index 80c998d08..000000000
--- a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/dscm.py
+++ /dev/null
@@ -1,60 +0,0 @@
-# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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
-from typing import Dict
-from device.service.drivers.netconf_dscm.NetConfDriver import NetConfDriver
-
-LOGGER = logging.getLogger(__name__)
-logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
-
-DEVICES = {
-            'T2.1': {'address': '10.30.7.7', 'port': 2023, 'settings': {}},
-            'T1.1': {'address': '10.30.7.8', 'port': 2023, 'settings': {}},
-            'T1.2': {'address': '10.30.7.8', 'port': 2023, 'settings': {}},
-            'T1.3': {'address': '10.30.7.8', 'port': 2023, 'settings': {}}
-         }
-
-# NODES = {'T2.1': 'hub', 'T1.1': 'leaves', 'T1.2': 'leaves', 'T1.3': 'leaves'}
-
-class DscmPlugin:
-    def __init__(self, device_id : str):
-        self.device_id = device_id              #NODES.get(device_id)
-        # if not self.device_id:
-        #     LOGGER.error(f"Device ID {self.device_id} not found in NODES mapping.")
-        #     raise ValueError(f"Unknown device ID: {self.device_id}")
-        device_config  = DEVICES.get(self.device_id)
-        if not device_config:
-            LOGGER.error(f"Device ID {self.device_id} not found in configuration.")
-            raise ValueError(f"Unknown device ID: {device_id}")
-        self.driver = NetConfDriver(
-            device_config['address'], device_config['port'], **(device_config['settings'])
-        )
-        LOGGER.info(f"Initialized DscmPlugin for device {self.device_id} with following config: {device_config}")
-
-    def Configure_pluaggable(self, config : Dict) -> bool:
-        LOGGER.info(f"Configuring pluggable for device {self.device_id} with config: {config}. Config type: {type(config)}")
-        try:
-            result_config = self.driver.SetConfig([(self.device_id, config)])
-            if isinstance(result_config[0], bool):
-                LOGGER.info(f"SetConfig successful for device {self.device_id}. Response: {result_config}")
-                return True
-            else:
-                LOGGER.error(f"SBI failed for configure device {self.device_id}. Response: {result_config}")
-                return False
-        except Exception as e:
-            LOGGER.error(f"SetConfig exception for device {self.device_id}: {str(e)}")
-            return False
diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/path_resolver.py b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/path_resolver.py
deleted file mode 100644
index bf5b6f7c1..000000000
--- a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/path_resolver.py
+++ /dev/null
@@ -1,143 +0,0 @@
-# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 re
-
-class RestconfPath:
-    """
-    Parses RESTCONF data paths into a JSON Pointer.
-    Very lightweight: assumes RFC 8040 JSON encoding already used in your JSON.
-    Examples:
-      rc: openconfig-terminal-device:terminal-devices/device[name=dev1]/...
-      -> /openconfig-terminal-device/terminal-devices/device/dev1/...
-    Notes:
-      - list keys become path segments (common for simple JSON stores)
-      - module prefix ':' becomes '/'
-    """
-
-    def __init__(self, raw: str):
-        self.raw = raw.strip().strip("/")
-        self.tokens = self._parse(self.raw)
-
-    def json_pointer(self) -> str:
-        if not self.tokens:
-            return "/"
-        # Escape ~ and / per RFC 6901
-        esc = [t.replace("~", "~0").replace("/", "~1") for t in self.tokens]
-        return "/" + "/".join(esc)
-
-    @staticmethod
-    def _parse(raw: str):
-        # Strip optional 'data/' if someone passes the whole tail
-        if raw.startswith("data/"):
-            raw = raw[5:]
-
-        # Special handling for paths that contain component= with slashes
-        # This handles the case where Flask has already URL-decoded %2F to /
-        # Look for patterns like "component=something/with/slashes/more-stuff"
-        
-        # Split on / but be smart about component= assignments
-        parts = []
-        remaining = raw
-        
-        while remaining:
-            # Find the next / that's not part of a component= value
-            if "component=" in remaining:
-                # Find where component= starts
-                comp_start = remaining.find("component=")
-                if comp_start >= 0:
-                    # Add everything before component= as separate parts
-                    if comp_start > 0:
-                        before_comp = remaining[:comp_start].rstrip("/")
-                        if before_comp:
-                            parts.extend(before_comp.split("/"))
-                    
-                    # Now handle the component= part
-                    comp_part = remaining[comp_start:]
-                    
-                    # Find the next / that starts a new path segment (not part of component name)
-                    # Look for pattern that indicates start of new segment (like /config, /state, /optical-channel)
-                    next_segment_match = re.search(r'/(?:config|state|optical-channel|ingress|ethernet|otn)', comp_part)
-                    
-                    if next_segment_match:
-                        # Split at the next major segment
-                        comp_value = comp_part[:next_segment_match.start()]
-                        remaining = comp_part[next_segment_match.start()+1:]
-                    else:
-                        # No more segments, take the whole thing
-                        comp_value = comp_part
-                        remaining = ""
-                    
-                    parts.append(comp_value)
-                else:
-                    # No component= found, split normally
-                    next_slash = remaining.find("/")
-                    if next_slash >= 0:
-                        parts.append(remaining[:next_slash])
-                        remaining = remaining[next_slash+1:]
-                    else:
-                        parts.append(remaining)
-                        remaining = ""
-            else:
-                # No component= in remaining, split normally on /
-                if "/" in remaining:
-                    next_slash = remaining.find("/")
-                    parts.append(remaining[:next_slash])
-                    remaining = remaining[next_slash+1:]
-                else:
-                    parts.append(remaining)
-                    remaining = ""
-
-        tokens = []
-        for part in parts:
-            if not part:  # Skip empty parts
-                continue
-                
-            if ":" in part:
-                # For YANG modules, keep the module:container format for JSON keys
-                # e.g., openconfig-platform:components stays as openconfig-platform:components
-                pass
-
-            # Convert list key syntax [k=v] into segments ...//
-            # Also handle direct assignment: list=value -> list/value  
-            # e.g., device[name=dev1] -> device/dev1
-            # e.g., component=optical-channel-1/1/1 -> component/optical-channel-1/1/1
-            
-            # Check for direct assignment first (RFC 8040 syntax)
-            if "=" in part and "[" not in part:
-                list_name, key_value = part.split("=", 1)
-                tokens.append(list_name)
-                # No need to URL decode again since Flask already did it
-                tokens.append(key_value)
-                continue
-                
-            # Handle bracket syntax [k=v]
-            m = re.match(r"^([A-Za-z0-9\-\_]+)(\[(.+?)\])?$", part)
-            if not m:
-                tokens.append(part)
-                continue
-
-            base = m.group(1)
-            tokens.append(base)
-
-            kvs = m.group(3)
-            if kvs:
-                # support single key or multi-key; take values in order
-                # e.g., [name=dev1][index=0] -> /dev1/0
-                for each in re.findall(r"([^\]=]+)=([^\]]+)", kvs):
-                    # No need to URL decode again since Flask already did it
-                    key_value = each[1]
-                    tokens.append(key_value)
-        return tokens
diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/requirements.txt b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/requirements.txt
deleted file mode 100644
index 7bc9e27b1..000000000
--- a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/requirements.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-flask>=3.0.0
-pytest>=8.4.1
-pytest-cov>=6.2.1
-requests>=2.31.0
-flask-socketio==5.5.1
\ No newline at end of file
diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/routes.py b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/routes.py
index ab49af758..e0ca2766f 100644
--- a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/routes.py
+++ b/src/nbi/service/rest_server/nbi_plugins/dscm_oc/routes.py
@@ -13,7 +13,6 @@
 # limitations under the License.
 
 import logging
-from .datastore                                import Store
 from .enforce_header                           import require_accept, require_content_type
 from .error                                    import _bad_request, _not_found, yang_json
 from .json_to_proto_conversion                 import (
@@ -29,7 +28,7 @@ from common.method_wrappers.ServiceExceptions  import (
     InvalidArgumentException
 )
 from common.tools.grpc.Tools                   import grpc_message_to_json
-from flask                                     import Blueprint, request, Response, abort
+from flask                                     import Blueprint, request, Response
 from pluggables.client.PluggablesClient        import PluggablesClient
 
 
@@ -41,35 +40,17 @@ blueprint = Blueprint("testconf_dscm", __name__)
 YANG_JSON = "application/yang-data+json"
 ERR_JSON  = "application/yang-errors+json"
 
-# -- Global store instance --
-store = Store()
-
-# -- Temporary solution for device-specific stores --
-# TODO: This should be replaced with Context get_device method.
-def get_device_store(device_uuid=None):
-    """Get store instance, optionally scoped to a specific device."""
-    if device_uuid:
-        # Use device-specific datastore
-        LOGGER.info(f"Using device-specific store for device UUID: {device_uuid}")
-        import os
-        device_path = os.environ.get(
-            "DSCM_DATASTORE_DIR", 
-            os.path.join(os.path.dirname(__file__), "datamodels")
-        )
-        device_file = os.path.join(device_path, f"device_{device_uuid}.json")
-        return Store(device_file)
-    return store
 
 # Root endpoints (both prefixes) TODO: call list pluggables if device_uuid is given
-@blueprint.route("/device=/", methods=["GET"])
-@blueprint.route("/", methods=["GET"], defaults={'device_uuid': None})
-@require_accept([YANG_JSON])
-def list_root(device_uuid=None):
-    """List top-level modules/containers available."""
-    device_store = get_device_store(device_uuid)
-    return yang_json(device_store.get_root())
+# @blueprint.route("/device=/", methods=["GET"])
+# @blueprint.route("/", methods=["GET"], defaults={'device_uuid': None})
+# @require_accept([YANG_JSON])
+# def list_root(device_uuid=None):
+#     """List top-level modules/containers available."""
+#     # TODO: If device_uuid is given, call ListPluggables gRPC method
+#     return 
+
 
-# Data manipulation endpoints (both prefixes)
 @blueprint.route("/device=/", methods=["GET"])
 @require_accept([YANG_JSON])
 def rc_get(rc_path, device_uuid=None):
@@ -154,7 +135,6 @@ def rc_delete(rc_path, device_uuid=None):
         
     except NotFoundException as e:
         LOGGER.warning(f"Pluggable not found for device {device_uuid}: {e.details} (already deleted or never existed)")
-        # DELETE is idempotent - return 204 even if resource doesn't exist
         return Response(status=204)
     
     except ServiceException as e:
@@ -163,47 +143,3 @@ def rc_delete(rc_path, device_uuid=None):
 
     finally:
         pluggables_client.close()
-
-# --------------------------------
-# The PUT and PATCH methods are not implemented for pluggables Service.
-# --------------------------------
-# @blueprint.route("/device=/", methods=["PUT"])
-# @require_accept([YANG_JSON])
-# @require_content_type([YANG_JSON])
-# def rc_put(rc_path, device_uuid=None):
-#     device_store = get_device_store(device_uuid)
-#     p = RestconfPath(rc_path)
-#     payload = request.get_json(force=True, silent=True)
-#     if payload is None:
-#         return _bad_request("Invalid or empty JSON payload.", path=p.raw)
-
-#     try:
-#         updated = device_store.replace(p.json_pointer(), payload)
-#     except KeyError as e:
-#         return _bad_request(str(e), path=p.raw)
-#     return yang_json(updated, status=200)
-
-# @blueprint.route("/device=/", methods=["PATCH"])
-# @require_accept([YANG_JSON])
-# @require_content_type([YANG_JSON])
-# def rc_patch(rc_path, device_uuid=None):
-#     if device_uuid is None:
-#         return _bad_request("Device UUID must be specified for PATCH requests.", path=rc_path)
-#     Pluggable = DscmPlugin(device_id=device_uuid)
-#     response = Pluggable.Configure_pluaggable(request.get_json())
-#     if not response:
-#         return _bad_request("Failed to configure pluggable device.", path=rc_path)
-#     return yang_json({"result": response}, status=200)
-
-    # device_store = get_device_store(device_uuid)
-    # p = RestconfPath(rc_path)
-    # payload = request.get_json(force=True, silent=True)
-    # if payload is None:
-    #     return _bad_request("Invalid or empty JSON payload.", path=p.raw)
-
-    # try:
-    #     merged = device_store.merge(p.json_pointer(), payload)
-    # except KeyError as e:
-    #     return _bad_request(str(e), path=p.raw)
-    # return yang_json(merged, status=200)
-
diff --git a/src/nbi/tests/messages/dscm_messages.py b/src/nbi/tests/messages/dscm_messages.py
index ef97a4c8b..03d4ebda4 100644
--- a/src/nbi/tests/messages/dscm_messages.py
+++ b/src/nbi/tests/messages/dscm_messages.py
@@ -57,4 +57,4 @@ def get_leaf_payload():
                 "digital_subcarriers_groups": [{ "group_id": 3 }]
             }
         ]
-    }
\ No newline at end of file
+    }
-- 
GitLab


From 9034dcd37297ac2a3cb275b504d3712189a0b8e4 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Thu, 30 Oct 2025 08:50:45 +0000
Subject: [PATCH 038/111] feat: Minor improvements and added TODOs

- Add OperationFailedException for error handling
- Improve logging in PluggablesService
- Clean up imports in config_translator and testmessages
---
 .../service/PluggablesServiceServicerImpl.py    | 17 +++++++++--------
 src/pluggables/service/config_translator.py     |  4 ++--
 src/pluggables/tests/testmessages.py            |  3 +++
 3 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/src/pluggables/service/PluggablesServiceServicerImpl.py b/src/pluggables/service/PluggablesServiceServicerImpl.py
index 5509b9d66..098c4f9ac 100644
--- a/src/pluggables/service/PluggablesServiceServicerImpl.py
+++ b/src/pluggables/service/PluggablesServiceServicerImpl.py
@@ -20,7 +20,7 @@ from common.proto.pluggables_pb2 import (
     Pluggable, CreatePluggableRequest, ListPluggablesRequest, ListPluggablesResponse, 
     GetPluggableRequest, DeletePluggableRequest, ConfigurePluggableRequest)
 from common.method_wrappers.ServiceExceptions import (
-    NotFoundException, AlreadyExistsException, InvalidArgumentException)
+    NotFoundException, AlreadyExistsException, InvalidArgumentException, OperationFailedException)
 from common.tools.object_factory.ConfigRule import json_config_rule_set
 from context.client.ContextClient import ContextClient
 from device.client.DeviceClient import DeviceClient
@@ -46,7 +46,7 @@ class PluggablesServiceServicerImpl(PluggablesServiceServicer):
         """
         LOGGER.info(f"Configuring device {device_uuid}, pluggable index {pluggable_index}")
         
-        # Step 1: Get the device from Context service (to extract IP address and determine template)
+        # Step 1: Get the device from Context service (to extract IP address)
         try:
             device = self.context_client.GetDevice(DeviceId(device_uuid={'uuid': device_uuid}))  # type: ignore
             LOGGER.info(f"Retrieved device from Context: {device.name}")
@@ -73,7 +73,6 @@ class PluggablesServiceServicerImpl(PluggablesServiceServicer):
         elif device_address == '10.30.7.8':
             template_identifier = 'leaf'
         else:
-            # Default to hub template if IP address cannot be determined
             LOGGER.warning(f"Cannot determine device type from IP address {device_address}, defaulting to hub template")
             raise InvalidArgumentException( 'Device IP address', device_address, extra_details='Unknown device IP adress')
         
@@ -153,7 +152,8 @@ class PluggablesServiceServicerImpl(PluggablesServiceServicer):
             LOGGER.info(f"Device {device_uuid} found in Context service: {device.name}")
         except grpc.RpcError as e:
             LOGGER.error(f"Device {device_uuid} not found in Context service: {e}")
-            raise NotFoundException('Device', device_uuid, extra_details='Device must exist before creating pluggable')
+            raise NotFoundException(
+                'Device', device_uuid, extra_details='Device must exist before creating pluggable')
         
         # If initial_config is provided, push configuration to device
         if request.HasField('initial_config') and len(pluggable.config.dsc_groups) > 0:
@@ -162,9 +162,8 @@ class PluggablesServiceServicerImpl(PluggablesServiceServicer):
                 self._push_config_to_device(device_uuid, pluggable_index, pluggable.config)
             except Exception as e:
                 LOGGER.error(f"Failed to push initial config to device: {e}")
-                raise 
-                # We still create the pluggable in memory, but log the error
-                # In production, you might want to raise the exception instead
+                raise OperationFailedException(
+                    'Push initial pluggable configuration', extra_details=str(e))
         
         self.pluggables[pluggable_key] = pluggable
         
@@ -214,7 +213,9 @@ class PluggablesServiceServicerImpl(PluggablesServiceServicer):
             LOGGER.info(f'No matching pluggable found: device={device_uuid}, index={pluggable_index}')
             raise NotFoundException('Pluggable', pluggable_key)
         
-        # Remove pluggable config from device via DSCM driver
+        # Remove pluggable config from device
+        # TODO: Verify deletion works with actual hub and leaf devices
+        # 
         try:
             pluggable = self.pluggables[pluggable_key]
             # Create empty config to trigger deletion
diff --git a/src/pluggables/service/config_translator.py b/src/pluggables/service/config_translator.py
index 3405fbb66..d28e2ae01 100644
--- a/src/pluggables/service/config_translator.py
+++ b/src/pluggables/service/config_translator.py
@@ -13,9 +13,9 @@
 # limitations under the License.
 
 import logging
-from typing import Dict, Any, List, Optional
+from typing import Dict, Any
 from common.proto.pluggables_pb2 import PluggableConfig
-from common.proto.context_pb2 import ConfigRule, ConfigActionEnum
+from common.proto.context_pb2 import ConfigRule
 
 LOGGER = logging.getLogger(__name__)
 
diff --git a/src/pluggables/tests/testmessages.py b/src/pluggables/tests/testmessages.py
index 9a0fb5a05..c7a7fe934 100644
--- a/src/pluggables/tests/testmessages.py
+++ b/src/pluggables/tests/testmessages.py
@@ -142,6 +142,9 @@ def create_get_pluggable_request(
 # DeletePluggableRequest
 ###########################
 
+# TODO: Both leaf and hub have a same jinja template for deleting pluggable config.
+# The difference lies in the component name (channel-1 for hub, channel-1/3/5 for leaf).
+
 def create_delete_pluggable_request(
     device_uuid: str,
     pluggable_index: int
-- 
GitLab


From 80ada479432659790a59dcd1da9d15714572ee5b Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Thu, 30 Oct 2025 09:14:28 +0000
Subject: [PATCH 039/111] Replaces two hub and leaf templates with generic
 template

---
 src/device/service/drivers/__init__.py        | 36 +++++++------------
 .../drivers/openconfig/templates/__init__.py  | 23 +++---------
 ...onfig_hub_template.xml => edit_config.xml} |  0
 .../1/config/edit_config_leaf_template.xml    | 31 ----------------
 .../service/PluggablesServiceServicerImpl.py  | 32 ++++-------------
 5 files changed, 25 insertions(+), 97 deletions(-)
 rename src/device/service/drivers/openconfig/templates/pluggable/1/config/{edit_config_hub_template.xml => edit_config.xml} (100%)
 delete mode 100644 src/device/service/drivers/openconfig/templates/pluggable/1/config/edit_config_leaf_template.xml

diff --git a/src/device/service/drivers/__init__.py b/src/device/service/drivers/__init__.py
index ed6f24fbf..92fdff911 100644
--- a/src/device/service/drivers/__init__.py
+++ b/src/device/service/drivers/__init__.py
@@ -98,19 +98,19 @@ if LOAD_ALL_DEVICE_DRIVERS:
             }
         ]))
 
-if LOAD_ALL_DEVICE_DRIVERS:
-    from .gnmi_openconfig.GnmiOpenConfigDriver import GnmiOpenConfigDriver # pylint: disable=wrong-import-position
-    DRIVERS.append(
-        (GnmiOpenConfigDriver, [
-            {
-                # Real Packet Router, specifying gNMI OpenConfig Driver => use GnmiOpenConfigDriver
-                FilterFieldEnum.DEVICE_TYPE: [
-                    DeviceTypeEnum.PACKET_POP,
-                    DeviceTypeEnum.PACKET_ROUTER,
-                ],
-                FilterFieldEnum.DRIVER     : DeviceDriverEnum.DEVICEDRIVER_GNMI_OPENCONFIG,
-            }
-        ]))
+# if LOAD_ALL_DEVICE_DRIVERS:
+#     from .gnmi_openconfig.GnmiOpenConfigDriver import GnmiOpenConfigDriver # pylint: disable=wrong-import-position
+#     DRIVERS.append(
+#         (GnmiOpenConfigDriver, [
+#             {
+#                 # Real Packet Router, specifying gNMI OpenConfig Driver => use GnmiOpenConfigDriver
+#                 FilterFieldEnum.DEVICE_TYPE: [
+#                     DeviceTypeEnum.PACKET_POP,
+#                     DeviceTypeEnum.PACKET_ROUTER,
+#                 ],
+#                 FilterFieldEnum.DRIVER     : DeviceDriverEnum.DEVICEDRIVER_GNMI_OPENCONFIG,
+#             }
+#         ]))
 
 if LOAD_ALL_DEVICE_DRIVERS:
     from .gnmi_nokia_srlinux.GnmiNokiaSrLinuxDriver import GnmiNokiaSrLinuxDriver # pylint: disable=wrong-import-position
@@ -251,13 +251,3 @@ if LOAD_ALL_DEVICE_DRIVERS:
             }
         ]))
 
-if LOAD_ALL_DEVICE_DRIVERS:
-    from .netconf_dscm.NetConfDriver import NetConfDriver # pylint: disable=wrong-import-position
-    DRIVERS.append(
-        (NetConfDriver, [
-            {
-                # Real DSCM, specifying NetConf Driver => use NetConfDriver
-                FilterFieldEnum.DEVICE_TYPE: DeviceTypeEnum.DSCM_NODE,
-                FilterFieldEnum.DRIVER     : DeviceDriverEnum.DRVICEDRIVER_NETCONF_DSCM,
-            }
-        ]))
diff --git a/src/device/service/drivers/openconfig/templates/__init__.py b/src/device/service/drivers/openconfig/templates/__init__.py
index 514c3a696..eca314a84 100644
--- a/src/device/service/drivers/openconfig/templates/__init__.py
+++ b/src/device/service/drivers/openconfig/templates/__init__.py
@@ -137,24 +137,11 @@ def compose_config( # template generation
                 templates.append(JINJA_ENV.get_template(acl_entry_path))
                 templates.append(JINJA_ENV.get_template(acl_ingress_path))
         elif "pluggable" in resource_key:  # MANAGING DSCM (Digital Subcarrier Modules)
-            # Resource key format: /pluggable/{template_index}/config/{template_identifier}
-            # Example: /pluggable/1/config/hub or /pluggable/1/config/leaf
-            # Extract template identifier (hub or leaf) from the resource key
-            key_parts = resource_key.strip('/').split('/')
-            if len(key_parts) >= 4 and key_parts[-1] in ['hub', 'leaf']:
-                template_identifier = key_parts[-1]  # 'hub' or 'leaf'
-                template_index = key_parts[1] if len(key_parts) > 1 else '1'
-                
-                # Build template path: pluggable/{index}/config/edit_config_{hub|leaf}_template.xml
-                template_path = f'pluggable/{template_index}/config/edit_config_{template_identifier}_template.xml'
-                templates.append(JINJA_ENV.get_template(template_path))
-                
-                LOGGER.info(f"Loading DSCM template: {template_path}")
-            else:
-                # Fallback to generic template if format doesn't match expected pattern
-                LOGGER.warning(f"Unexpected DSCM resource key format: {resource_key}, using default template")
-                template_name = '{:s}/edit_config.xml'.format(RE_REMOVE_FILTERS.sub('', resource_key))
-                templates.append(JINJA_ENV.get_template(template_name))
+            # Use generic pluggable template for all devices (hub and leaf)
+            # Resource key format: /pluggable/{template_index}/config
+            template_name = '{:s}/edit_config.xml'.format(RE_REMOVE_FILTERS.sub('', resource_key))
+            templates.append(JINJA_ENV.get_template(template_name))
+            LOGGER.info(f"Loading DSCM template: {template_name}")
             
             data : Dict[str, Any] = json.loads(resource_value)
         else:
diff --git a/src/device/service/drivers/openconfig/templates/pluggable/1/config/edit_config_hub_template.xml b/src/device/service/drivers/openconfig/templates/pluggable/1/config/edit_config.xml
similarity index 100%
rename from src/device/service/drivers/openconfig/templates/pluggable/1/config/edit_config_hub_template.xml
rename to src/device/service/drivers/openconfig/templates/pluggable/1/config/edit_config.xml
diff --git a/src/device/service/drivers/openconfig/templates/pluggable/1/config/edit_config_leaf_template.xml b/src/device/service/drivers/openconfig/templates/pluggable/1/config/edit_config_leaf_template.xml
deleted file mode 100644
index 4149bccda..000000000
--- a/src/device/service/drivers/openconfig/templates/pluggable/1/config/edit_config_leaf_template.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-
-    
-        {{name}}
-        
-            {% if operation is defined and operation != 'delete' %}
-            
-                {% if frequency is defined %}{{frequency}}{% endif %}
-                {% if target_output_power is defined %}{{target_output_power}}{% endif %}
-                {% if operational_mode is defined %}{{operational_mode}}{% endif %}
-
-                {% if digital_sub_carriers_group is defined and digital_sub_carriers_group %}
-                    {% for group in digital_sub_carriers_group %}
-                    
-                        {{group.digital_sub_carriers_group_id}}
-
-                        {% if group.digital_sub_carrier_id is defined and group.digital_sub_carrier_id %}
-                            {% for sub_carrier in group.digital_sub_carrier_id %}
-                            
-                                {{sub_carrier.sub_carrier_id}}
-                                {{sub_carrier.active}}
-                            
-                            {% endfor %}
-                        {% endif %}
-                    
-                    {% endfor %}
-                {% endif %}
-            
-            {% endif %}
-        
-    
-
diff --git a/src/pluggables/service/PluggablesServiceServicerImpl.py b/src/pluggables/service/PluggablesServiceServicerImpl.py
index 098c4f9ac..c34b0999f 100644
--- a/src/pluggables/service/PluggablesServiceServicerImpl.py
+++ b/src/pluggables/service/PluggablesServiceServicerImpl.py
@@ -60,42 +60,24 @@ class PluggablesServiceServicerImpl(PluggablesServiceServicer):
         
         LOGGER.info(f"Translated pluggable config to NETCONF format: {netconf_config}")
         
-        # Step 2: Extract device IP address from _connect/address config rule
-        device_address = None
-        for config_rule in device.device_config.config_rules:  # type: ignore
-            if config_rule.custom.resource_key == '_connect/address':  # type: ignore
-                device_address = config_rule.custom.resource_value  # type: ignore
-                break
-        
-        # Step 3: Determine the appropriate template based on device IP address (TODO: This need to be updated later)
-        if device_address == '10.30.7.7':
-            template_identifier = 'hub'
-        elif device_address == '10.30.7.8':
-            template_identifier = 'leaf'
-        else:
-            LOGGER.warning(f"Cannot determine device type from IP address {device_address}, defaulting to hub template")
-            raise InvalidArgumentException( 'Device IP address', device_address, extra_details='Unknown device IP adress')
-        
-        LOGGER.info(f"Using template identifier: {template_identifier} for device {device.name} (IP: {device_address})")
-        
-        # Step 4: Create configuration rule with template-specific resource key
-        # For simplicity, we use a fixed pluggable index of 1 for template lookup
-        template_index = 1  # TODO: This should be dynamic based on actual pluggable index
-        resource_key = f"/pluggable/{template_index}/config/{template_identifier}"
+        # Step 2: Create configuration rule with generic pluggable template
+        # Use template index 1 for standard pluggable configuration
+        template_index = 1
+        resource_key = f"/pluggable/{template_index}/config"
         
         # Create config rule dict and convert to protobuf
         config_json = json.dumps(netconf_config)
         config_rule_dict = json_config_rule_set(resource_key, config_json)
         config_rule = create_config_rule_from_dict(config_rule_dict)
         
-        # Step 5: Create a minimal Device object with only the DSCM config rule
+        # Step 3: Create a minimal Device object with only the DSCM config rule
         config_device = Device()
         config_device.device_id.device_uuid.uuid = device_uuid  # type: ignore
         config_device.device_config.config_rules.append(config_rule)  # type: ignore
         
-        LOGGER.info(f"Created minimal device with config rule: resource_key={resource_key}, template={template_identifier}")
+        LOGGER.info(f"Created minimal device with config rule: resource_key={resource_key}")
 
-        # Step 6: Call ConfigureDevice to push the configuration
+        # Step 4: Call ConfigureDevice to push the configuration
         try:
             device_id = self.device_client.ConfigureDevice(config_device)
             LOGGER.info(f"Successfully configured device {device_id.device_uuid.uuid}")  # type: ignore
-- 
GitLab


From c83234cb2d9f8c36374e188a29b3279775ca1803 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Thu, 30 Oct 2025 09:32:19 +0000
Subject: [PATCH 040/111] feat: Add channel_name field to PluggableConfig and
 update related translation logic.

---
 proto/pluggables.proto                      |  1 +
 src/pluggables/service/config_translator.py | 18 ++++++++++++------
 src/pluggables/tests/testmessages.py        |  2 ++
 3 files changed, 15 insertions(+), 6 deletions(-)

diff --git a/proto/pluggables.proto b/proto/pluggables.proto
index 8036a24be..da5e8081b 100644
--- a/proto/pluggables.proto
+++ b/proto/pluggables.proto
@@ -82,6 +82,7 @@ message PluggableConfig {
   double center_frequency_mhz                      = 3;   // center frequency in MHz
   int32  operational_mode                          = 4;   // e.g., 0=off and 1=on 
   int32  line_port                                 = 5;   // line port number
+  string channel_name                              = 6;   // channel name
   repeated DigitalSubcarrierGroupConfig dsc_groups = 10;
 }
 
diff --git a/src/pluggables/service/config_translator.py b/src/pluggables/service/config_translator.py
index d28e2ae01..4c0e8c765 100644
--- a/src/pluggables/service/config_translator.py
+++ b/src/pluggables/service/config_translator.py
@@ -30,23 +30,29 @@ def create_config_rule_from_dict(config_rule_dict: Dict[str, Any]) -> ConfigRule
 
 def translate_pluggable_config_to_netconf(
     pluggable_config: PluggableConfig,  # type: ignore
-    component_name: str = "channel-1"           # channel-1 for HUB and channel-1/3/5 for LEAF
+    component_name: str = "channel-1"           # Fallback if channel_name not provided (channel-1 for HUB and channel-1/3/5 for LEAF)
 ) -> Dict[str, Any]:
     """
     Translate PluggableConfig protobuf message to the format expected by NetConfDriver.
     Args:
         pluggable_config: PluggableConfig message containing DSC groups and subcarriers
-        component_name: Name of the optical channel component (default: "channel-1")
+        component_name: Fallback name if channel_name is not specified in config (default: "channel-1")
     Returns:
         Dictionary in the format expected by NetConfDriver templates:
     """
-    
+      
     if not pluggable_config or not pluggable_config.dsc_groups:
         LOGGER.warning("Empty pluggable config provided")
         return {
-            "name": component_name,
+            "name": channel_name,
             "operation": "delete"
         }
+    if hasattr(pluggable_config, 'channel_name') and pluggable_config.channel_name:
+        channel_name = pluggable_config.channel_name
+        LOGGER.debug(f"Using channel_name from PluggableConfig: {channel_name}")
+    else:
+        channel_name = component_name
+        LOGGER.debug(f"Using fallback component_name: {channel_name}")
     
     if not hasattr(pluggable_config, 'center_frequency_mhz') or pluggable_config.center_frequency_mhz <= 0:
         raise ValueError("center_frequency_mhz is required and must be greater than 0 in PluggableConfig")
@@ -88,14 +94,14 @@ def translate_pluggable_config_to_netconf(
     
     # Build the final configuration dictionary
     config = {
-        "name": component_name,
+        "name": channel_name,
         "frequency": center_frequency_mhz,
         "operational_mode": operational_mode, 
         "target_output_power": target_output_power,
         "digital_sub_carriers_group": digital_sub_carriers_groups
     }
     
-    LOGGER.info(f"Translated pluggable config to NETCONF format: component={component_name}, "
+    LOGGER.info(f"Translated pluggable config to NETCONF format: component={channel_name}, "
                 f"frequency={center_frequency_mhz} MHz, groups={len(digital_sub_carriers_groups)}")
     
     return config
diff --git a/src/pluggables/tests/testmessages.py b/src/pluggables/tests/testmessages.py
index c7a7fe934..c18924bab 100644
--- a/src/pluggables/tests/testmessages.py
+++ b/src/pluggables/tests/testmessages.py
@@ -57,6 +57,7 @@ def create_pluggable_request(
         _request.initial_config.operational_mode = 1  # Operational mode
         _request.initial_config.target_output_power_dbm = -10.0  # Target output power
         _request.initial_config.line_port = 1  # Line port number
+        _request.initial_config.channel_name = "channel-1"  # Channel name for component
         
         # Add sample DSC group configuration
         dsc_group = _request.initial_config.dsc_groups.add()
@@ -202,6 +203,7 @@ def create_configure_pluggable_request(
     _request.config.operational_mode           = 1  # Operational mode
     _request.config.target_output_power_dbm    = -10.0  # Target output power
     _request.config.line_port                  = 1  # Line port number
+    _request.config.channel_name               = "channel-1"  # Channel name for component
     
     # Add DSC group configuration
     group_1 = _request.config.dsc_groups.add()
-- 
GitLab


From 16abc1ba3e435f1a962af724a2caf06830dcb2bc Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Mon, 3 Nov 2025 15:27:57 +0000
Subject: [PATCH 041/111] Add production deployment support and Mimir
 configuration updates

- Introduced TFS_DEPLOY_PRODUCTION environment variable for production deployments in monitoring.sh and my_deploy.sh.
- Updated Mimir configuration in grafana_values.yaml to use the correct service URL.
- Added mimir_values.yaml configuration file for deployment.
---
 deploy/monitoring.sh                     |  37 ++++---
 manifests/monitoring/grafana_values.yaml |   2 +-
 manifests/monitoring/mimir_values.yaml   | 132 +++++++++++++++++++++++
 my_deploy.sh                             |   2 +
 4 files changed, 157 insertions(+), 16 deletions(-)
 create mode 100644 manifests/monitoring/mimir_values.yaml

diff --git a/deploy/monitoring.sh b/deploy/monitoring.sh
index c83d331e8..7b29eb48f 100755
--- a/deploy/monitoring.sh
+++ b/deploy/monitoring.sh
@@ -15,6 +15,9 @@
 
 set -euo pipefail
 
+# Deploy TFS in production environment
+export TFS_DEPLOY_PRODUCTION=${TFS_DEPLOY_PRODUCTION:-""}
+
 # -----------------------------------------------------------
 # Global namespace for all deployments
 # -----------------------------------------------------------
@@ -33,11 +36,11 @@ VALUES_FILE_PROM="$VALUES_FILE_PATH/prometheus_values.yaml"
 # -----------------------------------------------------------
 # Mimir Configuration
 # -----------------------------------------------------------
-# RELEASE_NAME_MIMIR="mon-mimir"
-# CHART_REPO_NAME_MIMIR="grafana"
-# CHART_REPO_URL_MIMIR="https://grafana.github.io/helm-charts"
-# CHART_NAME_MIMIR="mimir-distributed"
-# VALUES_FILE_MIMIR="$VALUES_FILE_PATH/mimir_values.yaml"
+RELEASE_NAME_MIMIR="mon-mimir"
+CHART_REPO_NAME_MIMIR="grafana"
+CHART_REPO_URL_MIMIR="https://grafana.github.io/helm-charts"
+CHART_NAME_MIMIR="mimir-distributed"
+VALUES_FILE_MIMIR="$VALUES_FILE_PATH/mimir_values.yaml"
 
 # -----------------------------------------------------------
 # Grafana Configuration
@@ -105,16 +108,20 @@ kubectl rollout status deployment/"$RELEASE_NAME_PROM-server" -n "$NAMESPACE" ||
 
 
 # 2) Deploy Mimir
-# deploy_chart "$RELEASE_NAME_MIMIR" \
-#              "$CHART_REPO_NAME_MIMIR" \
-#              "$CHART_REPO_URL_MIMIR" \
-#              "$CHART_NAME_MIMIR" \
-#              "$VALUES_FILE_MIMIR" \
-#              "$NAMESPACE"
-
-# Depending on how Mimir runs (StatefulSets, Deployments), you can wait for
-# the correct resource to be ready. For example:
-# kubectl rollout status statefulset/"$RELEASE_NAME_MIMIR-distributor" -n "$NAMESPACE" || true
+if [ "$TFS_DEPLOY_PRODUCTION" == "YES" ]; then
+    echo "Deploying Mimir in production mode."
+    # You can add any production-specific configurations here if needed
+    deploy_chart "$RELEASE_NAME_MIMIR" \
+                "$CHART_REPO_NAME_MIMIR" \
+                "$CHART_REPO_URL_MIMIR" \
+                "$CHART_NAME_MIMIR" \
+                "$VALUES_FILE_MIMIR" \
+                "$NAMESPACE"
+
+    # Depending on how Mimir runs (StatefulSets, Deployments), you can wait for
+    # the correct resource to be ready. For example:
+    kubectl rollout status statefulset/"$RELEASE_NAME_MIMIR-distributor" -n "$NAMESPACE" || true
+fi
 
 
 # 3) Deploy Grafana
diff --git a/manifests/monitoring/grafana_values.yaml b/manifests/monitoring/grafana_values.yaml
index 075760306..630fd7ef9 100644
--- a/manifests/monitoring/grafana_values.yaml
+++ b/manifests/monitoring/grafana_values.yaml
@@ -210,7 +210,7 @@ datasources:
      isDefault: true
    - name: Mimir
      type: prometheus
-     url: http://mimir-nginx.mon-mimir.svc:80/prometheus
+     url: http://mon-mimir-gateway.monitoring.svc.cluster.local/prometheus
      access: proxy
      isDefault: false
 
diff --git a/manifests/monitoring/mimir_values.yaml b/manifests/monitoring/mimir_values.yaml
new file mode 100644
index 000000000..c7fa5bf94
--- /dev/null
+++ b/manifests/monitoring/mimir_values.yaml
@@ -0,0 +1,132 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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.
+# Minimal Mimir for lab/PoC using single-binary and in-cluster MinIO.
+# Chart: grafana/mimir-distributed
+
+global:
+  # -- Definitions to set up nginx resolver
+  dnsService: kube-dns
+  dnsNamespace: kube-system
+  clusterDomain: cluster.local.
+  dnsConfig: {}
+
+# Mimir structured configuration. Wires storage to the in-cluster MinIO.
+mimir:
+  structuredConfig:
+    common:
+      storage:
+        backend: s3
+        s3:
+          endpoint: minio:9000
+          access_key_id: grafana-mimir
+          secret_access_key: supersecret   # change in real clusters
+          insecure: true
+    blocks_storage:
+      s3:
+        bucket_name: mimir-tsdb
+    ruler_storage:
+      s3:
+        bucket_name: mimir-ruler
+    alertmanager_storage:
+      s3:
+        bucket_name: mimir-alertmanager
+
+minio:
+  enabled: true
+  mode: standalone
+  rootUser: grafana-mimir
+  rootPassword: supersecret             # change in real clusters
+  buckets:
+    - name: mimir-tsdb
+      policy: none
+      purge: false
+    - name: mimir-ruler
+      policy: none
+      purge: false
+    - name: mimir-alertmanager
+      policy: none
+      purge: false
+  persistence:
+    enabled: true
+    size: 10Gi
+  resources:
+    requests:
+      cpu: 100m
+      memory: 128Mi
+
+# Disable embedded Kafka. Not needed for this minimal setup.
+kafka:
+  enabled: false
+
+# Keep the NGINX gateway internal to the cluster for simplicity.
+gateway:
+  enabled: true
+  replicas: 1
+  service:
+    type: ClusterIP
+    port: 80
+  nginx:
+    verboseLogging: true
+  resources:
+    requests:
+      cpu: 100m
+      memory: 128Mi
+    limits:
+      cpu: 500m
+      memory: 512Mi
+
+# Turn off sharded components. singleBinary runs the core services already.
+distributor:
+  replicas: 0
+ingester:
+  replicas: 0
+querier:
+  replicas: 0
+query_frontend:
+  replicas: 0
+query_scheduler:
+  replicas: 0
+store_gateway:
+  replicas: 0
+compactor:
+  replicas: 0
+
+# Optional features disabled for minimum footprint.
+ruler:
+  enabled: false
+alertmanager:
+  enabled: false
+overrides_exporter:
+  enabled: false
+
+# Caches off for minimal footprint. Enable later if you need performance.
+memcached:
+  enabled: false
+memcached-queries:
+  enabled: false
+memcached-metadata:
+  enabled: false
+memcached-results:
+  enabled: false
+
+# Meta-monitoring off to keep footprint small. Turn on when you add Prometheus.
+metaMonitoring:
+  dashboards:
+    enabled: false
+  serviceMonitor:
+    enabled: false
+  prometheusRule:
+    enabled: false
+  grafanaAgent:
+    enabled: false
diff --git a/my_deploy.sh b/my_deploy.sh
index 86c1a86f4..fdaab4723 100644
--- a/my_deploy.sh
+++ b/my_deploy.sh
@@ -117,6 +117,8 @@ export TFS_GRAFANA_PASSWORD="admin123+"
 # Disable skip-build flag to rebuild the Docker images.
 export TFS_SKIP_BUILD=""
 
+# Deploy TFS in production environment
+export TFS_DEPLOY_PRODUCTION=""
 
 # ----- CockroachDB ------------------------------------------------------------
 
-- 
GitLab


From d574194b399b8d3b533c231b12464287db47e1a6 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Mon, 3 Nov 2025 19:15:38 +0000
Subject: [PATCH 042/111] Common - Tools - RestConf Server:

- Improve support for Yang Model Discovery
- Improve YANG path normalization to detect namespaces
- Enable Pre-Get data dispatchers
- Renamed old data dispatchers to update
- Update related test tools
---
 .../server/restconf_server/Callbacks.py       | 51 +++++++++++++-----
 .../server/restconf_server/DispatchData.py    | 13 +++--
 .../RestConfServerApplication.py              |  3 ++
 .../server/restconf_server/YangHandler.py     | 19 +++++--
 .../restconf_server/YangModelDiscoverer.py    | 52 +++++++++++++++----
 .../nce_fan_ctrl/Callbacks.py                 |  6 +--
 .../mock_nce_t_ctrl/nce_t_ctrl/Callbacks.py   |  4 +-
 7 files changed, 113 insertions(+), 35 deletions(-)

diff --git a/src/common/tools/rest_conf/server/restconf_server/Callbacks.py b/src/common/tools/rest_conf/server/restconf_server/Callbacks.py
index e3e4d0f45..04a8b8bd9 100644
--- a/src/common/tools/rest_conf/server/restconf_server/Callbacks.py
+++ b/src/common/tools/rest_conf/server/restconf_server/Callbacks.py
@@ -38,7 +38,22 @@ class _Callback:
         '''
         return self._path_pattern.fullmatch(path)
 
-    def execute_data(
+    def execute_data_pre_get(
+        self, match : re.Match, path : str, old_data : Optional[Dict]
+    ) -> bool:
+        '''
+        Execute the callback action for a matched data path.
+        This method should be implemented for each specific callback.
+        @param match: `re.Match` object returned by `match()`.
+        @param path: Original request path that was matched.
+        @param old_data: Resource representation before retrieval, if applicable, otherwise `None`
+        @returns boolean indicating whether additional callbacks should be executed, defaults to False
+        '''
+        MSG = 'match={:s}, path={:s}, old_data={:s}'
+        msg = MSG.format(match.groupdict(), path, old_data)
+        raise NotImplementedError(msg)
+
+    def execute_data_update(
         self, match : re.Match, path : str, old_data : Optional[Dict],
         new_data : Optional[Dict]
     ) -> bool:
@@ -78,14 +93,24 @@ class CallbackDispatcher:
     def register(self, callback : _Callback) -> None:
         self._callbacks.append(callback)
 
-    def dispatch_data(
+    def dispatch_data_pre_get(
+        self, path : str, old_data : Optional[Dict] = None
+    ) -> None:
+        LOGGER.warning('[dispatch_data_pre_get] Checking Callbacks for path={:s}'.format(str(path)))
+        for callback in self._callbacks:
+            match = callback.match(path)
+            if match is None: continue
+            keep_running_callbacks = callback.execute_data_pre_get(match, path, old_data)
+            if not keep_running_callbacks: break
+
+    def dispatch_data_update(
         self, path : str, old_data : Optional[Dict] = None, new_data : Optional[Dict] = None
     ) -> None:
-        LOGGER.warning('[dispatch_data] Checking Callbacks for path={:s}'.format(str(path)))
+        LOGGER.warning('[dispatch_data_update] Checking Callbacks for path={:s}'.format(str(path)))
         for callback in self._callbacks:
             match = callback.match(path)
             if match is None: continue
-            keep_running_callbacks = callback.execute_data(match, path, old_data, new_data)
+            keep_running_callbacks = callback.execute_data_update(match, path, old_data, new_data)
             if not keep_running_callbacks: break
 
     def dispatch_operation(
@@ -113,7 +138,7 @@ class CallbackOnNetwork(_Callback):
         pattern += r'/ietf-network:networks/network=(?P[^/]+)'
         super().__init__(pattern)
 
-    def execute_data(
+    def execute_data_update(
         self, match : re.Match, path : str, old_data : Optional[Dict],
         new_data : Optional[Dict]
     ) -> bool:
@@ -127,7 +152,7 @@ class CallbackOnNode(_Callback):
         pattern += r'/node=(?P[^/]+)'
         super().__init__(pattern)
 
-    def execute_data(
+    def execute_data_update(
         self, match : re.Match, path : str, old_data : Optional[Dict],
         new_data : Optional[Dict]
     ) -> bool:
@@ -141,7 +166,7 @@ class CallbackOnLink(_Callback):
         pattern += r'/ietf-network-topology:link=(?P[^/]+)'
         super().__init__(pattern)
 
-    def execute_data(
+    def execute_data_update(
         self, match : re.Match, path : str, old_data : Optional[Dict],
         new_data : Optional[Dict]
     ) -> bool:
@@ -167,12 +192,12 @@ def main() -> None:
     callbacks.register(CallbackOnLink())
     callbacks.register(CallbackShutdown())
 
-    callbacks.dispatch_data('/restconf/data/ietf-network:networks/network=admin')
-    callbacks.dispatch_data('/restconf/data/ietf-network:networks/network=admin/node=P-PE2')
-    callbacks.dispatch_data('/restconf/data/ietf-network:networks/network=admin/ietf-network-topology:link=L6')
-    callbacks.dispatch_data('/restconf/data/ietf-network:networks/network=admin/')
-    callbacks.dispatch_data('/restconf/data/ietf-network:networks/network=admin/node=P-PE1/')
-    callbacks.dispatch_data('/restconf/data/ietf-network:networks/network=admin/ietf-network-topology:link=L4/')
+    callbacks.dispatch_data_update('/restconf/data/ietf-network:networks/network=admin')
+    callbacks.dispatch_data_update('/restconf/data/ietf-network:networks/network=admin/node=P-PE2')
+    callbacks.dispatch_data_update('/restconf/data/ietf-network:networks/network=admin/ietf-network-topology:link=L6')
+    callbacks.dispatch_data_update('/restconf/data/ietf-network:networks/network=admin/')
+    callbacks.dispatch_data_update('/restconf/data/ietf-network:networks/network=admin/node=P-PE1/')
+    callbacks.dispatch_data_update('/restconf/data/ietf-network:networks/network=admin/ietf-network-topology:link=L4/')
     callbacks.dispatch_operation('/restconf/operations/shutdown/')
 
 if __name__ == '__main__':
diff --git a/src/common/tools/rest_conf/server/restconf_server/DispatchData.py b/src/common/tools/rest_conf/server/restconf_server/DispatchData.py
index 89cb8206e..0dff60d3a 100644
--- a/src/common/tools/rest_conf/server/restconf_server/DispatchData.py
+++ b/src/common/tools/rest_conf/server/restconf_server/DispatchData.py
@@ -31,6 +31,11 @@ class RestConfDispatchData(Resource):
         self._callback_dispatcher = callback_dispatcher
 
     def get(self, subpath : str = '/') -> Response:
+        data = self._yang_handler.get(subpath)
+        self._callback_dispatcher.dispatch_data_pre_get(
+            '/restconf/data/' + subpath, old_data=data
+        )
+
         data = self._yang_handler.get(subpath)
         if data is None:
             abort(
@@ -70,7 +75,7 @@ class RestConfDispatchData(Resource):
 
         LOGGER.info('[POST] {:s} {:s} => {:s}'.format(subpath, str(payload), str(json_data)))
 
-        self._callback_dispatcher.dispatch_data(
+        self._callback_dispatcher.dispatch_data_update(
             '/restconf/data/' + subpath, old_data=None, new_data=json_data
         )
 
@@ -102,7 +107,7 @@ class RestConfDispatchData(Resource):
         diff_data = deepdiff.DeepDiff(old_data, new_data)
         updated = len(diff_data) > 0
 
-        self._callback_dispatcher.dispatch_data(
+        self._callback_dispatcher.dispatch_data_update(
             '/restconf/data/' + subpath, old_data=old_data, new_data=new_data
         )
 
@@ -140,7 +145,7 @@ class RestConfDispatchData(Resource):
         #diff_data = deepdiff.DeepDiff(old_data, new_data)
         #updated = len(diff_data) > 0
 
-        self._callback_dispatcher.dispatch_data(
+        self._callback_dispatcher.dispatch_data_update(
             '/restconf/data/' + subpath, old_data=old_data, new_data=new_data
         )
 
@@ -170,7 +175,7 @@ class RestConfDispatchData(Resource):
                 description='Path({:s}) not found'.format(str(subpath))
             )
 
-        self._callback_dispatcher.dispatch_data(
+        self._callback_dispatcher.dispatch_data_update(
             '/restconf/data/' + subpath, old_data=old_data, new_data=None
         )
 
diff --git a/src/common/tools/rest_conf/server/restconf_server/RestConfServerApplication.py b/src/common/tools/rest_conf/server/restconf_server/RestConfServerApplication.py
index 58384299c..1da9f7069 100644
--- a/src/common/tools/rest_conf/server/restconf_server/RestConfServerApplication.py
+++ b/src/common/tools/rest_conf/server/restconf_server/RestConfServerApplication.py
@@ -63,6 +63,9 @@ class RestConfServerApplication:
         self._app.after_request(log_request)
         self._api = Api(self._app)
 
+    @property
+    def yang_handler(self): return self._yang_handler
+
     @property
     def callback_dispatcher(self): return self._callback_dispatcher
 
diff --git a/src/common/tools/rest_conf/server/restconf_server/YangHandler.py b/src/common/tools/rest_conf/server/restconf_server/YangHandler.py
index 9df57528f..22e5b63d7 100644
--- a/src/common/tools/rest_conf/server/restconf_server/YangHandler.py
+++ b/src/common/tools/rest_conf/server/restconf_server/YangHandler.py
@@ -54,6 +54,12 @@ class YangHandler:
             json.dumps(yang_startup_data), fmt='json'
         )
 
+    @property
+    def yang_context(self): return self._yang_context
+
+    @property
+    def yang_datastore(self): return self._datastore
+
     def destroy(self) -> None:
         self._yang_context.destroy()
 
@@ -165,13 +171,20 @@ class YangHandler:
                 name, val = part.split('=', 1)
                 # keep original name (may include prefix) for output, but
                 # use local name (without module prefix) to lookup schema
-                local_name = name.split(':', 1)[1] if ':' in name else name
+                local_name = name #.split(':', 1)[1] if ':' in name else name
                 schema_path = schema_path + '/' + local_name if schema_path else '/' + local_name
                 schema_nodes = list(self._yang_context.find_path(schema_path))
                 if len(schema_nodes) != 1:
                     MSG = 'No/Multiple SchemaNodes({:s}) for SchemaPath({:s})'
                     raise Exception(MSG.format(
-                        str([repr(sn) for sn in schema_nodes]), schema_path
+                        #str([repr(sn) for sn in schema_nodes]), schema_path
+                        str([
+                            '{:s}({:s}) => {:s}'.format(
+                                repr(sn),
+                                str(sn.schema_path()),
+                                str([repr(snn) for snn in sn.iter_tree()])
+                            )
+                            for sn in schema_nodes]), schema_path
                     ))
                 schema_node = schema_nodes[0]
 
@@ -219,7 +232,7 @@ class YangHandler:
 
                 out_parts.append(name + ''.join(preds))
             else:
-                local_part = part.split(':', 1)[1] if ':' in part else part
+                local_part = part #.split(':', 1)[1] if ':' in part else part
                 schema_path = schema_path + '/' + local_part if schema_path else '/' + local_part
                 out_parts.append(part)
 
diff --git a/src/common/tools/rest_conf/server/restconf_server/YangModelDiscoverer.py b/src/common/tools/rest_conf/server/restconf_server/YangModelDiscoverer.py
index f31305280..ff9ddee50 100644
--- a/src/common/tools/rest_conf/server/restconf_server/YangModelDiscoverer.py
+++ b/src/common/tools/rest_conf/server/restconf_server/YangModelDiscoverer.py
@@ -32,8 +32,14 @@ IMPORT_BLOCK_RE = re.compile(r"\bimport\s+([A-Za-z0-9_.-]+)\s*\{", re.IGNORECASE
 # import foo;  (very rare, but we’ll support it)
 IMPORT_SEMI_RE  = re.compile(r"\bimport\s+([A-Za-z0-9_.-]+)\s*;", re.IGNORECASE)
 
+# include foo { ... }  (most common form)
+INCLUDE_BLOCK_RE = re.compile(r"\binclude\s+([A-Za-z0-9_.-]+)\s*\{", re.IGNORECASE)
 
-def _parse_yang_file(path: Path) -> Tuple[Optional[str], Set[str]]:
+# include foo;  (very rare, but we’ll support it)
+INCLUDE_SEMI_RE  = re.compile(r"\binclude\s+([A-Za-z0-9_.-]+)\s*;", re.IGNORECASE)
+
+
+def _parse_yang_file(path: Path) -> Tuple[Optional[str], Set[str], Set[str]]:
     path_stem = path.stem # file name without extension
     expected_module_name = path_stem.split('@', 1)[0]
 
@@ -54,14 +60,20 @@ def _parse_yang_file(path: Path) -> Tuple[Optional[str], Set[str]]:
         raise Exception(MSG.format(str(module_name), str(expected_module_name)))
 
     module_imports = set()
+    module_includes = set()
     if module_name is not None:
         module_imports.update(IMPORT_BLOCK_RE.findall(data))
         module_imports.update(IMPORT_SEMI_RE.findall(data))
+        module_includes.update(INCLUDE_BLOCK_RE.findall(data))
+        module_includes.update(INCLUDE_SEMI_RE.findall(data))
 
     # ignore modules importing themselves, just in case
     module_imports.discard(module_name)
 
-    return module_name, module_imports
+    # ignore modules including themselves, just in case
+    module_includes.discard(module_name)
+
+    return module_name, module_imports, module_includes
 
 
 class YangModuleDiscoverer:
@@ -70,9 +82,9 @@ class YangModuleDiscoverer:
 
         self._module_to_paths : Dict[str, List[Path]] = defaultdict(list)
         self._module_to_imports : Dict[str, Set[str]] = defaultdict(set)
+        self._module_to_includes : Dict[str, Set[str]] = defaultdict(set)
         self._ordered_module_names : Optional[List[str]] = None
 
-
     def run(
         self, do_print_order : bool = False, do_log_order : bool = False,
         logger : Optional[logging.Logger] = None, level : int = logging.INFO
@@ -97,10 +109,30 @@ class YangModuleDiscoverer:
             raise Exception(MSG.format(str(self._yang_search_path)))
 
         for yang_path in yang_root.rglob('*.yang'):
-            module_name, module_imports = _parse_yang_file(yang_path)
+            module_name, module_imports, module_includes = _parse_yang_file(yang_path)
             if module_name is None: continue
-            self._module_to_paths[module_name].append(yang_path)
-            self._module_to_imports[module_name] = module_imports
+            self._module_to_paths.setdefault(module_name, list()).append(yang_path)
+            self._module_to_imports.setdefault(module_name, set()).update(module_imports)
+            self._module_to_includes.setdefault(module_name, set()).update(module_includes)
+
+        # Propagate modules imported by included modules to modules including them:
+        #   openconfig-platform includes openconfig-platform-common
+        #   openconfig-platform-common imports (
+        #       openconfig-platform-types, openconfig-extensions, openconfig-types
+        #   )
+        #   => propagate (
+        #       openconfig-platform-types, openconfig-extensions, openconfig-types
+        #   ) as imports of openconfig-platform
+        #   => remove openconfig-platform-common from list of modules_to_imports as
+        #      cannot be imported by itself
+        included_modules : Set[str] = set()
+        for module_name, module_includes in self._module_to_includes.items():
+            for inc_mdl_name in module_includes:
+                included_module_imports = self._module_to_imports.get(inc_mdl_name, set())
+                self._module_to_imports.setdefault(module_name, set()).update(included_module_imports)
+            included_modules.update(module_includes)
+        for included_module in included_modules:
+            self._module_to_imports.pop(included_module)
 
         if len(self._module_to_paths) == 0:
             MSG = 'No modules found in Path({:s})'
@@ -128,8 +160,8 @@ class YangModuleDiscoverer:
     def _check_missing_modules(self) -> None:
         local_module_names = set(self._module_to_imports.keys())
         missing_modules : List[str] = list()
-        for module_name, imported_modules in self._module_to_imports.items():
-            missing = imported_modules.difference(local_module_names)
+        for module_name, module_imports in self._module_to_imports.items():
+            missing = module_imports.difference(local_module_names)
             if len(missing) == 0: continue
             missing_modules.append(
                 '  {:s} => {:s}'.format(module_name, str(missing))
@@ -143,8 +175,8 @@ class YangModuleDiscoverer:
 
     def _sort_modules(self) -> None:
         ts = TopologicalSorter()
-        for module_name, imported_modules in self._module_to_imports.items():
-            ts.add(module_name, *imported_modules)
+        for module_name, module_imports in self._module_to_imports.items():
+            ts.add(module_name, *module_imports)
 
         try:
             self._ordered_module_names = list(ts.static_order())   # raises CycleError on cycles
diff --git a/src/tests/tools/mock_nce_fan_ctrl/nce_fan_ctrl/Callbacks.py b/src/tests/tools/mock_nce_fan_ctrl/nce_fan_ctrl/Callbacks.py
index 1c6996581..622e03fbf 100644
--- a/src/tests/tools/mock_nce_fan_ctrl/nce_fan_ctrl/Callbacks.py
+++ b/src/tests/tools/mock_nce_fan_ctrl/nce_fan_ctrl/Callbacks.py
@@ -28,7 +28,7 @@ class CallbackQosProfile(_Callback):
         pattern += r'/qos-profile=(?P[^/]+)'
         super().__init__(pattern)
 
-    def execute_data(
+    def execute_data_update(
         self, match : re.Match, path : str, old_data : Optional[Dict],
         new_data : Optional[Dict]
     ) -> bool:
@@ -44,7 +44,7 @@ class CallbackApplication(_Callback):
         pattern += r'/application=(?P[^/]+)'
         super().__init__(pattern)
 
-    def execute_data(
+    def execute_data_update(
         self, match : re.Match, path : str, old_data : Optional[Dict],
         new_data : Optional[Dict]
     ) -> bool:
@@ -60,7 +60,7 @@ class CallbackAppFlow(_Callback):
         pattern += r'/app-flow=(?P[^/]+)'
         super().__init__(pattern)
 
-    def execute_data(
+    def execute_data_update(
         self, match : re.Match, path : str, old_data : Optional[Dict],
         new_data : Optional[Dict]
     ) -> bool:
diff --git a/src/tests/tools/mock_nce_t_ctrl/nce_t_ctrl/Callbacks.py b/src/tests/tools/mock_nce_t_ctrl/nce_t_ctrl/Callbacks.py
index ea2e7f748..d2c2b5c2f 100644
--- a/src/tests/tools/mock_nce_t_ctrl/nce_t_ctrl/Callbacks.py
+++ b/src/tests/tools/mock_nce_t_ctrl/nce_t_ctrl/Callbacks.py
@@ -28,7 +28,7 @@ class CallbackOsuTunnel(_Callback):
         pattern += r'/tunnel=(?P[^/]+)'
         super().__init__(pattern)
 
-    def execute_data(
+    def execute_data_update(
         self, match : re.Match, path : str, old_data : Optional[Dict],
         new_data : Optional[Dict]
     ) -> bool:
@@ -44,7 +44,7 @@ class CallbackEthTService(_Callback):
         pattern += r'/etht-svc-instances=(?P[^/]+)'
         super().__init__(pattern)
 
-    def execute_data(
+    def execute_data_update(
         self, match : re.Match, path : str, old_data : Optional[Dict],
         new_data : Optional[Dict]
     ) -> bool:
-- 
GitLab


From 35a3f12a6579259c1e82659185e93480827fad3e Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Mon, 3 Nov 2025 19:21:09 +0000
Subject: [PATCH 043/111] Tests - Tools - Firewall Agent:

- Implement new Firewall Agent
- Expose RESTCONF/OpenConfig NBI
- Use NFTables backend
- Test scenarios
---
 src/tests/tools/firewall_agent/Dockerfile     |   30 +
 src/tests/tools/firewall_agent/README.md      |    6 +
 .../firewall_agent/docker-compose-down.sh     |   20 +
 .../tools/firewall_agent/docker-compose-up.sh |   27 +
 .../tools/firewall_agent/docker-compose.yml   |   37 +
 .../firewall_agent/docs/Docs-and-Commands.md  |  980 +++++++++
 .../docs/yang/generate-trees.sh               |   54 +
 .../docs/yang/ietf/iana-if-type.yang          | 1619 ++++++++++++++
 .../docs/yang/ietf/ietf-interfaces.yang       | 1123 ++++++++++
 .../docs/yang/ietf/ietf-yang-types.yang       |  474 +++++
 .../docs/yang/openconfig-acl.tree             |  337 +++
 .../docs/yang/openconfig-components.tree      |  188 ++
 .../docs/yang/openconfig-interfaces.tree      |  716 +++++++
 .../yang/openconfig/acl/openconfig-acl.yang   |  935 ++++++++
 .../acl/openconfig-icmpv4-types.yang          |  540 +++++
 .../acl/openconfig-icmpv6-types.yang          | 1010 +++++++++
 .../acl/openconfig-packet-match-types.yang    |  374 ++++
 .../acl/openconfig-packet-match.yang          |  727 +++++++
 .../defined-sets/openconfig-defined-sets.yang |  227 ++
 .../interfaces/openconfig-if-aggregate.yang   |  249 +++
 .../interfaces/openconfig-if-ethernet.yang    |  693 ++++++
 .../interfaces/openconfig-if-ip.yang          | 1611 ++++++++++++++
 .../interfaces/openconfig-interfaces.yang     | 1336 ++++++++++++
 .../mpls/openconfig-mpls-types.yang           |  548 +++++
 .../openconfig/openconfig-extensions.yang     |  206 ++
 .../openconfig-transport-types.yang           | 1883 +++++++++++++++++
 .../platform/openconfig-platform-common.yang  |  246 +++
 .../platform/openconfig-platform-port.yang    |  327 +++
 .../platform/openconfig-platform-types.yang   |  541 +++++
 .../platform/openconfig-platform.yang         | 1221 +++++++++++
 .../system/openconfig-alarm-types.yang        |  150 ++
 .../types/openconfig-inet-types.yang          |  485 +++++
 .../openconfig/types/openconfig-types.yang    |  485 +++++
 .../types/openconfig-yang-types.yang          |  230 ++
 .../vlan/openconfig-vlan-types.yang           |  283 +++
 .../yang/openconfig/vlan/openconfig-vlan.yang | 1001 +++++++++
 .../docs/yang/yang-repo-url.txt               |    1 +
 .../firewall_agent/firewall_agent/__init__.py |   14 +
 .../firewall_agent/firewall_agent/app.py      |   39 +
 .../firewall_agent/resources/ACLs.py          |  226 ++
 .../firewall_agent/resources/Components.py    |   40 +
 .../firewall_agent/resources/HostMeta.py      |   25 +
 .../firewall_agent/resources/Interfaces.py    |   88 +
 .../firewall_agent/resources/Root.py          |   25 +
 .../firewall_agent/resources/__init__.py      |   14 +
 .../resources/nft_model/ActionEnum.py         |   24 +
 .../resources/nft_model/Chain.py              |   94 +
 .../resources/nft_model/DirectionEnum.py      |   23 +
 .../resources/nft_model/Exceptions.py         |   89 +
 .../resources/nft_model/FamilyEnum.py         |   27 +
 .../resources/nft_model/NFTables.py           |  153 ++
 .../resources/nft_model/NFTablesCommand.py    |   79 +
 .../nft_model/NFTablesParserTools.py          |   77 +
 .../resources/nft_model/ProtocolEnum.py       |   24 +
 .../resources/nft_model/Rule.py               |  201 ++
 .../resources/nft_model/Table.py              |   86 +
 .../resources/nft_model/TableEnum.py          |   24 +
 .../resources/nft_model/__init__.py           |   14 +
 .../resources/nft_model/__main__.py           |   31 +
 src/tests/tools/firewall_agent/redeploy.sh    |   25 +
 .../tools/firewall_agent/requirements.txt     |   21 +
 .../scripts/data/oc_acl_block_8001.json       |   27 +
 .../scripts/data/oc_acl_block_8002.json       |   27 +
 .../scripts/data/oc_acl_multi_rule.json       |   39 +
 .../firewall_agent/scripts/run_nft_model.sh   |   18 +
 .../firewall_agent/scripts/test_commands.sh   |   32 +
 66 files changed, 22526 insertions(+)
 create mode 100644 src/tests/tools/firewall_agent/Dockerfile
 create mode 100644 src/tests/tools/firewall_agent/README.md
 create mode 100755 src/tests/tools/firewall_agent/docker-compose-down.sh
 create mode 100755 src/tests/tools/firewall_agent/docker-compose-up.sh
 create mode 100644 src/tests/tools/firewall_agent/docker-compose.yml
 create mode 100644 src/tests/tools/firewall_agent/docs/Docs-and-Commands.md
 create mode 100755 src/tests/tools/firewall_agent/docs/yang/generate-trees.sh
 create mode 100644 src/tests/tools/firewall_agent/docs/yang/ietf/iana-if-type.yang
 create mode 100644 src/tests/tools/firewall_agent/docs/yang/ietf/ietf-interfaces.yang
 create mode 100644 src/tests/tools/firewall_agent/docs/yang/ietf/ietf-yang-types.yang
 create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig-acl.tree
 create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig-components.tree
 create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig-interfaces.tree
 create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-acl.yang
 create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-icmpv4-types.yang
 create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-icmpv6-types.yang
 create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-packet-match-types.yang
 create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-packet-match.yang
 create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/defined-sets/openconfig-defined-sets.yang
 create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/interfaces/openconfig-if-aggregate.yang
 create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/interfaces/openconfig-if-ethernet.yang
 create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/interfaces/openconfig-if-ip.yang
 create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/interfaces/openconfig-interfaces.yang
 create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/mpls/openconfig-mpls-types.yang
 create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/openconfig-extensions.yang
 create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/openconfig-transport/openconfig-transport-types.yang
 create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/platform/openconfig-platform-common.yang
 create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/platform/openconfig-platform-port.yang
 create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/platform/openconfig-platform-types.yang
 create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/platform/openconfig-platform.yang
 create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/system/openconfig-alarm-types.yang
 create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/types/openconfig-inet-types.yang
 create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/types/openconfig-types.yang
 create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/types/openconfig-yang-types.yang
 create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/vlan/openconfig-vlan-types.yang
 create mode 100644 src/tests/tools/firewall_agent/docs/yang/openconfig/vlan/openconfig-vlan.yang
 create mode 100644 src/tests/tools/firewall_agent/docs/yang/yang-repo-url.txt
 create mode 100644 src/tests/tools/firewall_agent/firewall_agent/__init__.py
 create mode 100644 src/tests/tools/firewall_agent/firewall_agent/app.py
 create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/ACLs.py
 create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/Components.py
 create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/HostMeta.py
 create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/Interfaces.py
 create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/Root.py
 create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/__init__.py
 create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/ActionEnum.py
 create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py
 create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/DirectionEnum.py
 create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Exceptions.py
 create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/FamilyEnum.py
 create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTables.py
 create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesCommand.py
 create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesParserTools.py
 create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/ProtocolEnum.py
 create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py
 create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py
 create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/TableEnum.py
 create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/__init__.py
 create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/__main__.py
 create mode 100755 src/tests/tools/firewall_agent/redeploy.sh
 create mode 100644 src/tests/tools/firewall_agent/requirements.txt
 create mode 100644 src/tests/tools/firewall_agent/scripts/data/oc_acl_block_8001.json
 create mode 100644 src/tests/tools/firewall_agent/scripts/data/oc_acl_block_8002.json
 create mode 100644 src/tests/tools/firewall_agent/scripts/data/oc_acl_multi_rule.json
 create mode 100755 src/tests/tools/firewall_agent/scripts/run_nft_model.sh
 create mode 100755 src/tests/tools/firewall_agent/scripts/test_commands.sh

diff --git a/src/tests/tools/firewall_agent/Dockerfile b/src/tests/tools/firewall_agent/Dockerfile
new file mode 100644
index 000000000..dec746c5c
--- /dev/null
+++ b/src/tests/tools/firewall_agent/Dockerfile
@@ -0,0 +1,30 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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.11-slim
+
+ENV PYTHONUNBUFFERED=0
+
+RUN apt-get update -y
+RUN apt-get install -y --no-install-recommends libxtables-dev iptables gcc libc6-dev python3-nftables
+RUN apt-get clean -y && rm -rf /var/lib/apt/lists/*
+
+WORKDIR /app
+COPY requirements.txt ./
+RUN pip install --no-cache-dir -r requirements.txt
+COPY firewall_agent ./firewall_agent
+
+EXPOSE 8888
+CMD ["python", "-m", "firewall_agent.app"]
diff --git a/src/tests/tools/firewall_agent/README.md b/src/tests/tools/firewall_agent/README.md
new file mode 100644
index 000000000..2f07034de
--- /dev/null
+++ b/src/tests/tools/firewall_agent/README.md
@@ -0,0 +1,6 @@
+# Firewall Agent
+
+This repository contains a simple RESTCONF/OpenConfig firewall agent and a test deployment that demonstrates ACL behavior using two minimal HTTP servers.
+
+__NOTE: TO BE COMPLETED__
+
diff --git a/src/tests/tools/firewall_agent/docker-compose-down.sh b/src/tests/tools/firewall_agent/docker-compose-down.sh
new file mode 100755
index 000000000..edae64d04
--- /dev/null
+++ b/src/tests/tools/firewall_agent/docker-compose-down.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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.
+
+
+set -euo pipefail
+
+echo "Tearing down demo stack..."
+docker compose -f docker-compose.yml down -v --remove-orphans
diff --git a/src/tests/tools/firewall_agent/docker-compose-up.sh b/src/tests/tools/firewall_agent/docker-compose-up.sh
new file mode 100755
index 000000000..43687694b
--- /dev/null
+++ b/src/tests/tools/firewall_agent/docker-compose-up.sh
@@ -0,0 +1,27 @@
+#!/bin/bash
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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.
+
+
+set -euo pipefail
+
+echo "Starting demo stack with docker compose..."
+docker compose -f docker-compose.yml up -d --build
+
+echo "Waiting a few seconds for services to become healthy..."
+sleep 3
+
+echo "You can now run: python3 install_acls.py --ports 8001,8002"
+echo "Services started. HTTP servers: http://localhost:8001 and http://localhost:8002."
+echo "Firewall agent RESTCONF: http://localhost:8888/restconf/data"
diff --git a/src/tests/tools/firewall_agent/docker-compose.yml b/src/tests/tools/firewall_agent/docker-compose.yml
new file mode 100644
index 000000000..596ae4d51
--- /dev/null
+++ b/src/tests/tools/firewall_agent/docker-compose.yml
@@ -0,0 +1,37 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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.
+
+
+services:
+  firewall_agent:
+    build:
+      context: .
+      dockerfile: Dockerfile
+    container_name: firewall-agent
+    network_mode: host
+    cap_add:
+      - NET_ADMIN
+      - NET_RAW
+
+  public_server:
+    image: python:3.11-slim
+    container_name: public-server
+    network_mode: host
+    command: ["python", "-u", "-m", "http.server", "8001"]
+
+  corporate_server:
+    image: python:3.11-slim
+    container_name: corporate-server
+    network_mode: host
+    command: ["python", "-u", "-m", "http.server", "8002"]
diff --git a/src/tests/tools/firewall_agent/docs/Docs-and-Commands.md b/src/tests/tools/firewall_agent/docs/Docs-and-Commands.md
new file mode 100644
index 000000000..7dd08a844
--- /dev/null
+++ b/src/tests/tools/firewall_agent/docs/Docs-and-Commands.md
@@ -0,0 +1,980 @@
+# Docs and Commands
+
+- Ref: https://ral-arturo.org/2020/11/22/python-nftables-tutorial.html
+- Ref: https://www.netfilter.org/projects/nftables/manpage.html
+- Ref: https://wiki.nftables.org/wiki-nftables/index.php/Quick_reference-nftables_in_10_minutes
+
+- Note: table and chain can have comment as well.
+
+## Example Commands:
+
+```bash
+sudo nft add table ip filter
+sudo nft add chain ip filter input  {type filter hook input priority filter ; policy accept; }
+sudo nft add chain ip filter output {type filter hook output priority filter; policy accept; }
+
+# Example options
+#sudo nft add rule ip filter input
+#    iifname lo
+#    oifname lo
+#    ip saddr 0.0.0.0/0
+#    ip daddr 192.168.0.10/32
+#    tcp sport 12345
+#    tcp dport 80
+#    accept/drop/reject
+#    comment "my-rule-name"
+
+sudo nft add rule ip filter input iifname enp0s3 ip saddr 0.0.0.0/0 ip daddr 192.168.0.10/32 tcp sport 12345 tcp dport 80 accept comment "my-rule-in-test"
+sudo nft add rule ip filter output oifname enp0s3 ip daddr 0.0.0.0/0 ip saddr 192.168.0.10/32 tcp dport 80 tcp sport 12345 drop comment "my-rule-out-test"
+```
+
+
+## Running code:
+
+```python
+import json
+import nftables
+
+nft = nftables.Nftables()
+nft.set_json_output(True)
+rc, output, error = nft.cmd("list ruleset")
+print(json.loads(output))
+```
+
+Retrieves in `output`:
+
+```json
+{
+    "nftables": [
+        {
+            "metainfo": {
+                "version": "1.1.3",
+                "release_name": "Commodore Bullmoose #4",
+                "json_schema_version": 1
+            }
+        },
+        {
+            "table": {
+                "family": "ip",
+                "name": "nat",
+                "handle": 1
+            }
+        },
+        {
+            "chain": {
+                "family": "ip",
+                "table": "nat",
+                "name": "DOCKER",
+                "handle": 1
+            }
+        },
+        {
+            "chain": {
+                "family": "ip",
+                "table": "nat",
+                "name": "PREROUTING",
+                "handle": 6,
+                "type": "nat",
+                "hook": "prerouting",
+                "prio": -100,
+                "policy": "accept"
+            }
+        },
+        {
+            "chain": {
+                "family": "ip",
+                "table": "nat",
+                "name": "OUTPUT",
+                "handle": 8,
+                "type": "nat",
+                "hook": "output",
+                "prio": -100,
+                "policy": "accept"
+            }
+        },
+        {
+            "chain": {
+                "family": "ip",
+                "table": "nat",
+                "name": "POSTROUTING",
+                "handle": 10,
+                "type": "nat",
+                "hook": "postrouting",
+                "prio": 100,
+                "policy": "accept"
+            }
+        },
+        {
+            "rule": {
+                "family": "ip",
+                "table": "nat",
+                "chain": "DOCKER",
+                "handle": 14,
+                "expr": [
+                    {
+                        "match": {
+                            "op": "==",
+                            "left": {
+                                "meta": {
+                                    "key": "iifname"
+                                }
+                            },
+                            "right": "docker0"
+                        }
+                    },
+                    {
+                        "counter": {
+                            "packets": 0,
+                            "bytes": 0
+                        }
+                    },
+                    {
+                        "return": null
+                    }
+                ]
+            }
+        },
+        {
+            "rule": {
+                "family": "ip",
+                "table": "nat",
+                "chain": "PREROUTING",
+                "handle": 7,
+                "expr": [
+                    {
+                        "xt": {
+                            "type": "match",
+                            "name": "addrtype"
+                        }
+                    },
+                    {
+                        "counter": {
+                            "packets": 2,
+                            "bytes": 88
+                        }
+                    },
+                    {
+                        "jump": {
+                            "target": "DOCKER"
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "rule": {
+                "family": "ip",
+                "table": "nat",
+                "chain": "OUTPUT",
+                "handle": 9,
+                "expr": [
+                    {
+                        "match": {
+                            "op": "!=",
+                            "left": {
+                                "payload": {
+                                    "protocol": "ip",
+                                    "field": "daddr"
+                                }
+                            },
+                            "right": {
+                                "prefix": {
+                                    "addr": "127.0.0.0",
+                                    "len": 8
+                                }
+                            }
+                        }
+                    },
+                    {
+                        "xt": {
+                            "type": "match",
+                            "name": "addrtype"
+                        }
+                    },
+                    {
+                        "counter": {
+                            "packets": 12,
+                            "bytes": 720
+                        }
+                    },
+                    {
+                        "jump": {
+                            "target": "DOCKER"
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "rule": {
+                "family": "ip",
+                "table": "nat",
+                "chain": "POSTROUTING",
+                "handle": 13,
+                "expr": [
+                    {
+                        "match": {
+                            "op": "!=",
+                            "left": {
+                                "meta": {
+                                    "key": "oifname"
+                                }
+                            },
+                            "right": "docker0"
+                        }
+                    },
+                    {
+                        "match": {
+                            "op": "==",
+                            "left": {
+                                "payload": {
+                                    "protocol": "ip",
+                                    "field": "saddr"
+                                }
+                            },
+                            "right": {
+                                "prefix": {
+                                    "addr": "172.17.0.0",
+                                    "len": 16
+                                }
+                            }
+                        }
+                    },
+                    {
+                        "counter": {
+                            "packets": 74,
+                            "bytes": 4651
+                        }
+                    },
+                    {
+                        "xt": {
+                            "type": "target",
+                            "name": "MASQUERADE"
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "table": {
+                "family": "ip",
+                "name": "filter",
+                "handle": 2
+            }
+        },
+        {
+            "chain": {
+                "family": "ip",
+                "table": "filter",
+                "name": "DOCKER",
+                "handle": 1
+            }
+        },
+        {
+            "chain": {
+                "family": "ip",
+                "table": "filter",
+                "name": "DOCKER-FORWARD",
+                "handle": 2
+            }
+        },
+        {
+            "chain": {
+                "family": "ip",
+                "table": "filter",
+                "name": "DOCKER-BRIDGE",
+                "handle": 3
+            }
+        },
+        {
+            "chain": {
+                "family": "ip",
+                "table": "filter",
+                "name": "DOCKER-CT",
+                "handle": 4
+            }
+        },
+        {
+            "chain": {
+                "family": "ip",
+                "table": "filter",
+                "name": "DOCKER-ISOLATION-STAGE-1",
+                "handle": 5
+            }
+        },
+        {
+            "chain": {
+                "family": "ip",
+                "table": "filter",
+                "name": "DOCKER-ISOLATION-STAGE-2",
+                "handle": 6
+            }
+        },
+        {
+            "chain": {
+                "family": "ip",
+                "table": "filter",
+                "name": "FORWARD",
+                "handle": 7,
+                "type": "filter",
+                "hook": "forward",
+                "prio": 0,
+                "policy": "accept"
+            }
+        },
+        {
+            "chain": {
+                "family": "ip",
+                "table": "filter",
+                "name": "DOCKER-USER",
+                "handle": 18
+            }
+        },
+        {
+            "chain": {
+                "family": "ip",
+                "table": "filter",
+                "name": "INPUT",
+                "handle": 26,
+                "type": "filter",
+                "hook": "input",
+                "prio": 0,
+                "policy": "accept"
+            }
+        },
+        {
+            "rule": {
+                "family": "ip",
+                "table": "filter",
+                "chain": "DOCKER",
+                "handle": 21,
+                "expr": [
+                    {
+                        "match": {
+                            "op": "!=",
+                            "left": {
+                                "meta": {
+                                    "key": "iifname"
+                                }
+                            },
+                            "right": "docker0"
+                        }
+                    },
+                    {
+                        "match": {
+                            "op": "==",
+                            "left": {
+                                "meta": {
+                                    "key": "oifname"
+                                }
+                            },
+                            "right": "docker0"
+                        }
+                    },
+                    {
+                        "counter": {
+                            "packets": 0,
+                            "bytes": 0
+                        }
+                    },
+                    {
+                        "drop": null
+                    }
+                ]
+            }
+        },
+        {
+            "rule": {
+                "family": "ip",
+                "table": "filter",
+                "chain": "DOCKER-FORWARD",
+                "handle": 11,
+                "expr": [
+                    {
+                        "counter": {
+                            "packets": 188597,
+                            "bytes": 246896440
+                        }
+                    },
+                    {
+                        "jump": {
+                            "target": "DOCKER-CT"
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "rule": {
+                "family": "ip",
+                "table": "filter",
+                "chain": "DOCKER-FORWARD",
+                "handle": 10,
+                "expr": [
+                    {
+                        "counter": {
+                            "packets": 68171,
+                            "bytes": 3005971
+                        }
+                    },
+                    {
+                        "jump": {
+                            "target": "DOCKER-ISOLATION-STAGE-1"
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "rule": {
+                "family": "ip",
+                "table": "filter",
+                "chain": "DOCKER-FORWARD",
+                "handle": 9,
+                "expr": [
+                    {
+                        "counter": {
+                            "packets": 68171,
+                            "bytes": 3005971
+                        }
+                    },
+                    {
+                        "jump": {
+                            "target": "DOCKER-BRIDGE"
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "rule": {
+                "family": "ip",
+                "table": "filter",
+                "chain": "DOCKER-FORWARD",
+                "handle": 20,
+                "expr": [
+                    {
+                        "match": {
+                            "op": "==",
+                            "left": {
+                                "meta": {
+                                    "key": "iifname"
+                                }
+                            },
+                            "right": "docker0"
+                        }
+                    },
+                    {
+                        "counter": {
+                            "packets": 68171,
+                            "bytes": 3005971
+                        }
+                    },
+                    {
+                        "accept": null
+                    }
+                ]
+            }
+        },
+        {
+            "rule": {
+                "family": "ip",
+                "table": "filter",
+                "chain": "DOCKER-BRIDGE",
+                "handle": 23,
+                "expr": [
+                    {
+                        "match": {
+                            "op": "==",
+                            "left": {
+                                "meta": {
+                                    "key": "oifname"
+                                }
+                            },
+                            "right": "docker0"
+                        }
+                    },
+                    {
+                        "counter": {
+                            "packets": 0,
+                            "bytes": 0
+                        }
+                    },
+                    {
+                        "jump": {
+                            "target": "DOCKER"
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "rule": {
+                "family": "ip",
+                "table": "filter",
+                "chain": "DOCKER-CT",
+                "handle": 22,
+                "expr": [
+                    {
+                        "match": {
+                            "op": "==",
+                            "left": {
+                                "meta": {
+                                    "key": "oifname"
+                                }
+                            },
+                            "right": "docker0"
+                        }
+                    },
+                    {
+                        "xt": {
+                            "type": "match",
+                            "name": "conntrack"
+                        }
+                    },
+                    {
+                        "counter": {
+                            "packets": 120426,
+                            "bytes": 243890469
+                        }
+                    },
+                    {
+                        "accept": null
+                    }
+                ]
+            }
+        },
+        {
+            "rule": {
+                "family": "ip",
+                "table": "filter",
+                "chain": "DOCKER-ISOLATION-STAGE-1",
+                "handle": 24,
+                "expr": [
+                    {
+                        "match": {
+                            "op": "==",
+                            "left": {
+                                "meta": {
+                                    "key": "iifname"
+                                }
+                            },
+                            "right": "docker0"
+                        }
+                    },
+                    {
+                        "match": {
+                            "op": "!=",
+                            "left": {
+                                "meta": {
+                                    "key": "oifname"
+                                }
+                            },
+                            "right": "docker0"
+                        }
+                    },
+                    {
+                        "counter": {
+                            "packets": 68171,
+                            "bytes": 3005971
+                        }
+                    },
+                    {
+                        "jump": {
+                            "target": "DOCKER-ISOLATION-STAGE-2"
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "rule": {
+                "family": "ip",
+                "table": "filter",
+                "chain": "DOCKER-ISOLATION-STAGE-2",
+                "handle": 25,
+                "expr": [
+                    {
+                        "match": {
+                            "op": "==",
+                            "left": {
+                                "meta": {
+                                    "key": "oifname"
+                                }
+                            },
+                            "right": "docker0"
+                        }
+                    },
+                    {
+                        "counter": {
+                            "packets": 0,
+                            "bytes": 0
+                        }
+                    },
+                    {
+                        "drop": null
+                    }
+                ]
+            }
+        },
+        {
+            "rule": {
+                "family": "ip",
+                "table": "filter",
+                "chain": "FORWARD",
+                "handle": 19,
+                "expr": [
+                    {
+                        "counter": {
+                            "packets": 188597,
+                            "bytes": 246896440
+                        }
+                    },
+                    {
+                        "jump": {
+                            "target": "DOCKER-USER"
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "rule": {
+                "family": "ip",
+                "table": "filter",
+                "chain": "FORWARD",
+                "handle": 8,
+                "expr": [
+                    {
+                        "counter": {
+                            "packets": 188597,
+                            "bytes": 246896440
+                        }
+                    },
+                    {
+                        "jump": {
+                            "target": "DOCKER-FORWARD"
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "rule": {
+                "family": "ip",
+                "table": "filter",
+                "chain": "INPUT",
+                "handle": 27,
+                "expr": [
+                    {
+                        "match": {
+                            "op": "==",
+                            "left": {
+                                "payload": {
+                                    "protocol": "ip",
+                                    "field": "saddr"
+                                }
+                            },
+                            "right": "9.9.9.9"
+                        }
+                    },
+                    {
+                        "counter": {
+                            "packets": 0,
+                            "bytes": 0
+                        }
+                    },
+                    {
+                        "drop": null
+                    }
+                ]
+            }
+        },
+        {
+            "table": {
+                "family": "ip6",
+                "name": "nat",
+                "handle": 3
+            }
+        },
+        {
+            "chain": {
+                "family": "ip6",
+                "table": "nat",
+                "name": "DOCKER",
+                "handle": 1
+            }
+        },
+        {
+            "chain": {
+                "family": "ip6",
+                "table": "nat",
+                "name": "PREROUTING",
+                "handle": 2,
+                "type": "nat",
+                "hook": "prerouting",
+                "prio": -100,
+                "policy": "accept"
+            }
+        },
+        {
+            "chain": {
+                "family": "ip6",
+                "table": "nat",
+                "name": "OUTPUT",
+                "handle": 4,
+                "type": "nat",
+                "hook": "output",
+                "prio": -100,
+                "policy": "accept"
+            }
+        },
+        {
+            "rule": {
+                "family": "ip6",
+                "table": "nat",
+                "chain": "PREROUTING",
+                "handle": 3,
+                "expr": [
+                    {
+                        "xt": {
+                            "type": "match",
+                            "name": "addrtype"
+                        }
+                    },
+                    {
+                        "counter": {
+                            "packets": 0,
+                            "bytes": 0
+                        }
+                    },
+                    {
+                        "jump": {
+                            "target": "DOCKER"
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "rule": {
+                "family": "ip6",
+                "table": "nat",
+                "chain": "OUTPUT",
+                "handle": 5,
+                "expr": [
+                    {
+                        "match": {
+                            "op": "!=",
+                            "left": {
+                                "payload": {
+                                    "protocol": "ip6",
+                                    "field": "daddr"
+                                }
+                            },
+                            "right": "::1"
+                        }
+                    },
+                    {
+                        "xt": {
+                            "type": "match",
+                            "name": "addrtype"
+                        }
+                    },
+                    {
+                        "counter": {
+                            "packets": 0,
+                            "bytes": 0
+                        }
+                    },
+                    {
+                        "jump": {
+                            "target": "DOCKER"
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "table": {
+                "family": "ip6",
+                "name": "filter",
+                "handle": 4
+            }
+        },
+        {
+            "chain": {
+                "family": "ip6",
+                "table": "filter",
+                "name": "DOCKER",
+                "handle": 1
+            }
+        },
+        {
+            "chain": {
+                "family": "ip6",
+                "table": "filter",
+                "name": "DOCKER-FORWARD",
+                "handle": 2
+            }
+        },
+        {
+            "chain": {
+                "family": "ip6",
+                "table": "filter",
+                "name": "DOCKER-BRIDGE",
+                "handle": 3
+            }
+        },
+        {
+            "chain": {
+                "family": "ip6",
+                "table": "filter",
+                "name": "DOCKER-CT",
+                "handle": 4
+            }
+        },
+        {
+            "chain": {
+                "family": "ip6",
+                "table": "filter",
+                "name": "DOCKER-ISOLATION-STAGE-1",
+                "handle": 5
+            }
+        },
+        {
+            "chain": {
+                "family": "ip6",
+                "table": "filter",
+                "name": "DOCKER-ISOLATION-STAGE-2",
+                "handle": 6
+            }
+        },
+        {
+            "chain": {
+                "family": "ip6",
+                "table": "filter",
+                "name": "FORWARD",
+                "handle": 7,
+                "type": "filter",
+                "hook": "forward",
+                "prio": 0,
+                "policy": "accept"
+            }
+        },
+        {
+            "chain": {
+                "family": "ip6",
+                "table": "filter",
+                "name": "DOCKER-USER",
+                "handle": 12
+            }
+        },
+        {
+            "rule": {
+                "family": "ip6",
+                "table": "filter",
+                "chain": "DOCKER-FORWARD",
+                "handle": 11,
+                "expr": [
+                    {
+                        "counter": {
+                            "packets": 0,
+                            "bytes": 0
+                        }
+                    },
+                    {
+                        "jump": {
+                            "target": "DOCKER-CT"
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "rule": {
+                "family": "ip6",
+                "table": "filter",
+                "chain": "DOCKER-FORWARD",
+                "handle": 10,
+                "expr": [
+                    {
+                        "counter": {
+                            "packets": 0,
+                            "bytes": 0
+                        }
+                    },
+                    {
+                        "jump": {
+                            "target": "DOCKER-ISOLATION-STAGE-1"
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "rule": {
+                "family": "ip6",
+                "table": "filter",
+                "chain": "DOCKER-FORWARD",
+                "handle": 9,
+                "expr": [
+                    {
+                        "counter": {
+                            "packets": 0,
+                            "bytes": 0
+                        }
+                    },
+                    {
+                        "jump": {
+                            "target": "DOCKER-BRIDGE"
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "rule": {
+                "family": "ip6",
+                "table": "filter",
+                "chain": "FORWARD",
+                "handle": 13,
+                "expr": [
+                    {
+                        "counter": {
+                            "packets": 0,
+                            "bytes": 0
+                        }
+                    },
+                    {
+                        "jump": {
+                            "target": "DOCKER-USER"
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "rule": {
+                "family": "ip6",
+                "table": "filter",
+                "chain": "FORWARD",
+                "handle": 8,
+                "expr": [
+                    {
+                        "counter": {
+                            "packets": 0,
+                            "bytes": 0
+                        }
+                    },
+                    {
+                        "jump": {
+                            "target": "DOCKER-FORWARD"
+                        }
+                    }
+                ]
+            }
+        }
+    ]
+}
+```
diff --git a/src/tests/tools/firewall_agent/docs/yang/generate-trees.sh b/src/tests/tools/firewall_agent/docs/yang/generate-trees.sh
new file mode 100755
index 000000000..30f02e67e
--- /dev/null
+++ b/src/tests/tools/firewall_agent/docs/yang/generate-trees.sh
@@ -0,0 +1,54 @@
+#!/bin/bash
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 openconfig
+
+pyang -f tree -o ../openconfig-components.tree \
+    platform/openconfig-platform-common.yang \
+    platform/openconfig-platform-types.yang \
+    platform/openconfig-platform.yang \
+    system/openconfig-alarm-types.yang \
+    types/openconfig-types.yang \
+    types/openconfig-yang-types.yang
+
+pyang -f tree -o ../openconfig-interfaces.tree \
+    interfaces/openconfig-if-aggregate.yang \
+    interfaces/openconfig-if-ethernet.yang \
+    interfaces/openconfig-if-ip.yang \
+    interfaces/openconfig-interfaces.yang \
+    openconfig-extensions.yang \
+    openconfig-transport/openconfig-transport-types.yang \
+    platform/openconfig-platform-types.yang \
+    types/openconfig-inet-types.yang \
+    types/openconfig-types.yang \
+    types/openconfig-yang-types.yang \
+    vlan/openconfig-vlan-types.yang \
+    vlan/openconfig-vlan.yang
+
+pyang -f tree -o ../openconfig-acl.tree \
+    acl/openconfig-acl.yang \
+    acl/openconfig-icmpv4-types.yang \
+    acl/openconfig-icmpv6-types.yang \
+    acl/openconfig-packet-match-types.yang \
+    acl/openconfig-packet-match.yang \
+    defined-sets/openconfig-defined-sets.yang \
+    interfaces/openconfig-interfaces.yang \
+    mpls/openconfig-mpls-types.yang \
+    openconfig-transport/openconfig-transport-types.yang \
+    platform/openconfig-platform-types.yang \
+    types/openconfig-inet-types.yang \
+    types/openconfig-types.yang \
+    types/openconfig-yang-types.yang
diff --git a/src/tests/tools/firewall_agent/docs/yang/ietf/iana-if-type.yang b/src/tests/tools/firewall_agent/docs/yang/ietf/iana-if-type.yang
new file mode 100644
index 000000000..7bfee3647
--- /dev/null
+++ b/src/tests/tools/firewall_agent/docs/yang/ietf/iana-if-type.yang
@@ -0,0 +1,1619 @@
+module iana-if-type {
+  namespace "urn:ietf:params:xml:ns:yang:iana-if-type";
+  prefix ianaift;
+
+  import ietf-interfaces {
+    prefix if;
+  }
+
+  organization "IANA";
+  contact
+    "        Internet Assigned Numbers Authority
+
+     Postal: ICANN
+             12025 Waterfront Drive, Suite 300
+             Los Angeles, CA 90094-2536
+             United States
+
+     Tel:    +1 310 301 5800
+     ";
+  description
+    "This YANG module defines YANG identities for IANA-registered
+     interface types.
+
+     This YANG module is maintained by IANA and reflects the
+     'ifType definitions' registry.
+
+     The latest revision of this YANG module can be obtained from
+     the IANA web site.
+
+     Requests for new values should be made to IANA via
+     email (iana&iana.org).
+
+     Copyright (c) 2014 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).
+
+     The initial version of this YANG module is part of RFC 7224;
+     see the RFC itself for full legal notices.";
+  reference
+    "IANA 'ifType definitions' registry.
+     ";
+
+  revision 2017-01-19 {
+    description
+      "Registered ifType 289.";
+  }
+
+  revision 2016-11-23 {
+    description
+      "Registered ifTypes 283-288.";
+  }
+
+  revision 2016-06-09 {
+    description
+      "Registered ifType 282.";
+  }
+  revision 2016-05-03 {
+    description
+      "Registered ifType 281.";
+  }
+  revision 2015-06-12 {
+    description
+      "Corrected formatting issue.";
+  }  
+  revision 2014-09-24 {
+    description
+      "Registered ifType 280.";
+  }
+  revision 2014-09-19 {
+    description
+      "Registered ifType 279.";
+  }
+  revision 2014-07-03 {
+    description
+      "Registered ifTypes 277-278.";
+  }
+  revision 2014-05-19 {
+    description
+      "Updated the contact address.";
+  }
+  revision 2014-05-08 {
+    description
+      "Initial revision.";
+    reference
+      "RFC 7224: IANA Interface Type YANG Module";
+  }
+
+  identity iana-interface-type {
+    base if:interface-type;
+    description
+      "This identity is used as a base for all interface types
+       defined in the 'ifType definitions' registry.";
+  }
+
+  identity other {
+    base iana-interface-type;
+  }
+  identity regular1822 {
+    base iana-interface-type;
+  }
+  identity hdh1822 {
+    base iana-interface-type;
+  }
+  identity ddnX25 {
+    base iana-interface-type;
+  }
+  identity rfc877x25 {
+    base iana-interface-type;
+    reference
+      "RFC 1382 - SNMP MIB Extension for the X.25 Packet Layer";
+  }
+  identity ethernetCsmacd {
+    base iana-interface-type;
+    description
+      "For all Ethernet-like interfaces, regardless of speed,
+       as per RFC 3635.";
+    reference
+      "RFC 3635 - Definitions of Managed Objects for the
+                  Ethernet-like Interface Types";
+  }
+  identity iso88023Csmacd {
+    base iana-interface-type;
+    status deprecated;
+    description
+      "Deprecated via RFC 3635.
+       Use ethernetCsmacd(6) instead.";
+    reference
+      "RFC 3635 - Definitions of Managed Objects for the
+                  Ethernet-like Interface Types";
+  }
+  identity iso88024TokenBus {
+    base iana-interface-type;
+  }
+  identity iso88025TokenRing {
+    base iana-interface-type;
+  }
+  identity iso88026Man {
+    base iana-interface-type;
+  }
+  identity starLan {
+    base iana-interface-type;
+    status deprecated;
+    description
+      "Deprecated via RFC 3635.
+       Use ethernetCsmacd(6) instead.";
+    reference
+      "RFC 3635 - Definitions of Managed Objects for the
+                  Ethernet-like Interface Types";
+  }
+  identity proteon10Mbit {
+    base iana-interface-type;
+  }
+  identity proteon80Mbit {
+    base iana-interface-type;
+  }
+  identity hyperchannel {
+    base iana-interface-type;
+  }
+  identity fddi {
+    base iana-interface-type;
+    reference
+      "RFC 1512 - FDDI Management Information Base";
+  }
+  identity lapb {
+    base iana-interface-type;
+    reference
+      "RFC 1381 - SNMP MIB Extension for X.25 LAPB";
+  }
+  identity sdlc {
+    base iana-interface-type;
+  }
+  identity ds1 {
+    base iana-interface-type;
+    description
+      "DS1-MIB.";
+    reference
+      "RFC 4805 - Definitions of Managed Objects for the
+                  DS1, J1, E1, DS2, and E2 Interface Types";
+  }
+  identity e1 {
+    base iana-interface-type;
+    status obsolete;
+    description
+      "Obsolete; see DS1-MIB.";
+    reference
+      "RFC 4805 - Definitions of Managed Objects for the
+                  DS1, J1, E1, DS2, and E2 Interface Types";
+  }
+  identity basicISDN {
+    base iana-interface-type;
+    description
+      "No longer used.  See also RFC 2127.";
+  }
+  identity primaryISDN {
+    base iana-interface-type;
+    description
+      "No longer used.  See also RFC 2127.";
+  }
+  identity propPointToPointSerial {
+    base iana-interface-type;
+    description
+      "Proprietary serial.";
+  }
+  identity ppp {
+    base iana-interface-type;
+  }
+  identity softwareLoopback {
+    base iana-interface-type;
+  }
+  identity eon {
+    base iana-interface-type;
+    description
+      "CLNP over IP.";
+  }
+  identity ethernet3Mbit {
+    base iana-interface-type;
+  }
+  identity nsip {
+    base iana-interface-type;
+    description
+      "XNS over IP.";
+  }
+  identity slip {
+    base iana-interface-type;
+    description
+      "Generic SLIP.";
+  }
+  identity ultra {
+    base iana-interface-type;
+    description
+      "Ultra Technologies.";
+  }
+  identity ds3 {
+    base iana-interface-type;
+    description
+      "DS3-MIB.";
+    reference
+      "RFC 3896 - Definitions of Managed Objects for the
+                  DS3/E3 Interface Type";
+  }
+  identity sip {
+    base iana-interface-type;
+    description
+      "SMDS, coffee.";
+    reference
+      "RFC 1694 - Definitions of Managed Objects for SMDS
+                  Interfaces using SMIv2";
+  }
+  identity frameRelay {
+    base iana-interface-type;
+    description
+      "DTE only.";
+    reference
+      "RFC 2115 - Management Information Base for Frame Relay
+                  DTEs Using SMIv2";
+  }
+  identity rs232 {
+    base iana-interface-type;
+    reference
+      "RFC 1659 - Definitions of Managed Objects for RS-232-like
+                  Hardware Devices using SMIv2";
+  }
+  identity para {
+    base iana-interface-type;
+    description
+      "Parallel-port.";
+    reference
+      "RFC 1660 - Definitions of Managed Objects for
+                  Parallel-printer-like Hardware Devices using
+                  SMIv2";
+  }
+  identity arcnet {
+    base iana-interface-type;
+    description
+      "ARCnet.";
+  }
+  identity arcnetPlus {
+    base iana-interface-type;
+    description
+      "ARCnet Plus.";
+  }
+  identity atm {
+    base iana-interface-type;
+    description
+      "ATM cells.";
+  }
+  identity miox25 {
+    base iana-interface-type;
+    reference
+      "RFC 1461 - SNMP MIB extension for Multiprotocol
+                  Interconnect over X.25";
+  }
+  identity sonet {
+    base iana-interface-type;
+    description
+      "SONET or SDH.";
+  }
+  identity x25ple {
+    base iana-interface-type;
+    reference
+      "RFC 2127 - ISDN Management Information Base using SMIv2";
+  }
+  identity iso88022llc {
+    base iana-interface-type;
+  }
+  identity localTalk {
+    base iana-interface-type;
+  }
+  identity smdsDxi {
+    base iana-interface-type;
+  }
+  identity frameRelayService {
+    base iana-interface-type;
+    description
+      "FRNETSERV-MIB.";
+    reference
+      "RFC 2954 - Definitions of Managed Objects for Frame
+                  Relay Service";
+  }
+  identity v35 {
+    base iana-interface-type;
+  }
+  identity hssi {
+    base iana-interface-type;
+  }
+  identity hippi {
+    base iana-interface-type;
+  }
+  identity modem {
+    base iana-interface-type;
+    description
+      "Generic modem.";
+  }
+  identity aal5 {
+    base iana-interface-type;
+    description
+      "AAL5 over ATM.";
+  }
+  identity sonetPath {
+    base iana-interface-type;
+  }
+  identity sonetVT {
+    base iana-interface-type;
+  }
+  identity smdsIcip {
+    base iana-interface-type;
+    description
+      "SMDS InterCarrier Interface.";
+  }
+  identity propVirtual {
+    base iana-interface-type;
+    description
+      "Proprietary virtual/internal.";
+    reference
+      "RFC 2863 - The Interfaces Group MIB";
+  }
+  identity propMultiplexor {
+    base iana-interface-type;
+    description
+      "Proprietary multiplexing.";
+    reference
+      "RFC 2863 - The Interfaces Group MIB";
+  }
+  identity ieee80212 {
+    base iana-interface-type;
+    description
+      "100BaseVG.";
+  }
+  identity fibreChannel {
+    base iana-interface-type;
+    description
+      "Fibre Channel.";
+  }
+  identity hippiInterface {
+    base iana-interface-type;
+    description
+      "HIPPI interfaces.";
+  }
+  identity frameRelayInterconnect {
+    base iana-interface-type;
+    status obsolete;
+    description
+      "Obsolete; use either
+       frameRelay(32) or frameRelayService(44).";
+  }
+  identity aflane8023 {
+    base iana-interface-type;
+    description
+      "ATM Emulated LAN for 802.3.";
+  }
+  identity aflane8025 {
+    base iana-interface-type;
+    description
+      "ATM Emulated LAN for 802.5.";
+  }
+  identity cctEmul {
+    base iana-interface-type;
+    description
+      "ATM Emulated circuit.";
+  }
+  identity fastEther {
+    base iana-interface-type;
+    status deprecated;
+    description
+      "Obsoleted via RFC 3635.
+       ethernetCsmacd(6) should be used instead.";
+    reference
+      "RFC 3635 - Definitions of Managed Objects for the
+                  Ethernet-like Interface Types";
+  }
+  identity isdn {
+    base iana-interface-type;
+    description
+      "ISDN and X.25.";
+    reference
+      "RFC 1356 - Multiprotocol Interconnect on X.25 and ISDN
+                  in the Packet Mode";
+  }
+  identity v11 {
+    base iana-interface-type;
+    description
+      "CCITT V.11/X.21.";
+  }
+  identity v36 {
+    base iana-interface-type;
+    description
+      "CCITT V.36.";
+  }
+  identity g703at64k {
+    base iana-interface-type;
+    description
+      "CCITT G703 at 64Kbps.";
+  }
+  identity g703at2mb {
+    base iana-interface-type;
+    status obsolete;
+    description
+      "Obsolete; see DS1-MIB.";
+  }
+  identity qllc {
+    base iana-interface-type;
+    description
+      "SNA QLLC.";
+  }
+  identity fastEtherFX {
+    base iana-interface-type;
+    status deprecated;
+    description
+      "Obsoleted via RFC 3635.
+       ethernetCsmacd(6) should be used instead.";
+    reference
+      "RFC 3635 - Definitions of Managed Objects for the
+                  Ethernet-like Interface Types";
+  }
+  identity channel {
+    base iana-interface-type;
+    description
+      "Channel.";
+  }
+  identity ieee80211 {
+    base iana-interface-type;
+    description
+      "Radio spread spectrum.";
+  }
+  identity ibm370parChan {
+    base iana-interface-type;
+    description
+      "IBM System 360/370 OEMI Channel.";
+  }
+  identity escon {
+    base iana-interface-type;
+    description
+      "IBM Enterprise Systems Connection.";
+  }
+  identity dlsw {
+    base iana-interface-type;
+    description
+      "Data Link Switching.";
+  }
+  identity isdns {
+    base iana-interface-type;
+    description
+      "ISDN S/T interface.";
+  }
+  identity isdnu {
+    base iana-interface-type;
+    description
+      "ISDN U interface.";
+  }
+  identity lapd {
+    base iana-interface-type;
+    description
+      "Link Access Protocol D.";
+  }
+  identity ipSwitch {
+    base iana-interface-type;
+    description
+      "IP Switching Objects.";
+  }
+  identity rsrb {
+    base iana-interface-type;
+    description
+      "Remote Source Route Bridging.";
+  }
+  identity atmLogical {
+    base iana-interface-type;
+    description
+      "ATM Logical Port.";
+    reference
+      "RFC 3606 - Definitions of Supplemental Managed Objects
+                  for ATM Interface";
+  }
+  identity ds0 {
+    base iana-interface-type;
+    description
+      "Digital Signal Level 0.";
+    reference
+      "RFC 2494 - Definitions of Managed Objects for the DS0
+                  and DS0 Bundle Interface Type";
+  }
+  identity ds0Bundle {
+    base iana-interface-type;
+    description
+      "Group of ds0s on the same ds1.";
+    reference
+      "RFC 2494 - Definitions of Managed Objects for the DS0
+                  and DS0 Bundle Interface Type";
+  }
+  identity bsc {
+    base iana-interface-type;
+    description
+      "Bisynchronous Protocol.";
+  }
+  identity async {
+    base iana-interface-type;
+    description
+      "Asynchronous Protocol.";
+  }
+  identity cnr {
+    base iana-interface-type;
+    description
+      "Combat Net Radio.";
+  }
+  identity iso88025Dtr {
+    base iana-interface-type;
+    description
+      "ISO 802.5r DTR.";
+  }
+  identity eplrs {
+    base iana-interface-type;
+    description
+      "Ext Pos Loc Report Sys.";
+  }
+  identity arap {
+    base iana-interface-type;
+    description
+      "Appletalk Remote Access Protocol.";
+  }
+  identity propCnls {
+    base iana-interface-type;
+    description
+      "Proprietary Connectionless Protocol.";
+  }
+  identity hostPad {
+    base iana-interface-type;
+    description
+      "CCITT-ITU X.29 PAD Protocol.";
+  }
+  identity termPad {
+    base iana-interface-type;
+    description
+      "CCITT-ITU X.3 PAD Facility.";
+  }
+  identity frameRelayMPI {
+    base iana-interface-type;
+    description
+      "Multiproto Interconnect over FR.";
+  }
+  identity x213 {
+    base iana-interface-type;
+    description
+      "CCITT-ITU X213.";
+  }
+  identity adsl {
+    base iana-interface-type;
+    description
+      "Asymmetric Digital Subscriber Loop.";
+  }
+  identity radsl {
+    base iana-interface-type;
+    description
+      "Rate-Adapt. Digital Subscriber Loop.";
+  }
+  identity sdsl {
+    base iana-interface-type;
+    description
+      "Symmetric Digital Subscriber Loop.";
+  }
+  identity vdsl {
+    base iana-interface-type;
+    description
+      "Very H-Speed Digital Subscrib. Loop.";
+  }
+  identity iso88025CRFPInt {
+    base iana-interface-type;
+    description
+      "ISO 802.5 CRFP.";
+  }
+  identity myrinet {
+    base iana-interface-type;
+    description
+      "Myricom Myrinet.";
+  }
+  identity voiceEM {
+    base iana-interface-type;
+    description
+      "Voice recEive and transMit.";
+  }
+  identity voiceFXO {
+    base iana-interface-type;
+    description
+      "Voice Foreign Exchange Office.";
+  }
+  identity voiceFXS {
+    base iana-interface-type;
+    description
+      "Voice Foreign Exchange Station.";
+  }
+  identity voiceEncap {
+    base iana-interface-type;
+    description
+      "Voice encapsulation.";
+  }
+  identity voiceOverIp {
+    base iana-interface-type;
+    description
+      "Voice over IP encapsulation.";
+  }
+  identity atmDxi {
+    base iana-interface-type;
+    description
+      "ATM DXI.";
+  }
+  identity atmFuni {
+    base iana-interface-type;
+    description
+      "ATM FUNI.";
+  }
+  identity atmIma {
+    base iana-interface-type;
+    description
+      "ATM IMA.";
+  }
+  identity pppMultilinkBundle {
+    base iana-interface-type;
+    description
+      "PPP Multilink Bundle.";
+  }
+  identity ipOverCdlc {
+    base iana-interface-type;
+    description
+      "IBM ipOverCdlc.";
+  }
+  identity ipOverClaw {
+    base iana-interface-type;
+    description
+      "IBM Common Link Access to Workstn.";
+  }
+  identity stackToStack {
+    base iana-interface-type;
+    description
+      "IBM stackToStack.";
+  }
+  identity virtualIpAddress {
+    base iana-interface-type;
+    description
+      "IBM VIPA.";
+  }
+  identity mpc {
+    base iana-interface-type;
+    description
+      "IBM multi-protocol channel support.";
+  }
+  identity ipOverAtm {
+    base iana-interface-type;
+    description
+      "IBM ipOverAtm.";
+    reference
+      "RFC 2320 - Definitions of Managed Objects for Classical IP
+                  and ARP Over ATM Using SMIv2 (IPOA-MIB)";
+  }
+  identity iso88025Fiber {
+    base iana-interface-type;
+    description
+      "ISO 802.5j Fiber Token Ring.";
+  }
+  identity tdlc {
+    base iana-interface-type;
+    description
+      "IBM twinaxial data link control.";
+  }
+  identity gigabitEthernet {
+    base iana-interface-type;
+    status deprecated;
+    description
+      "Obsoleted via RFC 3635.
+       ethernetCsmacd(6) should be used instead.";
+    reference
+      "RFC 3635 - Definitions of Managed Objects for the
+                  Ethernet-like Interface Types";
+  }
+  identity hdlc {
+    base iana-interface-type;
+    description
+      "HDLC.";
+  }
+  identity lapf {
+    base iana-interface-type;
+    description
+      "LAP F.";
+  }
+  identity v37 {
+    base iana-interface-type;
+    description
+      "V.37.";
+  }
+  identity x25mlp {
+    base iana-interface-type;
+    description
+      "Multi-Link Protocol.";
+  }
+  identity x25huntGroup {
+    base iana-interface-type;
+    description
+      "X25 Hunt Group.";
+  }
+  identity transpHdlc {
+    base iana-interface-type;
+    description
+      "Transp HDLC.";
+  }
+  identity interleave {
+    base iana-interface-type;
+    description
+      "Interleave channel.";
+  }
+  identity fast {
+    base iana-interface-type;
+    description
+      "Fast channel.";
+  }
+  identity ip {
+    base iana-interface-type;
+    description
+      "IP (for APPN HPR in IP networks).";
+  }
+  identity docsCableMaclayer {
+    base iana-interface-type;
+    description
+      "CATV Mac Layer.";
+  }
+  identity docsCableDownstream {
+    base iana-interface-type;
+    description
+      "CATV Downstream interface.";
+  }
+  identity docsCableUpstream {
+    base iana-interface-type;
+    description
+      "CATV Upstream interface.";
+  }
+  identity a12MppSwitch {
+    base iana-interface-type;
+    description
+      "Avalon Parallel Processor.";
+  }
+  identity tunnel {
+    base iana-interface-type;
+    description
+      "Encapsulation interface.";
+  }
+  identity coffee {
+    base iana-interface-type;
+    description
+      "Coffee pot.";
+    reference
+      "RFC 2325 - Coffee MIB";
+  }
+  identity ces {
+    base iana-interface-type;
+    description
+      "Circuit Emulation Service.";
+  }
+  identity atmSubInterface {
+    base iana-interface-type;
+    description
+      "ATM Sub Interface.";
+  }
+  identity l2vlan {
+    base iana-interface-type;
+    description
+      "Layer 2 Virtual LAN using 802.1Q.";
+  }
+  identity l3ipvlan {
+    base iana-interface-type;
+    description
+      "Layer 3 Virtual LAN using IP.";
+  }
+  identity l3ipxvlan {
+    base iana-interface-type;
+    description
+      "Layer 3 Virtual LAN using IPX.";
+  }
+  identity digitalPowerline {
+    base iana-interface-type;
+    description
+      "IP over Power Lines.";
+  }
+  identity mediaMailOverIp {
+    base iana-interface-type;
+    description
+      "Multimedia Mail over IP.";
+  }
+  identity dtm {
+    base iana-interface-type;
+    description
+      "Dynamic synchronous Transfer Mode.";
+  }
+  identity dcn {
+    base iana-interface-type;
+    description
+      "Data Communications Network.";
+  }
+  identity ipForward {
+    base iana-interface-type;
+    description
+      "IP Forwarding Interface.";
+  }
+  identity msdsl {
+    base iana-interface-type;
+    description
+      "Multi-rate Symmetric DSL.";
+  }
+  identity ieee1394 {
+    base iana-interface-type;
+
+    description
+      "IEEE1394 High Performance Serial Bus.";
+  }
+  identity if-gsn {
+    base iana-interface-type;
+    description
+      "HIPPI-6400.";
+  }
+  identity dvbRccMacLayer {
+    base iana-interface-type;
+    description
+      "DVB-RCC MAC Layer.";
+  }
+  identity dvbRccDownstream {
+    base iana-interface-type;
+    description
+      "DVB-RCC Downstream Channel.";
+  }
+  identity dvbRccUpstream {
+    base iana-interface-type;
+    description
+      "DVB-RCC Upstream Channel.";
+  }
+  identity atmVirtual {
+    base iana-interface-type;
+    description
+      "ATM Virtual Interface.";
+  }
+  identity mplsTunnel {
+    base iana-interface-type;
+    description
+      "MPLS Tunnel Virtual Interface.";
+  }
+  identity srp {
+    base iana-interface-type;
+    description
+      "Spatial Reuse Protocol.";
+  }
+  identity voiceOverAtm {
+    base iana-interface-type;
+    description
+      "Voice over ATM.";
+  }
+  identity voiceOverFrameRelay {
+    base iana-interface-type;
+    description
+      "Voice Over Frame Relay.";
+  }
+  identity idsl {
+    base iana-interface-type;
+    description
+      "Digital Subscriber Loop over ISDN.";
+  }
+  identity compositeLink {
+    base iana-interface-type;
+    description
+      "Avici Composite Link Interface.";
+  }
+  identity ss7SigLink {
+    base iana-interface-type;
+    description
+      "SS7 Signaling Link.";
+  }
+  identity propWirelessP2P {
+    base iana-interface-type;
+    description
+      "Prop. P2P wireless interface.";
+  }
+  identity frForward {
+    base iana-interface-type;
+    description
+      "Frame Forward Interface.";
+  }
+  identity rfc1483 {
+    base iana-interface-type;
+    description
+      "Multiprotocol over ATM AAL5.";
+    reference
+      "RFC 1483 - Multiprotocol Encapsulation over ATM
+                  Adaptation Layer 5";
+  }
+  identity usb {
+    base iana-interface-type;
+    description
+      "USB Interface.";
+  }
+  identity ieee8023adLag {
+    base iana-interface-type;
+    description
+      "IEEE 802.3ad Link Aggregate.";
+  }
+  identity bgppolicyaccounting {
+    base iana-interface-type;
+    description
+      "BGP Policy Accounting.";
+  }
+  identity frf16MfrBundle {
+    base iana-interface-type;
+    description
+      "FRF.16 Multilink Frame Relay.";
+  }
+  identity h323Gatekeeper {
+    base iana-interface-type;
+    description
+      "H323 Gatekeeper.";
+  }
+  identity h323Proxy {
+    base iana-interface-type;
+    description
+      "H323 Voice and Video Proxy.";
+  }
+  identity mpls {
+    base iana-interface-type;
+    description
+      "MPLS.";
+  }
+  identity mfSigLink {
+    base iana-interface-type;
+    description
+      "Multi-frequency signaling link.";
+  }
+  identity hdsl2 {
+    base iana-interface-type;
+    description
+      "High Bit-Rate DSL - 2nd generation.";
+  }
+  identity shdsl {
+    base iana-interface-type;
+    description
+      "Multirate HDSL2.";
+  }
+  identity ds1FDL {
+    base iana-interface-type;
+    description
+      "Facility Data Link (4Kbps) on a DS1.";
+  }
+  identity pos {
+    base iana-interface-type;
+    description
+      "Packet over SONET/SDH Interface.";
+  }
+  identity dvbAsiIn {
+    base iana-interface-type;
+    description
+      "DVB-ASI Input.";
+  }
+  identity dvbAsiOut {
+    base iana-interface-type;
+    description
+      "DVB-ASI Output.";
+  }
+  identity plc {
+    base iana-interface-type;
+    description
+      "Power Line Communications.";
+  }
+  identity nfas {
+    base iana-interface-type;
+    description
+      "Non-Facility Associated Signaling.";
+  }
+  identity tr008 {
+    base iana-interface-type;
+    description
+      "TR008.";
+  }
+  identity gr303RDT {
+    base iana-interface-type;
+    description
+      "Remote Digital Terminal.";
+  }
+  identity gr303IDT {
+    base iana-interface-type;
+    description
+      "Integrated Digital Terminal.";
+  }
+  identity isup {
+    base iana-interface-type;
+    description
+      "ISUP.";
+  }
+  identity propDocsWirelessMaclayer {
+    base iana-interface-type;
+    description
+      "Cisco proprietary Maclayer.";
+  }
+  identity propDocsWirelessDownstream {
+    base iana-interface-type;
+    description
+      "Cisco proprietary Downstream.";
+  }
+  identity propDocsWirelessUpstream {
+    base iana-interface-type;
+    description
+      "Cisco proprietary Upstream.";
+  }
+  identity hiperlan2 {
+    base iana-interface-type;
+    description
+      "HIPERLAN Type 2 Radio Interface.";
+  }
+  identity propBWAp2Mp {
+    base iana-interface-type;
+    description
+      "PropBroadbandWirelessAccesspt2Multipt (use of this value
+       for IEEE 802.16 WMAN interfaces as per IEEE Std 802.16f
+       is deprecated, and ieee80216WMAN(237) should be used
+       instead).";
+  }
+  identity sonetOverheadChannel {
+    base iana-interface-type;
+    description
+      "SONET Overhead Channel.";
+  }
+  identity digitalWrapperOverheadChannel {
+    base iana-interface-type;
+    description
+      "Digital Wrapper.";
+  }
+  identity aal2 {
+    base iana-interface-type;
+    description
+      "ATM adaptation layer 2.";
+  }
+  identity radioMAC {
+    base iana-interface-type;
+    description
+      "MAC layer over radio links.";
+  }
+  identity atmRadio {
+    base iana-interface-type;
+    description
+      "ATM over radio links.";
+  }
+  identity imt {
+    base iana-interface-type;
+    description
+      "Inter-Machine Trunks.";
+  }
+  identity mvl {
+    base iana-interface-type;
+    description
+      "Multiple Virtual Lines DSL.";
+  }
+  identity reachDSL {
+    base iana-interface-type;
+    description
+      "Long Reach DSL.";
+  }
+  identity frDlciEndPt {
+    base iana-interface-type;
+    description
+      "Frame Relay DLCI End Point.";
+  }
+  identity atmVciEndPt {
+    base iana-interface-type;
+    description
+      "ATM VCI End Point.";
+  }
+  identity opticalChannel {
+    base iana-interface-type;
+    description
+      "Optical Channel.";
+  }
+  identity opticalTransport {
+    base iana-interface-type;
+    description
+      "Optical Transport.";
+  }
+  identity propAtm {
+    base iana-interface-type;
+    description
+      "Proprietary ATM.";
+  }
+  identity voiceOverCable {
+    base iana-interface-type;
+    description
+      "Voice Over Cable Interface.";
+  }
+  identity infiniband {
+    base iana-interface-type;
+    description
+      "Infiniband.";
+  }
+  identity teLink {
+    base iana-interface-type;
+    description
+      "TE Link.";
+  }
+  identity q2931 {
+    base iana-interface-type;
+    description
+      "Q.2931.";
+  }
+  identity virtualTg {
+    base iana-interface-type;
+    description
+      "Virtual Trunk Group.";
+  }
+  identity sipTg {
+    base iana-interface-type;
+    description
+      "SIP Trunk Group.";
+  }
+  identity sipSig {
+    base iana-interface-type;
+    description
+      "SIP Signaling.";
+  }
+  identity docsCableUpstreamChannel {
+    base iana-interface-type;
+    description
+      "CATV Upstream Channel.";
+  }
+  identity econet {
+    base iana-interface-type;
+    description
+      "Acorn Econet.";
+  }
+  identity pon155 {
+    base iana-interface-type;
+    description
+      "FSAN 155Mb Symetrical PON interface.";
+  }
+  identity pon622 {
+    base iana-interface-type;
+    description
+      "FSAN 622Mb Symetrical PON interface.";
+  }
+  identity bridge {
+    base iana-interface-type;
+    description
+      "Transparent bridge interface.";
+  }
+  identity linegroup {
+    base iana-interface-type;
+    description
+      "Interface common to multiple lines.";
+  }
+  identity voiceEMFGD {
+    base iana-interface-type;
+    description
+      "Voice E&M Feature Group D.";
+  }
+  identity voiceFGDEANA {
+    base iana-interface-type;
+    description
+      "Voice FGD Exchange Access North American.";
+  }
+  identity voiceDID {
+    base iana-interface-type;
+    description
+      "Voice Direct Inward Dialing.";
+  }
+  identity mpegTransport {
+    base iana-interface-type;
+    description
+      "MPEG transport interface.";
+  }
+  identity sixToFour {
+    base iana-interface-type;
+    status deprecated;
+    description
+      "6to4 interface (DEPRECATED).";
+    reference
+      "RFC 4087 - IP Tunnel MIB";
+  }
+  identity gtp {
+    base iana-interface-type;
+    description
+      "GTP (GPRS Tunneling Protocol).";
+  }
+  identity pdnEtherLoop1 {
+    base iana-interface-type;
+    description
+      "Paradyne EtherLoop 1.";
+  }
+  identity pdnEtherLoop2 {
+    base iana-interface-type;
+    description
+      "Paradyne EtherLoop 2.";
+  }
+  identity opticalChannelGroup {
+    base iana-interface-type;
+    description
+      "Optical Channel Group.";
+  }
+  identity homepna {
+    base iana-interface-type;
+    description
+      "HomePNA ITU-T G.989.";
+  }
+  identity gfp {
+    base iana-interface-type;
+    description
+      "Generic Framing Procedure (GFP).";
+  }
+  identity ciscoISLvlan {
+    base iana-interface-type;
+    description
+      "Layer 2 Virtual LAN using Cisco ISL.";
+  }
+  identity actelisMetaLOOP {
+    base iana-interface-type;
+    description
+      "Acteleis proprietary MetaLOOP High Speed Link.";
+  }
+  identity fcipLink {
+    base iana-interface-type;
+    description
+      "FCIP Link.";
+  }
+  identity rpr {
+    base iana-interface-type;
+    description
+      "Resilient Packet Ring Interface Type.";
+  }
+  identity qam {
+    base iana-interface-type;
+    description
+      "RF Qam Interface.";
+  }
+  identity lmp {
+    base iana-interface-type;
+    description
+      "Link Management Protocol.";
+    reference
+      "RFC 4327 - Link Management Protocol (LMP) Management
+                  Information Base (MIB)";
+  }
+  identity cblVectaStar {
+    base iana-interface-type;
+    description
+      "Cambridge Broadband Networks Limited VectaStar.";
+  }
+  identity docsCableMCmtsDownstream {
+    base iana-interface-type;
+    description
+      "CATV Modular CMTS Downstream Interface.";
+  }
+  identity adsl2 {
+    base iana-interface-type;
+    status deprecated;
+    description
+      "Asymmetric Digital Subscriber Loop Version 2
+       (DEPRECATED/OBSOLETED - please use adsl2plus(238)
+       instead).";
+    reference
+      "RFC 4706 - Definitions of Managed Objects for Asymmetric
+                  Digital Subscriber Line 2 (ADSL2)";
+  }
+  identity macSecControlledIF {
+    base iana-interface-type;
+    description
+      "MACSecControlled.";
+  }
+  identity macSecUncontrolledIF {
+    base iana-interface-type;
+    description
+      "MACSecUncontrolled.";
+  }
+  identity aviciOpticalEther {
+    base iana-interface-type;
+    description
+      "Avici Optical Ethernet Aggregate.";
+  }
+  identity atmbond {
+    base iana-interface-type;
+    description
+      "atmbond.";
+  }
+  identity voiceFGDOS {
+    base iana-interface-type;
+    description
+      "Voice FGD Operator Services.";
+  }
+  identity mocaVersion1 {
+    base iana-interface-type;
+    description
+      "MultiMedia over Coax Alliance (MoCA) Interface
+       as documented in information provided privately to IANA.";
+  }
+  identity ieee80216WMAN {
+    base iana-interface-type;
+    description
+      "IEEE 802.16 WMAN interface.";
+  }
+  identity adsl2plus {
+    base iana-interface-type;
+    description
+      "Asymmetric Digital Subscriber Loop Version 2 -
+       Version 2 Plus and all variants.";
+  }
+  identity dvbRcsMacLayer {
+    base iana-interface-type;
+    description
+      "DVB-RCS MAC Layer.";
+    reference
+      "RFC 5728 - The SatLabs Group DVB-RCS MIB";
+  }
+  identity dvbTdm {
+    base iana-interface-type;
+    description
+      "DVB Satellite TDM.";
+    reference
+      "RFC 5728 - The SatLabs Group DVB-RCS MIB";
+  }
+  identity dvbRcsTdma {
+    base iana-interface-type;
+    description
+      "DVB-RCS TDMA.";
+    reference
+      "RFC 5728 - The SatLabs Group DVB-RCS MIB";
+  }
+  identity x86Laps {
+    base iana-interface-type;
+    description
+      "LAPS based on ITU-T X.86/Y.1323.";
+  }
+  identity wwanPP {
+    base iana-interface-type;
+    description
+      "3GPP WWAN.";
+  }
+  identity wwanPP2 {
+    base iana-interface-type;
+    description
+      "3GPP2 WWAN.";
+  }
+  identity voiceEBS {
+    base iana-interface-type;
+    description
+      "Voice P-phone EBS physical interface.";
+  }
+  identity ifPwType {
+    base iana-interface-type;
+    description
+      "Pseudowire interface type.";
+    reference
+      "RFC 5601 - Pseudowire (PW) Management Information Base (MIB)";
+  }
+  identity ilan {
+    base iana-interface-type;
+    description
+      "Internal LAN on a bridge per IEEE 802.1ap.";
+  }
+  identity pip {
+    base iana-interface-type;
+    description
+      "Provider Instance Port on a bridge per IEEE 802.1ah PBB.";
+  }
+  identity aluELP {
+    base iana-interface-type;
+    description
+      "Alcatel-Lucent Ethernet Link Protection.";
+  }
+  identity gpon {
+    base iana-interface-type;
+    description
+      "Gigabit-capable passive optical networks (G-PON) as per
+       ITU-T G.948.";
+  }
+  identity vdsl2 {
+    base iana-interface-type;
+    description
+      "Very high speed digital subscriber line Version 2
+       (as per ITU-T Recommendation G.993.2).";
+    reference
+      "RFC 5650 - Definitions of Managed Objects for Very High
+                  Speed Digital Subscriber Line 2 (VDSL2)";
+  }
+  identity capwapDot11Profile {
+    base iana-interface-type;
+    description
+      "WLAN Profile Interface.";
+    reference
+      "RFC 5834 - Control and Provisioning of Wireless Access
+                  Points (CAPWAP) Protocol Binding MIB for
+                  IEEE 802.11";
+  }
+  identity capwapDot11Bss {
+    base iana-interface-type;
+    description
+      "WLAN BSS Interface.";
+    reference
+      "RFC 5834 - Control and Provisioning of Wireless Access
+                  Points (CAPWAP) Protocol Binding MIB for
+                  IEEE 802.11";
+  }
+  identity capwapWtpVirtualRadio {
+    base iana-interface-type;
+    description
+      "WTP Virtual Radio Interface.";
+    reference
+      "RFC 5833 - Control and Provisioning of Wireless Access
+                  Points (CAPWAP) Protocol Base MIB";
+  }
+  identity bits {
+    base iana-interface-type;
+    description
+      "bitsport.";
+  }
+  identity docsCableUpstreamRfPort {
+    base iana-interface-type;
+    description
+      "DOCSIS CATV Upstream RF Port.";
+  }
+  identity cableDownstreamRfPort {
+    base iana-interface-type;
+    description
+      "CATV downstream RF Port.";
+  }
+  identity vmwareVirtualNic {
+    base iana-interface-type;
+    description
+      "VMware Virtual Network Interface.";
+  }
+  identity ieee802154 {
+    base iana-interface-type;
+    description
+      "IEEE 802.15.4 WPAN interface.";
+    reference
+      "IEEE 802.15.4-2006";
+  }
+  identity otnOdu {
+    base iana-interface-type;
+    description
+      "OTN Optical Data Unit.";
+  }
+  identity otnOtu {
+    base iana-interface-type;
+    description
+      "OTN Optical channel Transport Unit.";
+  }
+  identity ifVfiType {
+    base iana-interface-type;
+    description
+      "VPLS Forwarding Instance Interface Type.";
+  }
+  identity g9981 {
+    base iana-interface-type;
+    description
+      "G.998.1 bonded interface.";
+  }
+  identity g9982 {
+    base iana-interface-type;
+    description
+      "G.998.2 bonded interface.";
+  }
+  identity g9983 {
+    base iana-interface-type;
+    description
+      "G.998.3 bonded interface.";
+  }
+
+  identity aluEpon {
+    base iana-interface-type;
+    description
+      "Ethernet Passive Optical Networks (E-PON).";
+  }
+  identity aluEponOnu {
+    base iana-interface-type;
+    description
+      "EPON Optical Network Unit.";
+  }
+  identity aluEponPhysicalUni {
+    base iana-interface-type;
+    description
+      "EPON physical User to Network interface.";
+  }
+  identity aluEponLogicalLink {
+    base iana-interface-type;
+    description
+      "The emulation of a point-to-point link over the EPON
+       layer.";
+  }
+  identity aluGponOnu {
+    base iana-interface-type;
+    description
+      "GPON Optical Network Unit.";
+    reference
+      "ITU-T G.984.2";
+  }
+  identity aluGponPhysicalUni {
+    base iana-interface-type;
+    description
+      "GPON physical User to Network interface.";
+    reference
+      "ITU-T G.984.2";
+  }
+  identity vmwareNicTeam {
+    base iana-interface-type;
+    description
+      "VMware NIC Team.";
+  }
+  identity docsOfdmDownstream {
+    base iana-interface-type;
+    description
+      "CATV Downstream OFDM interface.";
+  }
+  identity docsOfdmaUpstream {
+    base iana-interface-type;
+    description
+      "CATV Upstream OFDMA interface.";
+  }
+  identity gfast {
+    base iana-interface-type;
+    description
+      "G.fast port.";
+    reference
+      "ITU-T G.9701";
+  }
+  identity sdci {
+    base iana-interface-type;
+    description
+      "SDCI (IO-Link).";
+    reference
+      "IEC 61131-9 Edition 1.0 2013-09";
+  }
+  identity xboxWireless {
+    base iana-interface-type;
+    description
+      "Xbox wireless.";
+  }
+  identity fastdsl {
+    base iana-interface-type;
+    description
+      "FastDSL.";
+    reference
+      "BBF TR-355";
+  }
+  identity docsCableScte55d1FwdOob {
+    base iana-interface-type;
+    description
+      "Cable SCTE 55-1 OOB Forward Channel.";
+  }
+  identity docsCableScte55d1RetOob {
+    base iana-interface-type;
+    description
+      "Cable SCTE 55-1 OOB Return Channel.";
+  }
+  identity docsCableScte55d2DsOob {
+    base iana-interface-type;
+    description
+      "Cable SCTE 55-2 OOB Downstream Channel.";
+  }
+  identity docsCableScte55d2UsOob {
+    base iana-interface-type;
+    description
+      "Cable SCTE 55-2 OOB Upstream Channel.";
+  }
+  identity docsCableNdf {
+    base iana-interface-type;
+    description
+      "Cable Narrowband Digital Forward.";
+  }
+  identity docsCableNdr {
+    base iana-interface-type;
+    description
+      "Cable Narrowband Digital Return.";
+  }
+  identity ptm {
+    base iana-interface-type;
+    description
+      "Packet Transfer Mode.";
+  }
+}
diff --git a/src/tests/tools/firewall_agent/docs/yang/ietf/ietf-interfaces.yang b/src/tests/tools/firewall_agent/docs/yang/ietf/ietf-interfaces.yang
new file mode 100644
index 000000000..f66c205ce
--- /dev/null
+++ b/src/tests/tools/firewall_agent/docs/yang/ietf/ietf-interfaces.yang
@@ -0,0 +1,1123 @@
+module ietf-interfaces {
+  yang-version 1.1;
+  namespace "urn:ietf:params:xml:ns:yang:ietf-interfaces";
+  prefix if;
+
+  import ietf-yang-types {
+    prefix yang;
+  }
+
+  organization
+    "IETF NETMOD (Network Modeling) Working Group";
+
+  contact
+    "WG Web:   
+     WG List:  
+
+     Editor:   Martin Bjorklund
+               ";
+
+  description
+    "This module contains a collection of YANG definitions for
+     managing network interfaces.
+
+     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 8343; see
+     the RFC itself for full legal notices.";
+
+  revision 2018-02-20 {
+    description
+      "Updated to support NMDA.";
+    reference
+      "RFC 8343: A YANG Data Model for Interface Management";
+  }
+
+  revision 2014-05-08 {
+    description
+      "Initial revision.";
+    reference
+      "RFC 7223: A YANG Data Model for Interface Management";
+  }
+
+  /*
+   * Typedefs
+   */
+
+  typedef interface-ref {
+    type leafref {
+      path "/if:interfaces/if:interface/if:name";
+    }
+    description
+      "This type is used by data models that need to reference
+       interfaces.";
+  }
+
+  /*
+   * Identities
+   */
+
+  identity interface-type {
+    description
+      "Base identity from which specific interface types are
+       derived.";
+  }
+
+  /*
+   * Features
+   */
+
+  feature arbitrary-names {
+    description
+      "This feature indicates that the device allows user-controlled
+       interfaces to be named arbitrarily.";
+  }
+  feature pre-provisioning {
+    description
+      "This feature indicates that the device supports
+       pre-provisioning of interface configuration, i.e., it is
+       possible to configure an interface whose physical interface
+       hardware is not present on the device.";
+  }
+  feature if-mib {
+    description
+      "This feature indicates that the device implements
+       the IF-MIB.";
+    reference
+      "RFC 2863: The Interfaces Group MIB";
+  }
+
+  /*
+   * Data nodes
+   */
+
+  container interfaces {
+    description
+      "Interface parameters.";
+
+    list interface {
+      key "name";
+
+      description
+        "The list of interfaces on the device.
+
+         The status of an interface is available in this list in the
+         operational state.  If the configuration of a
+         system-controlled interface cannot be used by the system
+         (e.g., the interface hardware present does not match the
+         interface type), then the configuration is not applied to
+         the system-controlled interface shown in the operational
+         state.  If the configuration of a user-controlled interface
+         cannot be used by the system, the configured interface is
+         not instantiated in the operational state.
+
+         System-controlled interfaces created by the system are
+         always present in this list in the operational state,
+         whether or not they are configured.";
+
+     leaf name {
+        type string;
+        description
+          "The name of the interface.
+
+           A device MAY restrict the allowed values for this leaf,
+           possibly depending on the type of the interface.
+           For system-controlled interfaces, this leaf is the
+           device-specific name of the interface.
+
+           If a client tries to create configuration for a
+           system-controlled interface that is not present in the
+           operational state, the server MAY reject the request if
+           the implementation does not support pre-provisioning of
+           interfaces or if the name refers to an interface that can
+           never exist in the system.  A Network Configuration
+           Protocol (NETCONF) server MUST reply with an rpc-error
+           with the error-tag 'invalid-value' in this case.
+
+           If the device supports pre-provisioning of interface
+           configuration, the 'pre-provisioning' feature is
+           advertised.
+
+           If the device allows arbitrarily named user-controlled
+           interfaces, the 'arbitrary-names' feature is advertised.
+
+           When a configured user-controlled interface is created by
+           the system, it is instantiated with the same name in the
+           operational state.
+
+           A server implementation MAY map this leaf to the ifName
+           MIB object.  Such an implementation needs to use some
+           mechanism to handle the differences in size and characters
+           allowed between this leaf and ifName.  The definition of
+           such a mechanism is outside the scope of this document.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifName";
+      }
+
+      leaf description {
+        type string;
+        description
+          "A textual description of the interface.
+
+           A server implementation MAY map this leaf to the ifAlias
+           MIB object.  Such an implementation needs to use some
+           mechanism to handle the differences in size and characters
+           allowed between this leaf and ifAlias.  The definition of
+           such a mechanism is outside the scope of this document.
+
+           Since ifAlias is defined to be stored in non-volatile
+           storage, the MIB implementation MUST map ifAlias to the
+           value of 'description' in the persistently stored
+           configuration.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifAlias";
+      }
+
+      leaf type {
+        type identityref {
+          base interface-type;
+        }
+        mandatory true;
+        description
+          "The type of the interface.
+
+           When an interface entry is created, a server MAY
+           initialize the type leaf with a valid value, e.g., if it
+           is possible to derive the type from the name of the
+           interface.
+
+           If a client tries to set the type of an interface to a
+           value that can never be used by the system, e.g., if the
+           type is not supported or if the type does not match the
+           name of the interface, the server MUST reject the request.
+           A NETCONF server MUST reply with an rpc-error with the
+           error-tag 'invalid-value' in this case.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifType";
+      }
+
+      leaf enabled {
+        type boolean;
+        default "true";
+        description
+          "This leaf contains the configured, desired state of the
+           interface.
+
+           Systems that implement the IF-MIB use the value of this
+           leaf in the intended configuration to set
+           IF-MIB.ifAdminStatus to 'up' or 'down' after an ifEntry
+           has been initialized, as described in RFC 2863.
+
+           Changes in this leaf in the intended configuration are
+           reflected in ifAdminStatus.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifAdminStatus";
+      }
+
+      leaf link-up-down-trap-enable {
+        if-feature if-mib;
+        type enumeration {
+          enum enabled {
+            value 1;
+            description
+              "The device will generate linkUp/linkDown SNMP
+               notifications for this interface.";
+          }
+          enum disabled {
+            value 2;
+            description
+              "The device will not generate linkUp/linkDown SNMP
+               notifications for this interface.";
+          }
+        }
+        description
+          "Controls whether linkUp/linkDown SNMP notifications
+           should be generated for this interface.
+
+           If this node is not configured, the value 'enabled' is
+           operationally used by the server for interfaces that do
+           not operate on top of any other interface (i.e., there are
+           no 'lower-layer-if' entries), and 'disabled' otherwise.";
+        reference
+          "RFC 2863: The Interfaces Group MIB -
+                     ifLinkUpDownTrapEnable";
+      }
+
+      leaf admin-status {
+        if-feature if-mib;
+        type enumeration {
+          enum up {
+            value 1;
+            description
+              "Ready to pass packets.";
+          }
+          enum down {
+            value 2;
+            description
+              "Not ready to pass packets and not in some test mode.";
+          }
+          enum testing {
+            value 3;
+            description
+              "In some test mode.";
+          }
+        }
+        config false;
+        mandatory true;
+        description
+          "The desired state of the interface.
+
+           This leaf has the same read semantics as ifAdminStatus.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifAdminStatus";
+      }
+
+      leaf oper-status {
+        type enumeration {
+          enum up {
+            value 1;
+            description
+              "Ready to pass packets.";
+          }
+          enum down {
+            value 2;
+
+            description
+              "The interface does not pass any packets.";
+          }
+          enum testing {
+            value 3;
+            description
+              "In some test mode.  No operational packets can
+               be passed.";
+          }
+          enum unknown {
+            value 4;
+            description
+              "Status cannot be determined for some reason.";
+          }
+          enum dormant {
+            value 5;
+            description
+              "Waiting for some external event.";
+          }
+          enum not-present {
+            value 6;
+            description
+              "Some component (typically hardware) is missing.";
+          }
+          enum lower-layer-down {
+            value 7;
+            description
+              "Down due to state of lower-layer interface(s).";
+          }
+        }
+        config false;
+        mandatory true;
+        description
+          "The current operational state of the interface.
+
+           This leaf has the same semantics as ifOperStatus.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifOperStatus";
+      }
+
+      leaf last-change {
+        type yang:date-and-time;
+        config false;
+        description
+          "The time the interface entered its current operational
+           state.  If the current state was entered prior to the
+           last re-initialization of the local network management
+           subsystem, then this node is not present.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifLastChange";
+      }
+
+      leaf if-index {
+        if-feature if-mib;
+        type int32 {
+          range "1..2147483647";
+        }
+        config false;
+        mandatory true;
+        description
+          "The ifIndex value for the ifEntry represented by this
+           interface.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifIndex";
+      }
+
+      leaf phys-address {
+        type yang:phys-address;
+        config false;
+        description
+          "The interface's address at its protocol sub-layer.  For
+           example, for an 802.x interface, this object normally
+           contains a Media Access Control (MAC) address.  The
+           interface's media-specific modules must define the bit
+           and byte ordering and the format of the value of this
+           object.  For interfaces that do not have such an address
+           (e.g., a serial line), this node is not present.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifPhysAddress";
+      }
+
+      leaf-list higher-layer-if {
+        type interface-ref;
+        config false;
+        description
+          "A list of references to interfaces layered on top of this
+           interface.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifStackTable";
+      }
+
+      leaf-list lower-layer-if {
+        type interface-ref;
+        config false;
+
+        description
+          "A list of references to interfaces layered underneath this
+           interface.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifStackTable";
+      }
+
+      leaf speed {
+        type yang:gauge64;
+        units "bits/second";
+        config false;
+        description
+            "An estimate of the interface's current bandwidth in bits
+             per second.  For interfaces that do not vary in
+             bandwidth or for those where no accurate estimation can
+             be made, this node should contain the nominal bandwidth.
+             For interfaces that have no concept of bandwidth, this
+             node is not present.";
+        reference
+          "RFC 2863: The Interfaces Group MIB -
+                     ifSpeed, ifHighSpeed";
+      }
+
+      container statistics {
+        config false;
+        description
+          "A collection of interface-related statistics objects.";
+
+        leaf discontinuity-time {
+          type yang:date-and-time;
+          mandatory true;
+          description
+            "The time on the most recent occasion at which any one or
+             more of this interface's counters suffered a
+             discontinuity.  If no such discontinuities have occurred
+             since the last re-initialization of the local management
+             subsystem, then this node contains the time the local
+             management subsystem re-initialized itself.";
+        }
+
+        leaf in-octets {
+          type yang:counter64;
+          description
+            "The total number of octets received on the interface,
+             including framing characters.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifHCInOctets";
+        }
+
+        leaf in-unicast-pkts {
+          type yang:counter64;
+          description
+            "The number of packets, delivered by this sub-layer to a
+             higher (sub-)layer, that were not addressed to a
+             multicast or broadcast address at this sub-layer.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifHCInUcastPkts";
+        }
+
+        leaf in-broadcast-pkts {
+          type yang:counter64;
+          description
+            "The number of packets, delivered by this sub-layer to a
+             higher (sub-)layer, that were addressed to a broadcast
+             address at this sub-layer.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB -
+                       ifHCInBroadcastPkts";
+        }
+
+        leaf in-multicast-pkts {
+          type yang:counter64;
+          description
+            "The number of packets, delivered by this sub-layer to a
+             higher (sub-)layer, that were addressed to a multicast
+             address at this sub-layer.  For a MAC-layer protocol,
+             this includes both Group and Functional addresses.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB -
+                       ifHCInMulticastPkts";
+        }
+
+        leaf in-discards {
+          type yang:counter32;
+          description
+            "The number of inbound packets that were chosen to be
+             discarded even though no errors had been detected to
+             prevent their being deliverable to a higher-layer
+             protocol.  One possible reason for discarding such a
+             packet could be to free up buffer space.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifInDiscards";
+        }
+
+        leaf in-errors {
+          type yang:counter32;
+          description
+            "For packet-oriented interfaces, the number of inbound
+             packets that contained errors preventing them from being
+             deliverable to a higher-layer protocol.  For character-
+             oriented or fixed-length interfaces, the number of
+             inbound transmission units that contained errors
+             preventing them from being deliverable to a higher-layer
+             protocol.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifInErrors";
+        }
+
+        leaf in-unknown-protos {
+          type yang:counter32;
+
+          description
+            "For packet-oriented interfaces, the number of packets
+             received via the interface that were discarded because
+             of an unknown or unsupported protocol.  For
+             character-oriented or fixed-length interfaces that
+             support protocol multiplexing, the number of
+             transmission units received via the interface that were
+             discarded because of an unknown or unsupported protocol.
+             For any interface that does not support protocol
+             multiplexing, this counter is not present.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifInUnknownProtos";
+        }
+
+        leaf out-octets {
+          type yang:counter64;
+          description
+            "The total number of octets transmitted out of the
+             interface, including framing characters.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifHCOutOctets";
+        }
+
+        leaf out-unicast-pkts {
+          type yang:counter64;
+          description
+            "The total number of packets that higher-level protocols
+             requested be transmitted and that were not addressed
+             to a multicast or broadcast address at this sub-layer,
+             including those that were discarded or not sent.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifHCOutUcastPkts";
+        }
+
+        leaf out-broadcast-pkts {
+          type yang:counter64;
+          description
+            "The total number of packets that higher-level protocols
+             requested be transmitted and that were addressed to a
+             broadcast address at this sub-layer, including those
+             that were discarded or not sent.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB -
+                       ifHCOutBroadcastPkts";
+        }
+
+        leaf out-multicast-pkts {
+          type yang:counter64;
+          description
+            "The total number of packets that higher-level protocols
+             requested be transmitted and that were addressed to a
+             multicast address at this sub-layer, including those
+             that were discarded or not sent.  For a MAC-layer
+             protocol, this includes both Group and Functional
+             addresses.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB -
+                       ifHCOutMulticastPkts";
+        }
+
+        leaf out-discards {
+          type yang:counter32;
+          description
+            "The number of outbound packets that were chosen to be
+             discarded even though no errors had been detected to
+             prevent their being transmitted.  One possible reason
+             for discarding such a packet could be to free up buffer
+             space.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifOutDiscards";
+        }
+
+        leaf out-errors {
+          type yang:counter32;
+          description
+            "For packet-oriented interfaces, the number of outbound
+             packets that could not be transmitted because of errors.
+             For character-oriented or fixed-length interfaces, the
+             number of outbound transmission units that could not be
+             transmitted because of errors.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifOutErrors";
+        }
+      }
+
+    }
+  }
+
+  /*
+   * Legacy typedefs
+   */
+
+  typedef interface-state-ref {
+    type leafref {
+      path "/if:interfaces-state/if:interface/if:name";
+    }
+    status deprecated;
+    description
+      "This type is used by data models that need to reference
+       the operationally present interfaces.";
+  }
+
+  /*
+   * Legacy operational state data nodes
+   */
+
+  container interfaces-state {
+    config false;
+    status deprecated;
+    description
+      "Data nodes for the operational state of interfaces.";
+
+    list interface {
+      key "name";
+      status deprecated;
+
+      description
+        "The list of interfaces on the device.
+
+         System-controlled interfaces created by the system are
+         always present in this list, whether or not they are
+         configured.";
+
+      leaf name {
+        type string;
+        status deprecated;
+        description
+          "The name of the interface.
+
+           A server implementation MAY map this leaf to the ifName
+           MIB object.  Such an implementation needs to use some
+           mechanism to handle the differences in size and characters
+           allowed between this leaf and ifName.  The definition of
+           such a mechanism is outside the scope of this document.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifName";
+      }
+
+      leaf type {
+        type identityref {
+          base interface-type;
+        }
+        mandatory true;
+        status deprecated;
+        description
+          "The type of the interface.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifType";
+      }
+
+      leaf admin-status {
+        if-feature if-mib;
+        type enumeration {
+          enum up {
+            value 1;
+            description
+              "Ready to pass packets.";
+          }
+          enum down {
+            value 2;
+            description
+              "Not ready to pass packets and not in some test mode.";
+          }
+          enum testing {
+            value 3;
+            description
+              "In some test mode.";
+          }
+        }
+        mandatory true;
+        status deprecated;
+        description
+          "The desired state of the interface.
+
+           This leaf has the same read semantics as ifAdminStatus.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifAdminStatus";
+      }
+
+      leaf oper-status {
+        type enumeration {
+          enum up {
+            value 1;
+            description
+              "Ready to pass packets.";
+          }
+          enum down {
+            value 2;
+            description
+              "The interface does not pass any packets.";
+          }
+          enum testing {
+            value 3;
+            description
+              "In some test mode.  No operational packets can
+               be passed.";
+          }
+          enum unknown {
+            value 4;
+            description
+              "Status cannot be determined for some reason.";
+          }
+          enum dormant {
+            value 5;
+            description
+              "Waiting for some external event.";
+          }
+          enum not-present {
+            value 6;
+            description
+              "Some component (typically hardware) is missing.";
+          }
+          enum lower-layer-down {
+            value 7;
+            description
+              "Down due to state of lower-layer interface(s).";
+          }
+        }
+        mandatory true;
+        status deprecated;
+        description
+          "The current operational state of the interface.
+
+           This leaf has the same semantics as ifOperStatus.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifOperStatus";
+      }
+
+      leaf last-change {
+        type yang:date-and-time;
+        status deprecated;
+        description
+          "The time the interface entered its current operational
+           state.  If the current state was entered prior to the
+           last re-initialization of the local network management
+           subsystem, then this node is not present.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifLastChange";
+      }
+
+      leaf if-index {
+        if-feature if-mib;
+        type int32 {
+          range "1..2147483647";
+        }
+        mandatory true;
+        status deprecated;
+        description
+          "The ifIndex value for the ifEntry represented by this
+           interface.";
+
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifIndex";
+      }
+
+      leaf phys-address {
+        type yang:phys-address;
+        status deprecated;
+        description
+          "The interface's address at its protocol sub-layer.  For
+           example, for an 802.x interface, this object normally
+           contains a Media Access Control (MAC) address.  The
+           interface's media-specific modules must define the bit
+           and byte ordering and the format of the value of this
+           object.  For interfaces that do not have such an address
+           (e.g., a serial line), this node is not present.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifPhysAddress";
+      }
+
+      leaf-list higher-layer-if {
+        type interface-state-ref;
+        status deprecated;
+        description
+          "A list of references to interfaces layered on top of this
+           interface.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifStackTable";
+      }
+
+      leaf-list lower-layer-if {
+        type interface-state-ref;
+        status deprecated;
+        description
+          "A list of references to interfaces layered underneath this
+           interface.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifStackTable";
+      }
+
+      leaf speed {
+        type yang:gauge64;
+        units "bits/second";
+        status deprecated;
+        description
+            "An estimate of the interface's current bandwidth in bits
+             per second.  For interfaces that do not vary in
+             bandwidth or for those where no accurate estimation can
+
+             be made, this node should contain the nominal bandwidth.
+             For interfaces that have no concept of bandwidth, this
+             node is not present.";
+        reference
+          "RFC 2863: The Interfaces Group MIB -
+                     ifSpeed, ifHighSpeed";
+      }
+
+      container statistics {
+        status deprecated;
+        description
+          "A collection of interface-related statistics objects.";
+
+        leaf discontinuity-time {
+          type yang:date-and-time;
+          mandatory true;
+          status deprecated;
+          description
+            "The time on the most recent occasion at which any one or
+             more of this interface's counters suffered a
+             discontinuity.  If no such discontinuities have occurred
+             since the last re-initialization of the local management
+             subsystem, then this node contains the time the local
+             management subsystem re-initialized itself.";
+        }
+
+        leaf in-octets {
+          type yang:counter64;
+          status deprecated;
+          description
+            "The total number of octets received on the interface,
+             including framing characters.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifHCInOctets";
+        }
+
+        leaf in-unicast-pkts {
+          type yang:counter64;
+          status deprecated;
+          description
+            "The number of packets, delivered by this sub-layer to a
+             higher (sub-)layer, that were not addressed to a
+             multicast or broadcast address at this sub-layer.
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifHCInUcastPkts";
+        }
+
+        leaf in-broadcast-pkts {
+          type yang:counter64;
+          status deprecated;
+          description
+            "The number of packets, delivered by this sub-layer to a
+             higher (sub-)layer, that were addressed to a broadcast
+             address at this sub-layer.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB -
+                       ifHCInBroadcastPkts";
+        }
+
+        leaf in-multicast-pkts {
+          type yang:counter64;
+          status deprecated;
+          description
+            "The number of packets, delivered by this sub-layer to a
+             higher (sub-)layer, that were addressed to a multicast
+             address at this sub-layer.  For a MAC-layer protocol,
+             this includes both Group and Functional addresses.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB -
+                       ifHCInMulticastPkts";
+        }
+
+        leaf in-discards {
+          type yang:counter32;
+          status deprecated;
+
+          description
+            "The number of inbound packets that were chosen to be
+             discarded even though no errors had been detected to
+             prevent their being deliverable to a higher-layer
+             protocol.  One possible reason for discarding such a
+             packet could be to free up buffer space.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifInDiscards";
+        }
+
+        leaf in-errors {
+          type yang:counter32;
+          status deprecated;
+          description
+            "For packet-oriented interfaces, the number of inbound
+             packets that contained errors preventing them from being
+             deliverable to a higher-layer protocol.  For character-
+             oriented or fixed-length interfaces, the number of
+             inbound transmission units that contained errors
+             preventing them from being deliverable to a higher-layer
+             protocol.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifInErrors";
+        }
+
+        leaf in-unknown-protos {
+          type yang:counter32;
+          status deprecated;
+          description
+            "For packet-oriented interfaces, the number of packets
+             received via the interface that were discarded because
+             of an unknown or unsupported protocol.  For
+             character-oriented or fixed-length interfaces that
+             support protocol multiplexing, the number of
+             transmission units received via the interface that were
+             discarded because of an unknown or unsupported protocol.
+             For any interface that does not support protocol
+             multiplexing, this counter is not present.
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifInUnknownProtos";
+        }
+
+        leaf out-octets {
+          type yang:counter64;
+          status deprecated;
+          description
+            "The total number of octets transmitted out of the
+             interface, including framing characters.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifHCOutOctets";
+        }
+
+        leaf out-unicast-pkts {
+          type yang:counter64;
+          status deprecated;
+          description
+            "The total number of packets that higher-level protocols
+             requested be transmitted and that were not addressed
+             to a multicast or broadcast address at this sub-layer,
+             including those that were discarded or not sent.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifHCOutUcastPkts";
+        }
+
+        leaf out-broadcast-pkts {
+          type yang:counter64;
+          status deprecated;
+
+          description
+            "The total number of packets that higher-level protocols
+             requested be transmitted and that were addressed to a
+             broadcast address at this sub-layer, including those
+             that were discarded or not sent.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB -
+                       ifHCOutBroadcastPkts";
+        }
+
+        leaf out-multicast-pkts {
+          type yang:counter64;
+          status deprecated;
+          description
+            "The total number of packets that higher-level protocols
+             requested be transmitted and that were addressed to a
+             multicast address at this sub-layer, including those
+             that were discarded or not sent.  For a MAC-layer
+             protocol, this includes both Group and Functional
+             addresses.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB -
+                       ifHCOutMulticastPkts";
+        }
+
+        leaf out-discards {
+          type yang:counter32;
+          status deprecated;
+          description
+            "The number of outbound packets that were chosen to be
+             discarded even though no errors had been detected to
+             prevent their being transmitted.  One possible reason
+             for discarding such a packet could be to free up buffer
+             space.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifOutDiscards";
+        }
+
+        leaf out-errors {
+          type yang:counter32;
+          status deprecated;
+          description
+            "For packet-oriented interfaces, the number of outbound
+             packets that could not be transmitted because of errors.
+             For character-oriented or fixed-length interfaces, the
+             number of outbound transmission units that could not be
+             transmitted because of errors.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifOutErrors";
+        }
+      }
+    }
+  }
+}
diff --git a/src/tests/tools/firewall_agent/docs/yang/ietf/ietf-yang-types.yang b/src/tests/tools/firewall_agent/docs/yang/ietf/ietf-yang-types.yang
new file mode 100644
index 000000000..ee58fa3ab
--- /dev/null
+++ b/src/tests/tools/firewall_agent/docs/yang/ietf/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/tests/tools/firewall_agent/docs/yang/openconfig-acl.tree b/src/tests/tools/firewall_agent/docs/yang/openconfig-acl.tree
new file mode 100644
index 000000000..74ce02934
--- /dev/null
+++ b/src/tests/tools/firewall_agent/docs/yang/openconfig-acl.tree
@@ -0,0 +1,337 @@
+module: openconfig-acl
+  +--rw acl
+     +--rw config
+     +--ro state
+     |  +--ro counter-capability?   identityref
+     +--rw acl-sets
+     |  +--rw acl-set* [name type]
+     |     +--rw name           -> ../config/name
+     |     +--rw type           -> ../config/type
+     |     +--rw config
+     |     |  +--rw name?          string
+     |     |  +--rw type?          identityref
+     |     |  +--rw description?   string
+     |     +--ro state
+     |     |  +--ro name?          string
+     |     |  +--ro type?          identityref
+     |     |  +--ro description?   string
+     |     +--rw acl-entries
+     |        +--rw acl-entry* [sequence-id]
+     |           +--rw sequence-id        -> ../config/sequence-id
+     |           +--rw config
+     |           |  +--rw sequence-id?   uint32
+     |           |  +--rw description?   string
+     |           +--ro state
+     |           |  +--ro sequence-id?       uint32
+     |           |  +--ro description?       string
+     |           |  +--ro matched-packets?   oc-yang:counter64
+     |           |  +--ro matched-octets?    oc-yang:counter64
+     |           +--rw l2
+     |           |  +--rw config
+     |           |  |  +--rw source-mac?             oc-yang:mac-address
+     |           |  |  +--rw source-mac-mask?        oc-yang:mac-address
+     |           |  |  +--rw destination-mac?        oc-yang:mac-address
+     |           |  |  +--rw destination-mac-mask?   oc-yang:mac-address
+     |           |  |  +--rw ethertype?              oc-pkt-match-types:ethertype-type
+     |           |  +--ro state
+     |           |     +--ro source-mac?             oc-yang:mac-address
+     |           |     +--ro source-mac-mask?        oc-yang:mac-address
+     |           |     +--ro destination-mac?        oc-yang:mac-address
+     |           |     +--ro destination-mac-mask?   oc-yang:mac-address
+     |           |     +--ro ethertype?              oc-pkt-match-types:ethertype-type
+     |           +--rw ipv4
+     |           |  +--rw config
+     |           |  |  +--rw source-address?                   oc-inet:ipv4-prefix
+     |           |  |  +--rw source-address-prefix-set?        -> /oc-sets:defined-sets/ipv4-prefix-sets/ipv4-prefix-set/name
+     |           |  |  +--rw destination-address?              oc-inet:ipv4-prefix
+     |           |  |  +--rw destination-address-prefix-set?   -> /oc-sets:defined-sets/ipv4-prefix-sets/ipv4-prefix-set/name
+     |           |  |  +--rw dscp?                             oc-inet:dscp
+     |           |  |  +--rw dscp-set*                         oc-inet:dscp
+     |           |  |  +--rw length?                           uint16
+     |           |  |  +--rw protocol?                         oc-pkt-match-types:ip-protocol-type
+     |           |  |  +--rw hop-limit?                        uint8
+     |           |  +--ro state
+     |           |  |  +--ro source-address?                   oc-inet:ipv4-prefix
+     |           |  |  +--ro source-address-prefix-set?        -> /oc-sets:defined-sets/ipv4-prefix-sets/ipv4-prefix-set/name
+     |           |  |  +--ro destination-address?              oc-inet:ipv4-prefix
+     |           |  |  +--ro destination-address-prefix-set?   -> /oc-sets:defined-sets/ipv4-prefix-sets/ipv4-prefix-set/name
+     |           |  |  +--ro dscp?                             oc-inet:dscp
+     |           |  |  +--ro dscp-set*                         oc-inet:dscp
+     |           |  |  +--ro length?                           uint16
+     |           |  |  +--ro protocol?                         oc-pkt-match-types:ip-protocol-type
+     |           |  |  +--ro hop-limit?                        uint8
+     |           |  +--rw icmpv4
+     |           |     +--rw config
+     |           |     |  +--rw type?   identityref
+     |           |     |  +--rw code?   identityref
+     |           |     +--ro state
+     |           |        +--ro type?   identityref
+     |           |        +--ro code?   identityref
+     |           +--rw mpls
+     |           |  +--rw config
+     |           |  |  +--rw traffic-class?       oc-mpls:mpls-tc
+     |           |  |  +--rw start-label-value?   oc-mpls:mpls-label
+     |           |  |  +--rw end-label-value?     oc-mpls:mpls-label
+     |           |  |  +--rw ttl-value?           uint8
+     |           |  +--ro state
+     |           |     +--ro traffic-class?       oc-mpls:mpls-tc
+     |           |     +--ro start-label-value?   oc-mpls:mpls-label
+     |           |     +--ro end-label-value?     oc-mpls:mpls-label
+     |           |     +--ro ttl-value?           uint8
+     |           +--rw ipv6
+     |           |  +--rw config
+     |           |  |  +--rw source-address?                   oc-inet:ipv6-prefix
+     |           |  |  +--rw source-address-prefix-set?        -> /oc-sets:defined-sets/ipv6-prefix-sets/ipv6-prefix-set/name
+     |           |  |  +--rw source-flow-label?                oc-inet:ipv6-flow-label
+     |           |  |  +--rw destination-address?              oc-inet:ipv6-prefix
+     |           |  |  +--rw destination-address-prefix-set?   -> /oc-sets:defined-sets/ipv6-prefix-sets/ipv6-prefix-set/name
+     |           |  |  +--rw destination-flow-label?           oc-inet:ipv6-flow-label
+     |           |  |  +--rw dscp?                             oc-inet:dscp
+     |           |  |  +--rw dscp-set*                         oc-inet:dscp
+     |           |  |  +--rw length?                           uint16
+     |           |  |  +--rw protocol?                         oc-pkt-match-types:ip-protocol-type
+     |           |  |  +--rw hop-limit?                        uint8
+     |           |  +--ro state
+     |           |  |  +--ro source-address?                   oc-inet:ipv6-prefix
+     |           |  |  +--ro source-address-prefix-set?        -> /oc-sets:defined-sets/ipv6-prefix-sets/ipv6-prefix-set/name
+     |           |  |  +--ro source-flow-label?                oc-inet:ipv6-flow-label
+     |           |  |  +--ro destination-address?              oc-inet:ipv6-prefix
+     |           |  |  +--ro destination-address-prefix-set?   -> /oc-sets:defined-sets/ipv6-prefix-sets/ipv6-prefix-set/name
+     |           |  |  +--ro destination-flow-label?           oc-inet:ipv6-flow-label
+     |           |  |  +--ro dscp?                             oc-inet:dscp
+     |           |  |  +--ro dscp-set*                         oc-inet:dscp
+     |           |  |  +--ro length?                           uint16
+     |           |  |  +--ro protocol?                         oc-pkt-match-types:ip-protocol-type
+     |           |  |  +--ro hop-limit?                        uint8
+     |           |  +--rw icmpv6
+     |           |     +--rw config
+     |           |     |  +--rw type?   identityref
+     |           |     |  +--rw code?   identityref
+     |           |     +--ro state
+     |           |        +--ro type?   identityref
+     |           |        +--ro code?   identityref
+     |           +--rw transport
+     |           |  +--rw config
+     |           |  |  +--rw source-port?                  oc-pkt-match-types:port-num-range
+     |           |  |  +--rw source-port-set?              -> /oc-sets:defined-sets/port-sets/port-set/name
+     |           |  |  +--rw destination-port?             oc-pkt-match-types:port-num-range
+     |           |  |  +--rw destination-port-set?         -> /oc-sets:defined-sets/port-sets/port-set/name
+     |           |  |  +--rw detail-mode?                  enumeration
+     |           |  |  +--rw explicit-detail-match-mode?   enumeration
+     |           |  |  +--rw explicit-tcp-flags*           identityref
+     |           |  |  +--rw builtin-detail?               enumeration
+     |           |  +--ro state
+     |           |     +--ro source-port?                  oc-pkt-match-types:port-num-range
+     |           |     +--ro source-port-set?              -> /oc-sets:defined-sets/port-sets/port-set/name
+     |           |     +--ro destination-port?             oc-pkt-match-types:port-num-range
+     |           |     +--ro destination-port-set?         -> /oc-sets:defined-sets/port-sets/port-set/name
+     |           |     +--ro detail-mode?                  enumeration
+     |           |     +--ro explicit-detail-match-mode?   enumeration
+     |           |     +--ro explicit-tcp-flags*           identityref
+     |           |     +--ro builtin-detail?               enumeration
+     |           +--rw input-interface
+     |           |  +--rw config
+     |           |  +--ro state
+     |           |  +--rw interface-ref
+     |           |     +--rw config
+     |           |     |  +--rw interface?      -> /oc-if:interfaces/interface/name
+     |           |     |  +--rw subinterface?   -> /oc-if:interfaces/interface[oc-if:name=current()/../interface]/subinterfaces/subinterface/index
+     |           |     +--ro state
+     |           |        +--ro interface?      -> /oc-if:interfaces/interface/name
+     |           |        +--ro subinterface?   -> /oc-if:interfaces/interface[oc-if:name=current()/../interface]/subinterfaces/subinterface/index
+     |           +--rw actions
+     |              +--rw config
+     |              |  +--rw forwarding-action    identityref
+     |              |  +--rw log-action?          identityref
+     |              +--ro state
+     |                 +--ro forwarding-action    identityref
+     |                 +--ro log-action?          identityref
+     +--rw interfaces
+        +--rw interface* [id]
+           +--rw id                  -> ../config/id
+           +--rw config
+           |  +--rw id?   oc-if:interface-id
+           +--ro state
+           |  +--ro id?   oc-if:interface-id
+           +--rw interface-ref
+           |  +--rw config
+           |  |  +--rw interface?      -> /oc-if:interfaces/interface/name
+           |  |  +--rw subinterface?   -> /oc-if:interfaces/interface[oc-if:name=current()/../interface]/subinterfaces/subinterface/index
+           |  +--ro state
+           |     +--ro interface?      -> /oc-if:interfaces/interface/name
+           |     +--ro subinterface?   -> /oc-if:interfaces/interface[oc-if:name=current()/../interface]/subinterfaces/subinterface/index
+           +--rw ingress-acl-sets
+           |  +--rw ingress-acl-set* [set-name type]
+           |     +--rw set-name       -> ../config/set-name
+           |     +--rw type           -> ../config/type
+           |     +--rw config
+           |     |  +--rw set-name?   -> ../../../../../../acl-sets/acl-set/config/name
+           |     |  +--rw type?       -> ../../../../../../acl-sets/acl-set[name=current()/../set-name]/config/type
+           |     +--ro state
+           |     |  +--ro set-name?   -> ../../../../../../acl-sets/acl-set/config/name
+           |     |  +--ro type?       -> ../../../../../../acl-sets/acl-set[name=current()/../set-name]/config/type
+           |     +--ro acl-entries
+           |        +--ro acl-entry* [sequence-id]
+           |           +--ro sequence-id    -> ../state/sequence-id
+           |           +--ro state
+           |              +--ro sequence-id?       -> /acl/acl-sets/acl-set[oc-acl:name=current()/../../../../set-name][oc-acl:type=current()/../../../../type]/oc-acl:acl-entries/acl-entry/sequence-id
+           |              +--ro matched-packets?   oc-yang:counter64
+           |              +--ro matched-octets?    oc-yang:counter64
+           +--rw egress-acl-sets
+              +--rw egress-acl-set* [set-name type]
+                 +--rw set-name       -> ../config/set-name
+                 +--rw type           -> ../config/type
+                 +--rw config
+                 |  +--rw set-name?   -> ../../../../../../acl-sets/acl-set/config/name
+                 |  +--rw type?       -> ../../../../../../acl-sets/acl-set[name=current()/../set-name]/config/type
+                 +--ro state
+                 |  +--ro set-name?   -> ../../../../../../acl-sets/acl-set/config/name
+                 |  +--ro type?       -> ../../../../../../acl-sets/acl-set[name=current()/../set-name]/config/type
+                 +--ro acl-entries
+                    +--ro acl-entry* [sequence-id]
+                       +--ro sequence-id    -> ../state/sequence-id
+                       +--ro state
+                          +--ro sequence-id?       -> /acl/acl-sets/acl-set[oc-acl:name=current()/../../../../set-name][oc-acl:type=current()/../../../../type]/oc-acl:acl-entries/acl-entry/sequence-id
+                          +--ro matched-packets?   oc-yang:counter64
+                          +--ro matched-octets?    oc-yang:counter64
+
+module: openconfig-defined-sets
+  +--rw defined-sets
+     +--rw ipv4-prefix-sets
+     |  +--rw ipv4-prefix-set* [name]
+     |     +--rw name      -> ../config/name
+     |     +--rw config
+     |     |  +--rw name?          string
+     |     |  +--rw description?   string
+     |     |  +--rw prefix*        oc-inet:ipv4-prefix
+     |     +--ro state
+     |        +--ro name?          string
+     |        +--ro description?   string
+     |        +--ro prefix*        oc-inet:ipv4-prefix
+     +--rw ipv6-prefix-sets
+     |  +--rw ipv6-prefix-set* [name]
+     |     +--rw name      -> ../config/name
+     |     +--rw config
+     |     |  +--rw name?          string
+     |     |  +--rw description?   string
+     |     |  +--rw prefix*        oc-inet:ipv6-prefix
+     |     +--ro state
+     |        +--ro name?          string
+     |        +--ro description?   string
+     |        +--ro prefix*        oc-inet:ipv6-prefix
+     +--rw port-sets
+        +--rw port-set* [name]
+           +--rw name      -> ../config/name
+           +--rw config
+           |  +--rw name?          string
+           |  +--rw description?   string
+           |  +--rw port*          oc-pkt-match-types:port-num-range
+           +--ro state
+              +--ro name?          string
+              +--ro description?   string
+              +--ro port*          oc-pkt-match-types:port-num-range
+
+module: openconfig-interfaces
+  +--rw interfaces
+     +--rw interface* [name]
+        +--rw name                  -> ../config/name
+        +--rw config
+        |  +--rw name?            string
+        |  +--rw type             identityref
+        |  +--rw mtu?             uint16
+        |  +--rw loopback-mode?   oc-opt-types:loopback-mode-type
+        |  +--rw description?     string
+        |  +--rw enabled?         boolean
+        +--ro state
+        |  +--ro name?            string
+        |  +--ro type             identityref
+        |  +--ro mtu?             uint16
+        |  +--ro loopback-mode?   oc-opt-types:loopback-mode-type
+        |  +--ro description?     string
+        |  +--ro enabled?         boolean
+        |  +--ro ifindex?         uint32
+        |  +--ro admin-status     enumeration
+        |  +--ro oper-status      enumeration
+        |  +--ro last-change?     oc-types:timeticks64
+        |  +--ro logical?         boolean
+        |  +--ro management?      boolean
+        |  +--ro cpu?             boolean
+        |  +--ro counters
+        |     +--ro in-octets?             oc-yang:counter64
+        |     +--ro in-pkts?               oc-yang:counter64
+        |     +--ro in-unicast-pkts?       oc-yang:counter64
+        |     +--ro in-broadcast-pkts?     oc-yang:counter64
+        |     +--ro in-multicast-pkts?     oc-yang:counter64
+        |     +--ro in-errors?             oc-yang:counter64
+        |     +--ro in-discards?           oc-yang:counter64
+        |     +--ro out-octets?            oc-yang:counter64
+        |     +--ro out-pkts?              oc-yang:counter64
+        |     +--ro out-unicast-pkts?      oc-yang:counter64
+        |     +--ro out-broadcast-pkts?    oc-yang:counter64
+        |     +--ro out-multicast-pkts?    oc-yang:counter64
+        |     +--ro out-discards?          oc-yang:counter64
+        |     +--ro out-errors?            oc-yang:counter64
+        |     +--ro last-clear?            oc-types:timeticks64
+        |     +--ro in-unknown-protos?     oc-yang:counter64
+        |     +--ro in-fcs-errors?         oc-yang:counter64
+        |     +--ro carrier-transitions?   oc-yang:counter64
+        |     +--ro resets?                oc-yang:counter64
+        +--rw hold-time
+        |  +--rw config
+        |  |  +--rw up?     uint32
+        |  |  +--rw down?   uint32
+        |  +--ro state
+        |     +--ro up?     uint32
+        |     +--ro down?   uint32
+        +--rw penalty-based-aied
+        |  +--rw config
+        |  |  +--rw max-suppress-time?    uint32
+        |  |  +--rw decay-half-life?      uint32
+        |  |  +--rw suppress-threshold?   uint32
+        |  |  +--rw reuse-threshold?      uint32
+        |  |  +--rw flap-penalty?         uint32
+        |  +--ro state
+        |     +--ro max-suppress-time?    uint32
+        |     +--ro decay-half-life?      uint32
+        |     +--ro suppress-threshold?   uint32
+        |     +--ro reuse-threshold?      uint32
+        |     +--ro flap-penalty?         uint32
+        +--rw subinterfaces
+           +--rw subinterface* [index]
+              +--rw index     -> ../config/index
+              +--rw config
+              |  +--rw index?         uint32
+              |  +--rw description?   string
+              |  +--rw enabled?       boolean
+              +--ro state
+                 +--ro index?          uint32
+                 +--ro description?    string
+                 +--ro enabled?        boolean
+                 +--ro name?           string
+                 +--ro ifindex?        uint32
+                 +--ro admin-status    enumeration
+                 +--ro oper-status     enumeration
+                 +--ro last-change?    oc-types:timeticks64
+                 +--ro logical?        boolean
+                 +--ro management?     boolean
+                 +--ro cpu?            boolean
+                 +--ro counters
+                    +--ro in-octets?             oc-yang:counter64
+                    +--ro in-pkts?               oc-yang:counter64
+                    +--ro in-unicast-pkts?       oc-yang:counter64
+                    +--ro in-broadcast-pkts?     oc-yang:counter64
+                    +--ro in-multicast-pkts?     oc-yang:counter64
+                    +--ro in-errors?             oc-yang:counter64
+                    +--ro in-discards?           oc-yang:counter64
+                    +--ro out-octets?            oc-yang:counter64
+                    +--ro out-pkts?              oc-yang:counter64
+                    +--ro out-unicast-pkts?      oc-yang:counter64
+                    +--ro out-broadcast-pkts?    oc-yang:counter64
+                    +--ro out-multicast-pkts?    oc-yang:counter64
+                    +--ro out-discards?          oc-yang:counter64
+                    +--ro out-errors?            oc-yang:counter64
+                    +--ro last-clear?            oc-types:timeticks64
+                    x--ro in-unknown-protos?     oc-yang:counter64
+                    x--ro in-fcs-errors?         oc-yang:counter64
+                    x--ro carrier-transitions?   oc-yang:counter64
+
diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig-components.tree b/src/tests/tools/firewall_agent/docs/yang/openconfig-components.tree
new file mode 100644
index 000000000..885a0947e
--- /dev/null
+++ b/src/tests/tools/firewall_agent/docs/yang/openconfig-components.tree
@@ -0,0 +1,188 @@
+module: openconfig-platform
+  +--rw components
+     +--rw component* [name]
+        +--rw name                  -> ../config/name
+        +--rw config
+        |  +--rw name?   string
+        +--ro state
+        |  +--ro name?                     string
+        |  +--ro type?                     union
+        |  +--ro id?                       string
+        |  +--ro location?                 string
+        |  +--ro description?              string
+        |  +--ro mfg-name?                 string
+        |  +--ro mfg-date?                 oc-yang:date
+        |  +--ro hardware-version?         string
+        |  +--ro firmware-version?         string
+        |  +--ro software-version?         string
+        |  +--ro serial-no?                string
+        |  +--ro part-no?                  string
+        |  +--ro model-name?               string
+        |  +--ro clei-code?                string
+        |  +--ro removable?                boolean
+        |  +--ro oper-status?              identityref
+        |  +--ro empty?                    boolean
+        |  +--ro parent?                   -> ../../../component/config/name
+        |  +--ro redundant-role?           oc-platform-types:component-redundant-role
+        |  +--ro last-switchover-reason
+        |  |  +--ro trigger?   component-redundant-role-switchover-reason-trigger
+        |  |  +--ro details?   string
+        |  +--ro last-switchover-time?     oc-types:timeticks64
+        |  +--ro last-reboot-reason?       identityref
+        |  +--ro last-reboot-time?         oc-types:timeticks64
+        |  +--ro switchover-ready?         boolean
+        |  +--ro base-mac-address?         oc-yang:mac-address
+        |  +--ro temperature
+        |  |  +--ro instant?           decimal64
+        |  |  +--ro avg?               decimal64
+        |  |  +--ro min?               decimal64
+        |  |  +--ro max?               decimal64
+        |  |  +--ro interval?          oc-types:stat-interval
+        |  |  +--ro min-time?          oc-types:timeticks64
+        |  |  +--ro max-time?          oc-types:timeticks64
+        |  |  +--ro alarm-status?      boolean
+        |  |  +--ro alarm-threshold?   uint32
+        |  |  +--ro alarm-severity?    identityref
+        |  +--ro memory
+        |  |  +--ro available?   uint64
+        |  |  +--ro utilized?    uint64
+        |  +--ro allocated-power?          uint32
+        |  +--ro used-power?               uint32
+        |  +--ro pcie
+        |     +--ro fatal-errors
+        |     |  +--ro total-errors?                   oc-yang:counter64
+        |     |  +--ro undefined-errors?               oc-yang:counter64
+        |     |  +--ro data-link-errors?               oc-yang:counter64
+        |     |  +--ro surprise-down-errors?           oc-yang:counter64
+        |     |  +--ro poisoned-tlp-errors?            oc-yang:counter64
+        |     |  +--ro flow-control-protocol-errors?   oc-yang:counter64
+        |     |  +--ro completion-timeout-errors?      oc-yang:counter64
+        |     |  +--ro completion-abort-errors?        oc-yang:counter64
+        |     |  +--ro unexpected-completion-errors?   oc-yang:counter64
+        |     |  +--ro receiver-overflow-errors?       oc-yang:counter64
+        |     |  +--ro malformed-tlp-errors?           oc-yang:counter64
+        |     |  +--ro ecrc-errors?                    oc-yang:counter64
+        |     |  +--ro unsupported-request-errors?     oc-yang:counter64
+        |     |  +--ro acs-violation-errors?           oc-yang:counter64
+        |     |  +--ro internal-errors?                oc-yang:counter64
+        |     |  +--ro blocked-tlp-errors?             oc-yang:counter64
+        |     |  +--ro atomic-op-blocked-errors?       oc-yang:counter64
+        |     |  +--ro tlp-prefix-blocked-errors?      oc-yang:counter64
+        |     +--ro non-fatal-errors
+        |     |  +--ro total-errors?                   oc-yang:counter64
+        |     |  +--ro undefined-errors?               oc-yang:counter64
+        |     |  +--ro data-link-errors?               oc-yang:counter64
+        |     |  +--ro surprise-down-errors?           oc-yang:counter64
+        |     |  +--ro poisoned-tlp-errors?            oc-yang:counter64
+        |     |  +--ro flow-control-protocol-errors?   oc-yang:counter64
+        |     |  +--ro completion-timeout-errors?      oc-yang:counter64
+        |     |  +--ro completion-abort-errors?        oc-yang:counter64
+        |     |  +--ro unexpected-completion-errors?   oc-yang:counter64
+        |     |  +--ro receiver-overflow-errors?       oc-yang:counter64
+        |     |  +--ro malformed-tlp-errors?           oc-yang:counter64
+        |     |  +--ro ecrc-errors?                    oc-yang:counter64
+        |     |  +--ro unsupported-request-errors?     oc-yang:counter64
+        |     |  +--ro acs-violation-errors?           oc-yang:counter64
+        |     |  +--ro internal-errors?                oc-yang:counter64
+        |     |  +--ro blocked-tlp-errors?             oc-yang:counter64
+        |     |  +--ro atomic-op-blocked-errors?       oc-yang:counter64
+        |     |  +--ro tlp-prefix-blocked-errors?      oc-yang:counter64
+        |     +--ro correctable-errors
+        |        +--ro total-errors?                oc-yang:counter64
+        |        +--ro receiver-errors?             oc-yang:counter64
+        |        +--ro bad-tlp-errors?              oc-yang:counter64
+        |        +--ro bad-dllp-errors?             oc-yang:counter64
+        |        +--ro relay-rollover-errors?       oc-yang:counter64
+        |        +--ro replay-timeout-errors?       oc-yang:counter64
+        |        +--ro advisory-non-fatal-errors?   oc-yang:counter64
+        |        +--ro internal-errors?             oc-yang:counter64
+        |        +--ro hdr-log-overflow-errors?     oc-yang:counter64
+        +--rw properties
+        |  +--rw property* [name]
+        |     +--rw name      -> ../config/name
+        |     +--rw config
+        |     |  +--rw name?    string
+        |     |  +--rw value?   union
+        |     +--ro state
+        |        +--ro name?           string
+        |        +--ro value?          union
+        |        +--ro configurable?   boolean
+        +--rw subcomponents
+        |  +--rw subcomponent* [name]
+        |     +--rw name      -> ../config/name
+        |     +--rw config
+        |     |  +--rw name?   -> ../../../../../component/config/name
+        |     +--ro state
+        |        +--ro name?   -> ../../../../../component/config/name
+        +--rw chassis
+        |  +--rw config
+        |  +--ro state
+        |  +--rw utilization
+        |     +--rw resources
+        |        +--rw resource* [name]
+        |           +--rw name      -> ../config/name
+        |           +--rw config
+        |           |  +--rw name?                         string
+        |           |  +--rw used-threshold-upper?         oc-types:percentage
+        |           |  +--rw used-threshold-upper-clear?   oc-types:percentage
+        |           +--ro state
+        |              +--ro name?                            string
+        |              +--ro used-threshold-upper?            oc-types:percentage
+        |              +--ro used-threshold-upper-clear?      oc-types:percentage
+        |              +--ro used?                            uint64
+        |              +--ro committed?                       uint64
+        |              +--ro free?                            uint64
+        |              +--ro max-limit?                       uint64
+        |              +--ro high-watermark?                  uint64
+        |              +--ro last-high-watermark?             oc-types:timeticks64
+        |              +--ro used-threshold-upper-exceeded?   boolean
+        +--rw port
+        |  +--rw config
+        |  +--ro state
+        +--rw power-supply
+        |  +--rw config
+        |  +--ro state
+        +--rw fan
+        |  +--rw config
+        |  +--ro state
+        +--rw fabric
+        |  +--rw config
+        |  +--ro state
+        +--rw storage
+        |  +--rw config
+        |  +--ro state
+        +--rw cpu
+        |  +--rw config
+        |  +--ro state
+        +--rw integrated-circuit
+        |  +--rw config
+        |  +--ro state
+        |  +--rw utilization
+        |     +--rw resources
+        |        +--rw resource* [name]
+        |           +--rw name      -> ../config/name
+        |           +--rw config
+        |           |  +--rw name?                         string
+        |           |  +--rw used-threshold-upper?         oc-types:percentage
+        |           |  +--rw used-threshold-upper-clear?   oc-types:percentage
+        |           +--ro state
+        |              +--ro name?                            string
+        |              +--ro used-threshold-upper?            oc-types:percentage
+        |              +--ro used-threshold-upper-clear?      oc-types:percentage
+        |              +--ro used?                            uint64
+        |              +--ro committed?                       uint64
+        |              +--ro free?                            uint64
+        |              +--ro max-limit?                       uint64
+        |              +--ro high-watermark?                  uint64
+        |              +--ro last-high-watermark?             oc-types:timeticks64
+        |              +--ro used-threshold-upper-exceeded?   boolean
+        +--rw backplane
+        |  +--rw config
+        |  +--ro state
+        +--rw software-module
+        |  +--rw config
+        |  +--ro state
+        +--rw controller-card
+           +--rw config
+           +--ro state
+
diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig-interfaces.tree b/src/tests/tools/firewall_agent/docs/yang/openconfig-interfaces.tree
new file mode 100644
index 000000000..0d780d63c
--- /dev/null
+++ b/src/tests/tools/firewall_agent/docs/yang/openconfig-interfaces.tree
@@ -0,0 +1,716 @@
+module: openconfig-interfaces
+  +--rw interfaces
+     +--rw interface* [name]
+        +--rw name                   -> ../config/name
+        +--rw config
+        |  +--rw name?            string
+        |  +--rw type             identityref
+        |  +--rw mtu?             uint16
+        |  +--rw loopback-mode?   oc-opt-types:loopback-mode-type
+        |  +--rw description?     string
+        |  +--rw enabled?         boolean
+        |  +--rw oc-vlan:tpid?    identityref
+        +--ro state
+        |  +--ro name?            string
+        |  +--ro type             identityref
+        |  +--ro mtu?             uint16
+        |  +--ro loopback-mode?   oc-opt-types:loopback-mode-type
+        |  +--ro description?     string
+        |  +--ro enabled?         boolean
+        |  +--ro ifindex?         uint32
+        |  +--ro admin-status     enumeration
+        |  +--ro oper-status      enumeration
+        |  +--ro last-change?     oc-types:timeticks64
+        |  +--ro logical?         boolean
+        |  +--ro management?      boolean
+        |  +--ro cpu?             boolean
+        |  +--ro counters
+        |  |  +--ro in-octets?             oc-yang:counter64
+        |  |  +--ro in-pkts?               oc-yang:counter64
+        |  |  +--ro in-unicast-pkts?       oc-yang:counter64
+        |  |  +--ro in-broadcast-pkts?     oc-yang:counter64
+        |  |  +--ro in-multicast-pkts?     oc-yang:counter64
+        |  |  +--ro in-errors?             oc-yang:counter64
+        |  |  +--ro in-discards?           oc-yang:counter64
+        |  |  +--ro out-octets?            oc-yang:counter64
+        |  |  +--ro out-pkts?              oc-yang:counter64
+        |  |  +--ro out-unicast-pkts?      oc-yang:counter64
+        |  |  +--ro out-broadcast-pkts?    oc-yang:counter64
+        |  |  +--ro out-multicast-pkts?    oc-yang:counter64
+        |  |  +--ro out-discards?          oc-yang:counter64
+        |  |  +--ro out-errors?            oc-yang:counter64
+        |  |  +--ro last-clear?            oc-types:timeticks64
+        |  |  +--ro in-unknown-protos?     oc-yang:counter64
+        |  |  +--ro in-fcs-errors?         oc-yang:counter64
+        |  |  +--ro carrier-transitions?   oc-yang:counter64
+        |  |  +--ro resets?                oc-yang:counter64
+        |  +--ro oc-vlan:tpid?    identityref
+        +--rw hold-time
+        |  +--rw config
+        |  |  +--rw up?     uint32
+        |  |  +--rw down?   uint32
+        |  +--ro state
+        |     +--ro up?     uint32
+        |     +--ro down?   uint32
+        +--rw penalty-based-aied
+        |  +--rw config
+        |  |  +--rw max-suppress-time?    uint32
+        |  |  +--rw decay-half-life?      uint32
+        |  |  +--rw suppress-threshold?   uint32
+        |  |  +--rw reuse-threshold?      uint32
+        |  |  +--rw flap-penalty?         uint32
+        |  +--ro state
+        |     +--ro max-suppress-time?    uint32
+        |     +--ro decay-half-life?      uint32
+        |     +--ro suppress-threshold?   uint32
+        |     +--ro reuse-threshold?      uint32
+        |     +--ro flap-penalty?         uint32
+        +--rw subinterfaces
+        |  +--rw subinterface* [index]
+        |     +--rw index           -> ../config/index
+        |     +--rw config
+        |     |  +--rw index?         uint32
+        |     |  +--rw description?   string
+        |     |  +--rw enabled?       boolean
+        |     +--ro state
+        |     |  +--ro index?          uint32
+        |     |  +--ro description?    string
+        |     |  +--ro enabled?        boolean
+        |     |  +--ro name?           string
+        |     |  +--ro ifindex?        uint32
+        |     |  +--ro admin-status    enumeration
+        |     |  +--ro oper-status     enumeration
+        |     |  +--ro last-change?    oc-types:timeticks64
+        |     |  +--ro logical?        boolean
+        |     |  +--ro management?     boolean
+        |     |  +--ro cpu?            boolean
+        |     |  +--ro counters
+        |     |     +--ro in-octets?             oc-yang:counter64
+        |     |     +--ro in-pkts?               oc-yang:counter64
+        |     |     +--ro in-unicast-pkts?       oc-yang:counter64
+        |     |     +--ro in-broadcast-pkts?     oc-yang:counter64
+        |     |     +--ro in-multicast-pkts?     oc-yang:counter64
+        |     |     +--ro in-errors?             oc-yang:counter64
+        |     |     +--ro in-discards?           oc-yang:counter64
+        |     |     +--ro out-octets?            oc-yang:counter64
+        |     |     +--ro out-pkts?              oc-yang:counter64
+        |     |     +--ro out-unicast-pkts?      oc-yang:counter64
+        |     |     +--ro out-broadcast-pkts?    oc-yang:counter64
+        |     |     +--ro out-multicast-pkts?    oc-yang:counter64
+        |     |     +--ro out-discards?          oc-yang:counter64
+        |     |     +--ro out-errors?            oc-yang:counter64
+        |     |     +--ro last-clear?            oc-types:timeticks64
+        |     |     x--ro in-unknown-protos?     oc-yang:counter64
+        |     |     x--ro in-fcs-errors?         oc-yang:counter64
+        |     |     x--ro carrier-transitions?   oc-yang:counter64
+        |     +--rw oc-vlan:vlan
+        |     |  +--rw oc-vlan:config
+        |     |  |  x--rw oc-vlan:vlan-id?   union
+        |     |  +--ro oc-vlan:state
+        |     |  |  x--ro oc-vlan:vlan-id?   union
+        |     |  +--rw oc-vlan:match
+        |     |  |  +--rw oc-vlan:single-tagged
+        |     |  |  |  +--rw oc-vlan:config
+        |     |  |  |  |  +--rw oc-vlan:vlan-id?   oc-vlan-types:vlan-id
+        |     |  |  |  +--ro oc-vlan:state
+        |     |  |  |     +--ro oc-vlan:vlan-id?   oc-vlan-types:vlan-id
+        |     |  |  +--rw oc-vlan:single-tagged-list
+        |     |  |  |  +--rw oc-vlan:config
+        |     |  |  |  |  +--rw oc-vlan:vlan-ids*   oc-vlan-types:vlan-id
+        |     |  |  |  +--ro oc-vlan:state
+        |     |  |  |     +--ro oc-vlan:vlan-ids*   oc-vlan-types:vlan-id
+        |     |  |  +--rw oc-vlan:single-tagged-range
+        |     |  |  |  +--rw oc-vlan:config
+        |     |  |  |  |  +--rw oc-vlan:low-vlan-id?    oc-vlan-types:vlan-id
+        |     |  |  |  |  +--rw oc-vlan:high-vlan-id?   oc-vlan-types:vlan-id
+        |     |  |  |  +--ro oc-vlan:state
+        |     |  |  |     +--ro oc-vlan:low-vlan-id?    oc-vlan-types:vlan-id
+        |     |  |  |     +--ro oc-vlan:high-vlan-id?   oc-vlan-types:vlan-id
+        |     |  |  +--rw oc-vlan:double-tagged
+        |     |  |  |  +--rw oc-vlan:config
+        |     |  |  |  |  +--rw oc-vlan:inner-vlan-id?   oc-vlan-types:vlan-id
+        |     |  |  |  |  +--rw oc-vlan:outer-vlan-id?   oc-vlan-types:vlan-id
+        |     |  |  |  +--ro oc-vlan:state
+        |     |  |  |     +--ro oc-vlan:inner-vlan-id?   oc-vlan-types:vlan-id
+        |     |  |  |     +--ro oc-vlan:outer-vlan-id?   oc-vlan-types:vlan-id
+        |     |  |  +--rw oc-vlan:double-tagged-inner-list
+        |     |  |  |  +--rw oc-vlan:config
+        |     |  |  |  |  +--rw oc-vlan:inner-vlan-ids*   oc-vlan-types:vlan-id
+        |     |  |  |  |  +--rw oc-vlan:outer-vlan-id?    oc-vlan-types:vlan-id
+        |     |  |  |  +--ro oc-vlan:state
+        |     |  |  |     +--ro oc-vlan:inner-vlan-ids*   oc-vlan-types:vlan-id
+        |     |  |  |     +--ro oc-vlan:outer-vlan-id?    oc-vlan-types:vlan-id
+        |     |  |  +--rw oc-vlan:double-tagged-outer-list
+        |     |  |  |  +--rw oc-vlan:config
+        |     |  |  |  |  +--rw oc-vlan:inner-vlan-id?    oc-vlan-types:vlan-id
+        |     |  |  |  |  +--rw oc-vlan:outer-vlan-ids*   oc-vlan-types:vlan-id
+        |     |  |  |  +--ro oc-vlan:state
+        |     |  |  |     +--ro oc-vlan:inner-vlan-id?    oc-vlan-types:vlan-id
+        |     |  |  |     +--ro oc-vlan:outer-vlan-ids*   oc-vlan-types:vlan-id
+        |     |  |  +--rw oc-vlan:double-tagged-inner-range
+        |     |  |  |  +--rw oc-vlan:config
+        |     |  |  |  |  +--rw oc-vlan:inner-low-vlan-id?    oc-vlan-types:vlan-id
+        |     |  |  |  |  +--rw oc-vlan:inner-high-vlan-id?   oc-vlan-types:vlan-id
+        |     |  |  |  |  +--rw oc-vlan:outer-vlan-id*        oc-vlan-types:vlan-id
+        |     |  |  |  +--ro oc-vlan:state
+        |     |  |  |     +--ro oc-vlan:inner-low-vlan-id?    oc-vlan-types:vlan-id
+        |     |  |  |     +--ro oc-vlan:inner-high-vlan-id?   oc-vlan-types:vlan-id
+        |     |  |  |     +--ro oc-vlan:outer-vlan-id*        oc-vlan-types:vlan-id
+        |     |  |  +--rw oc-vlan:double-tagged-outer-range
+        |     |  |  |  +--rw oc-vlan:config
+        |     |  |  |  |  +--rw oc-vlan:inner-vlan-id?        oc-vlan-types:vlan-id
+        |     |  |  |  |  +--rw oc-vlan:outer-low-vlan-id?    oc-vlan-types:vlan-id
+        |     |  |  |  |  +--rw oc-vlan:outer-high-vlan-id?   oc-vlan-types:vlan-id
+        |     |  |  |  +--ro oc-vlan:state
+        |     |  |  |     +--ro oc-vlan:inner-vlan-id?        oc-vlan-types:vlan-id
+        |     |  |  |     +--ro oc-vlan:outer-low-vlan-id?    oc-vlan-types:vlan-id
+        |     |  |  |     +--ro oc-vlan:outer-high-vlan-id?   oc-vlan-types:vlan-id
+        |     |  |  +--rw oc-vlan:double-tagged-inner-outer-range
+        |     |  |     +--rw oc-vlan:config
+        |     |  |     |  +--rw oc-vlan:inner-low-vlan-id?    oc-vlan-types:vlan-id
+        |     |  |     |  +--rw oc-vlan:inner-high-vlan-id?   oc-vlan-types:vlan-id
+        |     |  |     |  +--rw oc-vlan:outer-low-vlan-id?    oc-vlan-types:vlan-id
+        |     |  |     |  +--rw oc-vlan:outer-high-vlan-id?   oc-vlan-types:vlan-id
+        |     |  |     +--ro oc-vlan:state
+        |     |  |        +--ro oc-vlan:inner-low-vlan-id?    oc-vlan-types:vlan-id
+        |     |  |        +--ro oc-vlan:inner-high-vlan-id?   oc-vlan-types:vlan-id
+        |     |  |        +--ro oc-vlan:outer-low-vlan-id?    oc-vlan-types:vlan-id
+        |     |  |        +--ro oc-vlan:outer-high-vlan-id?   oc-vlan-types:vlan-id
+        |     |  +--rw oc-vlan:ingress-mapping
+        |     |  |  +--rw oc-vlan:config
+        |     |  |  |  +--rw oc-vlan:vlan-stack-action?   oc-vlan-types:vlan-stack-action
+        |     |  |  |  +--rw oc-vlan:vlan-id?             oc-vlan-types:vlan-id
+        |     |  |  |  +--rw oc-vlan:tpid?                identityref
+        |     |  |  +--ro oc-vlan:state
+        |     |  |     +--ro oc-vlan:vlan-stack-action?   oc-vlan-types:vlan-stack-action
+        |     |  |     +--ro oc-vlan:vlan-id?             oc-vlan-types:vlan-id
+        |     |  |     +--ro oc-vlan:tpid?                identityref
+        |     |  +--rw oc-vlan:egress-mapping
+        |     |     +--rw oc-vlan:config
+        |     |     |  +--rw oc-vlan:vlan-stack-action?   oc-vlan-types:vlan-stack-action
+        |     |     |  +--rw oc-vlan:vlan-id?             oc-vlan-types:vlan-id
+        |     |     |  +--rw oc-vlan:tpid?                identityref
+        |     |     +--ro oc-vlan:state
+        |     |        +--ro oc-vlan:vlan-stack-action?   oc-vlan-types:vlan-stack-action
+        |     |        +--ro oc-vlan:vlan-id?             oc-vlan-types:vlan-id
+        |     |        +--ro oc-vlan:tpid?                identityref
+        |     +--rw oc-ip:ipv4
+        |     |  +--rw oc-ip:addresses
+        |     |  |  +--rw oc-ip:address* [ip]
+        |     |  |     +--rw oc-ip:ip        -> ../config/ip
+        |     |  |     +--rw oc-ip:config
+        |     |  |     |  +--rw oc-ip:ip?              oc-inet:ipv4-address
+        |     |  |     |  +--rw oc-ip:prefix-length?   uint8
+        |     |  |     |  +--rw oc-ip:type?            ipv4-address-type
+        |     |  |     +--ro oc-ip:state
+        |     |  |     |  +--ro oc-ip:ip?              oc-inet:ipv4-address
+        |     |  |     |  +--ro oc-ip:prefix-length?   uint8
+        |     |  |     |  +--ro oc-ip:type?            ipv4-address-type
+        |     |  |     |  +--ro oc-ip:origin?          ip-address-origin
+        |     |  |     +--rw oc-ip:vrrp
+        |     |  |        +--rw oc-ip:vrrp-group* [virtual-router-id]
+        |     |  |           +--rw oc-ip:virtual-router-id     -> ../config/virtual-router-id
+        |     |  |           +--rw oc-ip:config
+        |     |  |           |  +--rw oc-ip:virtual-router-id?        uint8
+        |     |  |           |  +--rw oc-ip:virtual-address*          oc-inet:ip-address
+        |     |  |           |  +--rw oc-ip:priority?                 uint8
+        |     |  |           |  +--rw oc-ip:preempt?                  boolean
+        |     |  |           |  +--rw oc-ip:preempt-delay?            uint16
+        |     |  |           |  +--rw oc-ip:accept-mode?              boolean
+        |     |  |           |  +--rw oc-ip:advertisement-interval?   uint16
+        |     |  |           +--ro oc-ip:state
+        |     |  |           |  +--ro oc-ip:virtual-router-id?        uint8
+        |     |  |           |  +--ro oc-ip:virtual-address*          oc-inet:ip-address
+        |     |  |           |  +--ro oc-ip:priority?                 uint8
+        |     |  |           |  +--ro oc-ip:preempt?                  boolean
+        |     |  |           |  +--ro oc-ip:preempt-delay?            uint16
+        |     |  |           |  +--ro oc-ip:accept-mode?              boolean
+        |     |  |           |  +--ro oc-ip:advertisement-interval?   uint16
+        |     |  |           |  +--ro oc-ip:current-priority?         uint8
+        |     |  |           +--rw oc-ip:interface-tracking
+        |     |  |              +--rw oc-ip:config
+        |     |  |              |  +--rw oc-ip:track-interface*      -> /oc-if:interfaces/interface/name
+        |     |  |              |  +--rw oc-ip:priority-decrement?   uint8
+        |     |  |              +--ro oc-ip:state
+        |     |  |                 +--ro oc-ip:track-interface*      -> /oc-if:interfaces/interface/name
+        |     |  |                 +--ro oc-ip:priority-decrement?   uint8
+        |     |  +--rw oc-ip:proxy-arp
+        |     |  |  +--rw oc-ip:config
+        |     |  |  |  +--rw oc-ip:mode?   enumeration
+        |     |  |  +--ro oc-ip:state
+        |     |  |     +--ro oc-ip:mode?   enumeration
+        |     |  +--rw oc-ip:neighbors
+        |     |  |  +--rw oc-ip:neighbor* [ip]
+        |     |  |     +--rw oc-ip:ip        -> ../config/ip
+        |     |  |     +--rw oc-ip:config
+        |     |  |     |  +--rw oc-ip:ip?                   oc-inet:ipv4-address
+        |     |  |     |  +--rw oc-ip:link-layer-address    oc-yang:phys-address
+        |     |  |     +--ro oc-ip:state
+        |     |  |        +--ro oc-ip:ip?                   oc-inet:ipv4-address
+        |     |  |        +--ro oc-ip:link-layer-address    oc-yang:phys-address
+        |     |  |        +--ro oc-ip:origin?               neighbor-origin
+        |     |  +--rw oc-ip:unnumbered
+        |     |  |  +--rw oc-ip:config
+        |     |  |  |  +--rw oc-ip:enabled?   boolean
+        |     |  |  +--ro oc-ip:state
+        |     |  |  |  +--ro oc-ip:enabled?   boolean
+        |     |  |  +--rw oc-ip:interface-ref
+        |     |  |     +--rw oc-ip:config
+        |     |  |     |  +--rw oc-ip:interface?      -> /oc-if:interfaces/interface/name
+        |     |  |     |  +--rw oc-ip:subinterface?   -> /oc-if:interfaces/interface[oc-if:name=current()/../interface]/subinterfaces/subinterface/index
+        |     |  |     +--ro oc-ip:state
+        |     |  |        +--ro oc-ip:interface?      -> /oc-if:interfaces/interface/name
+        |     |  |        +--ro oc-ip:subinterface?   -> /oc-if:interfaces/interface[oc-if:name=current()/../interface]/subinterfaces/subinterface/index
+        |     |  +--rw oc-ip:config
+        |     |  |  +--rw oc-ip:enabled?       boolean
+        |     |  |  +--rw oc-ip:mtu?           uint16
+        |     |  |  +--rw oc-ip:dhcp-client?   boolean
+        |     |  +--ro oc-ip:state
+        |     |     +--ro oc-ip:enabled?       boolean
+        |     |     +--ro oc-ip:mtu?           uint16
+        |     |     +--ro oc-ip:dhcp-client?   boolean
+        |     |     +--ro oc-ip:counters
+        |     |        +--ro oc-ip:in-pkts?                oc-yang:counter64
+        |     |        +--ro oc-ip:in-octets?              oc-yang:counter64
+        |     |        +--ro oc-ip:in-multicast-pkts?      oc-yang:counter64
+        |     |        +--ro oc-ip:in-multicast-octets?    oc-yang:counter64
+        |     |        +--ro oc-ip:in-error-pkts?          oc-yang:counter64
+        |     |        +--ro oc-ip:in-forwarded-pkts?      oc-yang:counter64
+        |     |        +--ro oc-ip:in-forwarded-octets?    oc-yang:counter64
+        |     |        +--ro oc-ip:in-discarded-pkts?      oc-yang:counter64
+        |     |        +--ro oc-ip:out-pkts?               oc-yang:counter64
+        |     |        +--ro oc-ip:out-octets?             oc-yang:counter64
+        |     |        +--ro oc-ip:out-multicast-pkts?     oc-yang:counter64
+        |     |        +--ro oc-ip:out-multicast-octets?   oc-yang:counter64
+        |     |        +--ro oc-ip:out-error-pkts?         oc-yang:counter64
+        |     |        +--ro oc-ip:out-forwarded-pkts?     oc-yang:counter64
+        |     |        +--ro oc-ip:out-forwarded-octets?   oc-yang:counter64
+        |     |        +--ro oc-ip:out-discarded-pkts?     oc-yang:counter64
+        |     +--rw oc-ip:ipv6
+        |        +--rw oc-ip:addresses
+        |        |  +--rw oc-ip:address* [ip]
+        |        |     +--rw oc-ip:ip        -> ../config/ip
+        |        |     +--rw oc-ip:config
+        |        |     |  +--rw oc-ip:ip?              oc-inet:ipv6-address
+        |        |     |  +--rw oc-ip:prefix-length    uint8
+        |        |     |  +--rw oc-ip:type?            oc-inet:ipv6-address-type
+        |        |     +--ro oc-ip:state
+        |        |     |  +--ro oc-ip:ip?              oc-inet:ipv6-address
+        |        |     |  +--ro oc-ip:prefix-length    uint8
+        |        |     |  +--ro oc-ip:type?            oc-inet:ipv6-address-type
+        |        |     |  +--ro oc-ip:origin?          ip-address-origin
+        |        |     |  +--ro oc-ip:status?          enumeration
+        |        |     +--rw oc-ip:vrrp
+        |        |        +--rw oc-ip:vrrp-group* [virtual-router-id]
+        |        |           +--rw oc-ip:virtual-router-id     -> ../config/virtual-router-id
+        |        |           +--rw oc-ip:config
+        |        |           |  +--rw oc-ip:virtual-router-id?        uint8
+        |        |           |  +--rw oc-ip:virtual-address*          oc-inet:ip-address
+        |        |           |  +--rw oc-ip:priority?                 uint8
+        |        |           |  +--rw oc-ip:preempt?                  boolean
+        |        |           |  +--rw oc-ip:preempt-delay?            uint16
+        |        |           |  +--rw oc-ip:accept-mode?              boolean
+        |        |           |  +--rw oc-ip:advertisement-interval?   uint16
+        |        |           |  +--rw oc-ip:virtual-link-local?       oc-inet:ip-address
+        |        |           +--ro oc-ip:state
+        |        |           |  +--ro oc-ip:virtual-router-id?        uint8
+        |        |           |  +--ro oc-ip:virtual-address*          oc-inet:ip-address
+        |        |           |  +--ro oc-ip:priority?                 uint8
+        |        |           |  +--ro oc-ip:preempt?                  boolean
+        |        |           |  +--ro oc-ip:preempt-delay?            uint16
+        |        |           |  +--ro oc-ip:accept-mode?              boolean
+        |        |           |  +--ro oc-ip:advertisement-interval?   uint16
+        |        |           |  +--ro oc-ip:current-priority?         uint8
+        |        |           |  +--ro oc-ip:virtual-link-local?       oc-inet:ip-address
+        |        |           +--rw oc-ip:interface-tracking
+        |        |              +--rw oc-ip:config
+        |        |              |  +--rw oc-ip:track-interface*      -> /oc-if:interfaces/interface/name
+        |        |              |  +--rw oc-ip:priority-decrement?   uint8
+        |        |              +--ro oc-ip:state
+        |        |                 +--ro oc-ip:track-interface*      -> /oc-if:interfaces/interface/name
+        |        |                 +--ro oc-ip:priority-decrement?   uint8
+        |        +--rw oc-ip:router-advertisement
+        |        |  +--rw oc-ip:config
+        |        |  |  +--rw oc-ip:enable?         boolean
+        |        |  |  +--rw oc-ip:interval?       uint32
+        |        |  |  +--rw oc-ip:lifetime?       uint32
+        |        |  |  x--rw oc-ip:suppress?       boolean
+        |        |  |  +--rw oc-ip:mode?           enumeration
+        |        |  |  +--rw oc-ip:managed?        boolean
+        |        |  |  +--rw oc-ip:other-config?   boolean
+        |        |  +--ro oc-ip:state
+        |        |  |  +--ro oc-ip:enable?         boolean
+        |        |  |  +--ro oc-ip:interval?       uint32
+        |        |  |  +--ro oc-ip:lifetime?       uint32
+        |        |  |  x--ro oc-ip:suppress?       boolean
+        |        |  |  +--ro oc-ip:mode?           enumeration
+        |        |  |  +--ro oc-ip:managed?        boolean
+        |        |  |  +--ro oc-ip:other-config?   boolean
+        |        |  +--rw oc-ip:prefixes
+        |        |     +--rw oc-ip:prefix* [prefix]
+        |        |        +--rw oc-ip:prefix    -> ../config/prefix
+        |        |        +--rw oc-ip:config
+        |        |        |  +--rw oc-ip:prefix?                      oc-inet:ipv6-prefix
+        |        |        |  +--rw oc-ip:valid-lifetime?              uint32
+        |        |        |  +--rw oc-ip:preferred-lifetime?          uint32
+        |        |        |  +--rw oc-ip:disable-advertisement?       boolean
+        |        |        |  +--rw oc-ip:disable-autoconfiguration?   boolean
+        |        |        |  +--rw oc-ip:enable-onlink?               boolean
+        |        |        +--ro oc-ip:state
+        |        |           +--ro oc-ip:prefix?                      oc-inet:ipv6-prefix
+        |        |           +--ro oc-ip:valid-lifetime?              uint32
+        |        |           +--ro oc-ip:preferred-lifetime?          uint32
+        |        |           +--ro oc-ip:disable-advertisement?       boolean
+        |        |           +--ro oc-ip:disable-autoconfiguration?   boolean
+        |        |           +--ro oc-ip:enable-onlink?               boolean
+        |        +--rw oc-ip:neighbors
+        |        |  +--rw oc-ip:neighbor* [ip]
+        |        |     +--rw oc-ip:ip        -> ../config/ip
+        |        |     +--rw oc-ip:config
+        |        |     |  +--rw oc-ip:ip?                   oc-inet:ipv6-address
+        |        |     |  +--rw oc-ip:link-layer-address    oc-yang:phys-address
+        |        |     +--ro oc-ip:state
+        |        |        +--ro oc-ip:ip?                   oc-inet:ipv6-address
+        |        |        +--ro oc-ip:link-layer-address    oc-yang:phys-address
+        |        |        +--ro oc-ip:origin?               neighbor-origin
+        |        |        +--ro oc-ip:is-router?            boolean
+        |        |        +--ro oc-ip:neighbor-state?       enumeration
+        |        +--rw oc-ip:unnumbered
+        |        |  +--rw oc-ip:config
+        |        |  |  +--rw oc-ip:enabled?   boolean
+        |        |  +--ro oc-ip:state
+        |        |  |  +--ro oc-ip:enabled?   boolean
+        |        |  +--rw oc-ip:interface-ref
+        |        |     +--rw oc-ip:config
+        |        |     |  +--rw oc-ip:interface?      -> /oc-if:interfaces/interface/name
+        |        |     |  +--rw oc-ip:subinterface?   -> /oc-if:interfaces/interface[oc-if:name=current()/../interface]/subinterfaces/subinterface/index
+        |        |     +--ro oc-ip:state
+        |        |        +--ro oc-ip:interface?      -> /oc-if:interfaces/interface/name
+        |        |        +--ro oc-ip:subinterface?   -> /oc-if:interfaces/interface[oc-if:name=current()/../interface]/subinterfaces/subinterface/index
+        |        +--rw oc-ip:config
+        |        |  +--rw oc-ip:enabled?                     boolean
+        |        |  +--rw oc-ip:mtu?                         uint32
+        |        |  +--rw oc-ip:dup-addr-detect-transmits?   uint32
+        |        |  +--rw oc-ip:dhcp-client?                 boolean
+        |        +--ro oc-ip:state
+        |           +--ro oc-ip:enabled?                     boolean
+        |           +--ro oc-ip:mtu?                         uint32
+        |           +--ro oc-ip:dup-addr-detect-transmits?   uint32
+        |           +--ro oc-ip:dhcp-client?                 boolean
+        |           +--ro oc-ip:counters
+        |              +--ro oc-ip:in-pkts?                oc-yang:counter64
+        |              +--ro oc-ip:in-octets?              oc-yang:counter64
+        |              +--ro oc-ip:in-multicast-pkts?      oc-yang:counter64
+        |              +--ro oc-ip:in-multicast-octets?    oc-yang:counter64
+        |              +--ro oc-ip:in-error-pkts?          oc-yang:counter64
+        |              +--ro oc-ip:in-forwarded-pkts?      oc-yang:counter64
+        |              +--ro oc-ip:in-forwarded-octets?    oc-yang:counter64
+        |              +--ro oc-ip:in-discarded-pkts?      oc-yang:counter64
+        |              +--ro oc-ip:out-pkts?               oc-yang:counter64
+        |              +--ro oc-ip:out-octets?             oc-yang:counter64
+        |              +--ro oc-ip:out-multicast-pkts?     oc-yang:counter64
+        |              +--ro oc-ip:out-multicast-octets?   oc-yang:counter64
+        |              +--ro oc-ip:out-error-pkts?         oc-yang:counter64
+        |              +--ro oc-ip:out-forwarded-pkts?     oc-yang:counter64
+        |              +--ro oc-ip:out-forwarded-octets?   oc-yang:counter64
+        |              +--ro oc-ip:out-discarded-pkts?     oc-yang:counter64
+        +--rw oc-eth:ethernet
+        |  +--rw oc-eth:config
+        |  |  +--rw oc-eth:mac-address?                oc-yang:mac-address
+        |  |  +--rw oc-eth:auto-negotiate?             boolean
+        |  |  +--rw oc-eth:standalone-link-training?   boolean
+        |  |  +--rw oc-eth:duplex-mode?                enumeration
+        |  |  +--rw oc-eth:port-speed?                 identityref
+        |  |  +--rw oc-eth:enable-flow-control?        boolean
+        |  |  +--rw oc-eth:fec-mode?                   identityref
+        |  |  +--rw oc-lag:aggregate-id?               -> /oc-if:interfaces/interface/name
+        |  +--ro oc-eth:state
+        |  |  +--ro oc-eth:mac-address?                oc-yang:mac-address
+        |  |  +--ro oc-eth:auto-negotiate?             boolean
+        |  |  +--ro oc-eth:standalone-link-training?   boolean
+        |  |  +--ro oc-eth:duplex-mode?                enumeration
+        |  |  +--ro oc-eth:port-speed?                 identityref
+        |  |  +--ro oc-eth:enable-flow-control?        boolean
+        |  |  +--ro oc-eth:fec-mode?                   identityref
+        |  |  +--ro oc-eth:hw-mac-address?             oc-yang:mac-address
+        |  |  +--ro oc-eth:negotiated-duplex-mode?     enumeration
+        |  |  +--ro oc-eth:negotiated-port-speed?      identityref
+        |  |  +--ro oc-eth:counters
+        |  |  |  +--ro oc-eth:in-mac-control-frames?    oc-yang:counter64
+        |  |  |  +--ro oc-eth:in-mac-pause-frames?      oc-yang:counter64
+        |  |  |  +--ro oc-eth:in-oversize-frames?       oc-yang:counter64
+        |  |  |  +--ro oc-eth:in-undersize-frames?      oc-yang:counter64
+        |  |  |  +--ro oc-eth:in-jabber-frames?         oc-yang:counter64
+        |  |  |  +--ro oc-eth:in-fragment-frames?       oc-yang:counter64
+        |  |  |  +--ro oc-eth:in-8021q-frames?          oc-yang:counter64
+        |  |  |  +--ro oc-eth:in-crc-errors?            oc-yang:counter64
+        |  |  |  +--ro oc-eth:in-block-errors?          oc-yang:counter64
+        |  |  |  +--ro oc-eth:in-carrier-errors?        oc-yang:counter64
+        |  |  |  +--ro oc-eth:in-interrupted-tx?        oc-yang:counter64
+        |  |  |  +--ro oc-eth:in-late-collision?        oc-yang:counter64
+        |  |  |  +--ro oc-eth:in-mac-errors-rx?         oc-yang:counter64
+        |  |  |  +--ro oc-eth:in-single-collision?      oc-yang:counter64
+        |  |  |  +--ro oc-eth:in-symbol-error?          oc-yang:counter64
+        |  |  |  +--ro oc-eth:in-maxsize-exceeded?      oc-yang:counter64
+        |  |  |  +--ro oc-eth:out-mac-control-frames?   oc-yang:counter64
+        |  |  |  +--ro oc-eth:out-mac-pause-frames?     oc-yang:counter64
+        |  |  |  +--ro oc-eth:out-8021q-frames?         oc-yang:counter64
+        |  |  |  +--ro oc-eth:out-mac-errors-tx?        oc-yang:counter64
+        |  |  +--ro oc-lag:aggregate-id?               -> /oc-if:interfaces/interface/name
+        |  +--rw oc-vlan:switched-vlan
+        |     +--rw oc-vlan:config
+        |     |  +--rw oc-vlan:interface-mode?   oc-vlan-types:vlan-mode-type
+        |     |  +--rw oc-vlan:native-vlan?      oc-vlan-types:vlan-id
+        |     |  +--rw oc-vlan:access-vlan?      oc-vlan-types:vlan-id
+        |     |  +--rw oc-vlan:trunk-vlans*      union
+        |     +--ro oc-vlan:state
+        |        +--ro oc-vlan:interface-mode?   oc-vlan-types:vlan-mode-type
+        |        +--ro oc-vlan:native-vlan?      oc-vlan-types:vlan-id
+        |        +--ro oc-vlan:access-vlan?      oc-vlan-types:vlan-id
+        |        +--ro oc-vlan:trunk-vlans*      union
+        +--rw oc-lag:aggregation
+        |  +--rw oc-lag:config
+        |  |  +--rw oc-lag:lag-type?    aggregation-type
+        |  |  +--rw oc-lag:min-links?   uint16
+        |  +--ro oc-lag:state
+        |  |  +--ro oc-lag:lag-type?    aggregation-type
+        |  |  +--ro oc-lag:min-links?   uint16
+        |  |  +--ro oc-lag:lag-speed?   uint32
+        |  |  +--ro oc-lag:member*      oc-if:base-interface-ref
+        |  +--rw oc-vlan:switched-vlan
+        |     +--rw oc-vlan:config
+        |     |  +--rw oc-vlan:interface-mode?   oc-vlan-types:vlan-mode-type
+        |     |  +--rw oc-vlan:native-vlan?      oc-vlan-types:vlan-id
+        |     |  +--rw oc-vlan:access-vlan?      oc-vlan-types:vlan-id
+        |     |  +--rw oc-vlan:trunk-vlans*      union
+        |     +--ro oc-vlan:state
+        |        +--ro oc-vlan:interface-mode?   oc-vlan-types:vlan-mode-type
+        |        +--ro oc-vlan:native-vlan?      oc-vlan-types:vlan-id
+        |        +--ro oc-vlan:access-vlan?      oc-vlan-types:vlan-id
+        |        +--ro oc-vlan:trunk-vlans*      union
+        +--rw oc-vlan:routed-vlan
+           +--rw oc-vlan:config
+           |  +--rw oc-vlan:vlan?   union
+           +--ro oc-vlan:state
+           |  +--ro oc-vlan:vlan?   union
+           +--rw oc-ip:ipv4
+           |  +--rw oc-ip:addresses
+           |  |  +--rw oc-ip:address* [ip]
+           |  |     +--rw oc-ip:ip        -> ../config/ip
+           |  |     +--rw oc-ip:config
+           |  |     |  +--rw oc-ip:ip?              oc-inet:ipv4-address
+           |  |     |  +--rw oc-ip:prefix-length?   uint8
+           |  |     |  +--rw oc-ip:type?            ipv4-address-type
+           |  |     +--ro oc-ip:state
+           |  |     |  +--ro oc-ip:ip?              oc-inet:ipv4-address
+           |  |     |  +--ro oc-ip:prefix-length?   uint8
+           |  |     |  +--ro oc-ip:type?            ipv4-address-type
+           |  |     |  +--ro oc-ip:origin?          ip-address-origin
+           |  |     +--rw oc-ip:vrrp
+           |  |        +--rw oc-ip:vrrp-group* [virtual-router-id]
+           |  |           +--rw oc-ip:virtual-router-id     -> ../config/virtual-router-id
+           |  |           +--rw oc-ip:config
+           |  |           |  +--rw oc-ip:virtual-router-id?        uint8
+           |  |           |  +--rw oc-ip:virtual-address*          oc-inet:ip-address
+           |  |           |  +--rw oc-ip:priority?                 uint8
+           |  |           |  +--rw oc-ip:preempt?                  boolean
+           |  |           |  +--rw oc-ip:preempt-delay?            uint16
+           |  |           |  +--rw oc-ip:accept-mode?              boolean
+           |  |           |  +--rw oc-ip:advertisement-interval?   uint16
+           |  |           +--ro oc-ip:state
+           |  |           |  +--ro oc-ip:virtual-router-id?        uint8
+           |  |           |  +--ro oc-ip:virtual-address*          oc-inet:ip-address
+           |  |           |  +--ro oc-ip:priority?                 uint8
+           |  |           |  +--ro oc-ip:preempt?                  boolean
+           |  |           |  +--ro oc-ip:preempt-delay?            uint16
+           |  |           |  +--ro oc-ip:accept-mode?              boolean
+           |  |           |  +--ro oc-ip:advertisement-interval?   uint16
+           |  |           |  +--ro oc-ip:current-priority?         uint8
+           |  |           +--rw oc-ip:interface-tracking
+           |  |              +--rw oc-ip:config
+           |  |              |  +--rw oc-ip:track-interface*      -> /oc-if:interfaces/interface/name
+           |  |              |  +--rw oc-ip:priority-decrement?   uint8
+           |  |              +--ro oc-ip:state
+           |  |                 +--ro oc-ip:track-interface*      -> /oc-if:interfaces/interface/name
+           |  |                 +--ro oc-ip:priority-decrement?   uint8
+           |  +--rw oc-ip:proxy-arp
+           |  |  +--rw oc-ip:config
+           |  |  |  +--rw oc-ip:mode?   enumeration
+           |  |  +--ro oc-ip:state
+           |  |     +--ro oc-ip:mode?   enumeration
+           |  +--rw oc-ip:neighbors
+           |  |  +--rw oc-ip:neighbor* [ip]
+           |  |     +--rw oc-ip:ip        -> ../config/ip
+           |  |     +--rw oc-ip:config
+           |  |     |  +--rw oc-ip:ip?                   oc-inet:ipv4-address
+           |  |     |  +--rw oc-ip:link-layer-address    oc-yang:phys-address
+           |  |     +--ro oc-ip:state
+           |  |        +--ro oc-ip:ip?                   oc-inet:ipv4-address
+           |  |        +--ro oc-ip:link-layer-address    oc-yang:phys-address
+           |  |        +--ro oc-ip:origin?               neighbor-origin
+           |  +--rw oc-ip:unnumbered
+           |  |  +--rw oc-ip:config
+           |  |  |  +--rw oc-ip:enabled?   boolean
+           |  |  +--ro oc-ip:state
+           |  |  |  +--ro oc-ip:enabled?   boolean
+           |  |  +--rw oc-ip:interface-ref
+           |  |     +--rw oc-ip:config
+           |  |     |  +--rw oc-ip:interface?      -> /oc-if:interfaces/interface/name
+           |  |     |  +--rw oc-ip:subinterface?   -> /oc-if:interfaces/interface[oc-if:name=current()/../interface]/subinterfaces/subinterface/index
+           |  |     +--ro oc-ip:state
+           |  |        +--ro oc-ip:interface?      -> /oc-if:interfaces/interface/name
+           |  |        +--ro oc-ip:subinterface?   -> /oc-if:interfaces/interface[oc-if:name=current()/../interface]/subinterfaces/subinterface/index
+           |  +--rw oc-ip:config
+           |  |  +--rw oc-ip:enabled?       boolean
+           |  |  +--rw oc-ip:mtu?           uint16
+           |  |  +--rw oc-ip:dhcp-client?   boolean
+           |  +--ro oc-ip:state
+           |     +--ro oc-ip:enabled?       boolean
+           |     +--ro oc-ip:mtu?           uint16
+           |     +--ro oc-ip:dhcp-client?   boolean
+           |     +--ro oc-ip:counters
+           |        +--ro oc-ip:in-pkts?                oc-yang:counter64
+           |        +--ro oc-ip:in-octets?              oc-yang:counter64
+           |        +--ro oc-ip:in-multicast-pkts?      oc-yang:counter64
+           |        +--ro oc-ip:in-multicast-octets?    oc-yang:counter64
+           |        +--ro oc-ip:in-error-pkts?          oc-yang:counter64
+           |        +--ro oc-ip:in-forwarded-pkts?      oc-yang:counter64
+           |        +--ro oc-ip:in-forwarded-octets?    oc-yang:counter64
+           |        +--ro oc-ip:in-discarded-pkts?      oc-yang:counter64
+           |        +--ro oc-ip:out-pkts?               oc-yang:counter64
+           |        +--ro oc-ip:out-octets?             oc-yang:counter64
+           |        +--ro oc-ip:out-multicast-pkts?     oc-yang:counter64
+           |        +--ro oc-ip:out-multicast-octets?   oc-yang:counter64
+           |        +--ro oc-ip:out-error-pkts?         oc-yang:counter64
+           |        +--ro oc-ip:out-forwarded-pkts?     oc-yang:counter64
+           |        +--ro oc-ip:out-forwarded-octets?   oc-yang:counter64
+           |        +--ro oc-ip:out-discarded-pkts?     oc-yang:counter64
+           +--rw oc-ip:ipv6
+              +--rw oc-ip:addresses
+              |  +--rw oc-ip:address* [ip]
+              |     +--rw oc-ip:ip        -> ../config/ip
+              |     +--rw oc-ip:config
+              |     |  +--rw oc-ip:ip?              oc-inet:ipv6-address
+              |     |  +--rw oc-ip:prefix-length    uint8
+              |     |  +--rw oc-ip:type?            oc-inet:ipv6-address-type
+              |     +--ro oc-ip:state
+              |     |  +--ro oc-ip:ip?              oc-inet:ipv6-address
+              |     |  +--ro oc-ip:prefix-length    uint8
+              |     |  +--ro oc-ip:type?            oc-inet:ipv6-address-type
+              |     |  +--ro oc-ip:origin?          ip-address-origin
+              |     |  +--ro oc-ip:status?          enumeration
+              |     +--rw oc-ip:vrrp
+              |        +--rw oc-ip:vrrp-group* [virtual-router-id]
+              |           +--rw oc-ip:virtual-router-id     -> ../config/virtual-router-id
+              |           +--rw oc-ip:config
+              |           |  +--rw oc-ip:virtual-router-id?        uint8
+              |           |  +--rw oc-ip:virtual-address*          oc-inet:ip-address
+              |           |  +--rw oc-ip:priority?                 uint8
+              |           |  +--rw oc-ip:preempt?                  boolean
+              |           |  +--rw oc-ip:preempt-delay?            uint16
+              |           |  +--rw oc-ip:accept-mode?              boolean
+              |           |  +--rw oc-ip:advertisement-interval?   uint16
+              |           |  +--rw oc-ip:virtual-link-local?       oc-inet:ip-address
+              |           +--ro oc-ip:state
+              |           |  +--ro oc-ip:virtual-router-id?        uint8
+              |           |  +--ro oc-ip:virtual-address*          oc-inet:ip-address
+              |           |  +--ro oc-ip:priority?                 uint8
+              |           |  +--ro oc-ip:preempt?                  boolean
+              |           |  +--ro oc-ip:preempt-delay?            uint16
+              |           |  +--ro oc-ip:accept-mode?              boolean
+              |           |  +--ro oc-ip:advertisement-interval?   uint16
+              |           |  +--ro oc-ip:current-priority?         uint8
+              |           |  +--ro oc-ip:virtual-link-local?       oc-inet:ip-address
+              |           +--rw oc-ip:interface-tracking
+              |              +--rw oc-ip:config
+              |              |  +--rw oc-ip:track-interface*      -> /oc-if:interfaces/interface/name
+              |              |  +--rw oc-ip:priority-decrement?   uint8
+              |              +--ro oc-ip:state
+              |                 +--ro oc-ip:track-interface*      -> /oc-if:interfaces/interface/name
+              |                 +--ro oc-ip:priority-decrement?   uint8
+              +--rw oc-ip:router-advertisement
+              |  +--rw oc-ip:config
+              |  |  +--rw oc-ip:enable?         boolean
+              |  |  +--rw oc-ip:interval?       uint32
+              |  |  +--rw oc-ip:lifetime?       uint32
+              |  |  x--rw oc-ip:suppress?       boolean
+              |  |  +--rw oc-ip:mode?           enumeration
+              |  |  +--rw oc-ip:managed?        boolean
+              |  |  +--rw oc-ip:other-config?   boolean
+              |  +--ro oc-ip:state
+              |  |  +--ro oc-ip:enable?         boolean
+              |  |  +--ro oc-ip:interval?       uint32
+              |  |  +--ro oc-ip:lifetime?       uint32
+              |  |  x--ro oc-ip:suppress?       boolean
+              |  |  +--ro oc-ip:mode?           enumeration
+              |  |  +--ro oc-ip:managed?        boolean
+              |  |  +--ro oc-ip:other-config?   boolean
+              |  +--rw oc-ip:prefixes
+              |     +--rw oc-ip:prefix* [prefix]
+              |        +--rw oc-ip:prefix    -> ../config/prefix
+              |        +--rw oc-ip:config
+              |        |  +--rw oc-ip:prefix?                      oc-inet:ipv6-prefix
+              |        |  +--rw oc-ip:valid-lifetime?              uint32
+              |        |  +--rw oc-ip:preferred-lifetime?          uint32
+              |        |  +--rw oc-ip:disable-advertisement?       boolean
+              |        |  +--rw oc-ip:disable-autoconfiguration?   boolean
+              |        |  +--rw oc-ip:enable-onlink?               boolean
+              |        +--ro oc-ip:state
+              |           +--ro oc-ip:prefix?                      oc-inet:ipv6-prefix
+              |           +--ro oc-ip:valid-lifetime?              uint32
+              |           +--ro oc-ip:preferred-lifetime?          uint32
+              |           +--ro oc-ip:disable-advertisement?       boolean
+              |           +--ro oc-ip:disable-autoconfiguration?   boolean
+              |           +--ro oc-ip:enable-onlink?               boolean
+              +--rw oc-ip:neighbors
+              |  +--rw oc-ip:neighbor* [ip]
+              |     +--rw oc-ip:ip        -> ../config/ip
+              |     +--rw oc-ip:config
+              |     |  +--rw oc-ip:ip?                   oc-inet:ipv6-address
+              |     |  +--rw oc-ip:link-layer-address    oc-yang:phys-address
+              |     +--ro oc-ip:state
+              |        +--ro oc-ip:ip?                   oc-inet:ipv6-address
+              |        +--ro oc-ip:link-layer-address    oc-yang:phys-address
+              |        +--ro oc-ip:origin?               neighbor-origin
+              |        +--ro oc-ip:is-router?            boolean
+              |        +--ro oc-ip:neighbor-state?       enumeration
+              +--rw oc-ip:unnumbered
+              |  +--rw oc-ip:config
+              |  |  +--rw oc-ip:enabled?   boolean
+              |  +--ro oc-ip:state
+              |  |  +--ro oc-ip:enabled?   boolean
+              |  +--rw oc-ip:interface-ref
+              |     +--rw oc-ip:config
+              |     |  +--rw oc-ip:interface?      -> /oc-if:interfaces/interface/name
+              |     |  +--rw oc-ip:subinterface?   -> /oc-if:interfaces/interface[oc-if:name=current()/../interface]/subinterfaces/subinterface/index
+              |     +--ro oc-ip:state
+              |        +--ro oc-ip:interface?      -> /oc-if:interfaces/interface/name
+              |        +--ro oc-ip:subinterface?   -> /oc-if:interfaces/interface[oc-if:name=current()/../interface]/subinterfaces/subinterface/index
+              +--rw oc-ip:config
+              |  +--rw oc-ip:enabled?                     boolean
+              |  +--rw oc-ip:mtu?                         uint32
+              |  +--rw oc-ip:dup-addr-detect-transmits?   uint32
+              |  +--rw oc-ip:dhcp-client?                 boolean
+              +--ro oc-ip:state
+                 +--ro oc-ip:enabled?                     boolean
+                 +--ro oc-ip:mtu?                         uint32
+                 +--ro oc-ip:dup-addr-detect-transmits?   uint32
+                 +--ro oc-ip:dhcp-client?                 boolean
+                 +--ro oc-ip:counters
+                    +--ro oc-ip:in-pkts?                oc-yang:counter64
+                    +--ro oc-ip:in-octets?              oc-yang:counter64
+                    +--ro oc-ip:in-multicast-pkts?      oc-yang:counter64
+                    +--ro oc-ip:in-multicast-octets?    oc-yang:counter64
+                    +--ro oc-ip:in-error-pkts?          oc-yang:counter64
+                    +--ro oc-ip:in-forwarded-pkts?      oc-yang:counter64
+                    +--ro oc-ip:in-forwarded-octets?    oc-yang:counter64
+                    +--ro oc-ip:in-discarded-pkts?      oc-yang:counter64
+                    +--ro oc-ip:out-pkts?               oc-yang:counter64
+                    +--ro oc-ip:out-octets?             oc-yang:counter64
+                    +--ro oc-ip:out-multicast-pkts?     oc-yang:counter64
+                    +--ro oc-ip:out-multicast-octets?   oc-yang:counter64
+                    +--ro oc-ip:out-error-pkts?         oc-yang:counter64
+                    +--ro oc-ip:out-forwarded-pkts?     oc-yang:counter64
+                    +--ro oc-ip:out-forwarded-octets?   oc-yang:counter64
+                    +--ro oc-ip:out-discarded-pkts?     oc-yang:counter64
+
diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-acl.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-acl.yang
new file mode 100644
index 000000000..6b3977907
--- /dev/null
+++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-acl.yang
@@ -0,0 +1,935 @@
+module openconfig-acl {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/acl";
+
+  prefix "oc-acl";
+
+  import openconfig-packet-match { prefix oc-match; }
+  import openconfig-interfaces { prefix oc-if; }
+  import openconfig-yang-types { prefix oc-yang; }
+  import openconfig-extensions { prefix oc-ext; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module defines configuration and operational state
+    data for network access control lists (i.e., filters, rules,
+    etc.).  ACLs are organized into ACL sets, with each set
+    containing one or more ACL entries.  ACL sets are identified
+    by a unique name, while each entry within a set is assigned
+    a sequence-id that determines the order in which the ACL
+    rules are applied to a packet.  Note that ACLs are evaluated
+    in ascending order based on the sequence-id (low to high).
+
+    Individual ACL rules specify match criteria based on fields in
+    the packet, along with an action that defines how matching
+    packets should be handled. Entries have a type that indicates
+    the type of match criteria, e.g., MAC layer, IPv4, IPv6, etc.";
+
+  oc-ext:openconfig-version "1.3.3";
+
+  revision "2023-02-06" {
+    description
+      "Add clarifying comments on use of interface-ref.";
+    reference "1.3.3";
+  }
+
+  revision "2023-01-29" {
+    description
+      "Update sequence-id reference to allow model to be re-used
+      outside of ACL context.";
+    reference "1.3.2";
+  }
+
+  revision "2022-12-20" {
+    description
+      "Remove unused openconfig-inet-types import";
+    reference "1.3.1";
+  }
+
+  revision "2022-06-01" {
+    description
+      "Add the management of prefix lists
+      that can be used in matches";
+    reference "1.3.0";
+   }
+
+  revision "2022-01-14" {
+    description
+      "Fix when statements for MIXED mode ACLs";
+    reference "1.2.2";
+  }
+
+  revision "2021-06-16" {
+    description
+      "Remove trailing whitespace";
+    reference "1.2.1";
+  }
+
+  revision "2021-03-17" {
+    description
+      "Add MPLS filter Support.";
+      reference "1.2.0";
+  }
+
+  revision "2019-11-27" {
+    description
+      "Fix xpaths in when statements.";
+    reference "1.1.1";
+  }
+
+  revision "2019-10-25" {
+    description
+      "Update when statements.";
+    reference "1.1.0";
+  }
+
+  revision "2018-11-21" {
+    description
+      "Add OpenConfig module metadata extensions.";
+    reference "1.0.2";
+  }
+
+  revision "2018-04-24" {
+    description
+      "Clarified order of ACL evaluation";
+    reference "1.0.1";
+  }
+
+  revision "2017-05-26" {
+    description
+      "Separated ACL entries by type";
+    reference "1.0.0";
+  }
+
+  revision "2016-08-08" {
+    description
+      "OpenConfig public release";
+    reference "0.2.0";
+  }
+
+  revision "2016-01-22" {
+    description
+      "Initial revision";
+    reference "TBD";
+  }
+
+  // OpenConfig specific extensions for module metadata.
+  oc-ext:regexp-posix;
+  oc-ext:catalog-organization "openconfig";
+  oc-ext:origin "openconfig";
+
+  identity ACL_TYPE {
+    description
+      "Base identity for types of ACL sets";
+  }
+
+  identity ACL_IPV4 {
+    base ACL_TYPE;
+    description
+      "IP-layer ACLs with IPv4 addresses";
+  }
+
+  identity ACL_IPV6 {
+    base ACL_TYPE;
+    description
+      "IP-layer ACLs with IPv6 addresses";
+  }
+
+  identity ACL_L2 {
+    base ACL_TYPE;
+    description
+      "MAC-layer ACLs";
+  }
+
+  identity ACL_MIXED {
+    base ACL_TYPE;
+    description
+      "Mixed-mode ACL that specifies L2 and L3 protocol
+      fields.  This ACL type is not implemented by many
+      routing/switching devices.";
+  }
+
+  identity ACL_MPLS {
+    base ACL_TYPE;
+    description
+      "An ACL that matches on fields from the MPLS header.";
+  }
+
+  // ACL action type
+
+  identity FORWARDING_ACTION {
+    description
+      "Base identity for actions in the forwarding category";
+  }
+
+  identity ACCEPT {
+    base FORWARDING_ACTION;
+    description
+      "Accept the packet";
+  }
+
+  identity DROP {
+    base FORWARDING_ACTION;
+    description
+      "Drop packet without sending any ICMP error message";
+  }
+
+  identity REJECT {
+    base FORWARDING_ACTION;
+    description
+      "Drop the packet and send an ICMP error message to the source";
+  }
+
+  identity LOG_ACTION {
+    description
+      "Base identity for defining the destination for logging
+      actions";
+  }
+
+  identity LOG_SYSLOG {
+    base LOG_ACTION;
+    description
+      "Log the packet in Syslog";
+  }
+
+  identity LOG_NONE {
+    base LOG_ACTION;
+    description
+      "No logging";
+  }
+
+  identity ACL_COUNTER_CAPABILITY {
+    description
+      "Base identity for system to indicate how it is able to report
+      counters";
+  }
+
+  identity INTERFACE_ONLY {
+    base ACL_COUNTER_CAPABILITY;
+    description
+      "ACL counters are available and reported only per interface";
+  }
+
+  identity AGGREGATE_ONLY {
+    base ACL_COUNTER_CAPABILITY;
+    description
+      "ACL counters are aggregated over all interfaces, and reported
+      only per ACL entry";
+  }
+
+  identity INTERFACE_AGGREGATE {
+    base ACL_COUNTER_CAPABILITY;
+    description
+      "ACL counters are reported per interface, and also aggregated
+      and reported per ACL entry.";
+  }
+
+  // grouping statements
+
+  // input interface
+  grouping input-interface-config {
+    description
+      "Config of interface";
+
+  }
+
+  grouping input-interface-state {
+    description
+      "State information of interface";
+  }
+
+  grouping input-interface-top {
+    description
+      "Input interface top level container";
+
+    container input-interface {
+      description
+        "Input interface container. The interface is resolved based
+         on the interface and subinterface leaves of the interface-ref
+         container, which are references to entries in the /interfaces
+         list.";
+
+      container config {
+        description
+          "Config data";
+        uses input-interface-config;
+      }
+
+      container state {
+        config false;
+        description
+          "State information";
+        uses input-interface-config;
+        uses input-interface-state;
+      }
+
+      uses oc-if:interface-ref;
+
+    }
+  }
+
+  // Action Type
+  grouping action-config {
+    description
+      "Config of action type";
+
+
+    leaf forwarding-action {
+      type identityref {
+        base FORWARDING_ACTION;
+      }
+      mandatory true;
+      description
+        "Specifies the forwarding action.  One forwarding action
+        must be specified for each ACL entry";
+    }
+
+    leaf log-action {
+      type identityref {
+        base LOG_ACTION;
+      }
+      default LOG_NONE;
+      description
+        "Specifies the log action and destination for
+        matched packets.  The default is not to log the
+        packet.";
+    }
+
+
+  }
+
+  grouping action-state {
+    description
+      "State information of action type";
+
+  }
+
+  grouping action-top {
+    description
+      "ACL action type top level container";
+
+    container actions {
+      description
+        "Enclosing container for list of ACL actions associated
+        with an entry";
+
+      container config {
+        description
+          "Config data for ACL actions";
+        uses action-config;
+      }
+
+      container state {
+        config false;
+        description
+          "State information for ACL actions";
+        uses action-config;
+        uses action-state;
+      }
+    }
+  }
+
+  grouping acl-counters-state {
+    description
+      "Common grouping for ACL counters";
+
+    leaf matched-packets {
+      type oc-yang:counter64;
+      description
+        "Count of the number of packets matching the current ACL
+        entry.
+
+        An implementation should provide this counter on a
+        per-interface per-ACL-entry if possible.
+
+        If an implementation only supports ACL counters per entry
+        (i.e., not broken out per interface), then the value
+        should be equal to the aggregate count across all interfaces.
+
+        An implementation that provides counters per entry per
+        interface is not required to also provide an aggregate count,
+        e.g., per entry -- the user is expected to be able implement
+        the required aggregation if such a count is needed.";
+    }
+
+    leaf matched-octets {
+      type oc-yang:counter64;
+      description
+        "Count of the number of octets (bytes) matching the current
+        ACL entry.
+
+        An implementation should provide this counter on a
+        per-interface per-ACL-entry if possible.
+
+        If an implementation only supports ACL counters per entry
+        (i.e., not broken out per interface), then the value
+        should be equal to the aggregate count across all interfaces.
+
+        An implementation that provides counters per entry per
+        interface is not required to also provide an aggregate count,
+        e.g., per entry -- the user is expected to be able implement
+        the required aggregation if such a count is needed.";
+    }
+
+  }
+
+  // Access List Entries
+
+  grouping access-list-entries-config {
+    description
+      "Access List Entries (ACE) config.";
+
+    leaf sequence-id {
+      type uint32;
+      description
+        "The sequence id determines the order in which ACL entries
+        are applied.  The sequence id must be unique for each entry
+        in an ACL set.  Target devices should apply the ACL entry
+        rules in ascending order determined by sequence id (low to
+        high), rather than the relying only on order in the list.";
+    }
+
+    leaf description {
+      type string;
+      description
+        "A user-defined description, or comment, for this Access List
+        Entry.";
+    }
+
+  }
+
+  grouping access-list-entries-state {
+    description
+      "Access List Entries state.";
+
+    uses acl-counters-state;
+
+  }
+
+  grouping access-list-entries-top {
+    description
+      "Access list entries to level container";
+
+    container acl-entries {
+      description
+        "Access list entries container";
+
+      list acl-entry {
+        key "sequence-id";
+        description
+          "List of ACL entries comprising an ACL set";
+
+        leaf sequence-id {
+          type leafref {
+            path "../config/sequence-id";
+          }
+          description
+            "references the list key";
+        }
+
+        container config {
+          description
+            "Access list entries config";
+          uses access-list-entries-config;
+        }
+
+        container state {
+          config false;
+          description
+            "State information for ACL entries";
+          uses access-list-entries-config;
+          uses access-list-entries-state;
+        }
+
+        uses oc-match:ethernet-header-top {
+          when "../../config/type='ACL_L2' or " +
+            "../../config/type='ACL_MIXED'" {
+            description
+              "MAC-layer fields are valid when the ACL type is L2 or
+              MIXED";
+          }
+        }
+
+        uses oc-match:ipv4-protocol-fields-top {
+          when "../../config/type='ACL_IPV4' or " +
+            "../../config/type='ACL_MIXED'" {
+            description
+              "IPv4-layer fields are valid when the ACL type is
+              IPv4 or MIXED";
+          }
+        }
+
+        uses oc-match:mpls-header-top {
+          when "../../config/type='ACL_MPLS' or " +
+            "../../config/type='ACL_MIXED'" {
+            description
+              "MPLS-layer fields are valid when the ACL type is
+              MPLS or MIXED";
+          }
+        }
+
+        uses oc-match:ipv6-protocol-fields-top {
+          when "../../config/type='ACL_IPV6' or " +
+            "../../config/type='ACL_MIXED'" {
+            description
+              "IPv6-layer fields are valid when the ACL type is
+              IPv6 or MIXED";
+          }
+        }
+
+        uses oc-match:transport-fields-top {
+          when "../../config/type='ACL_IPV6' or " +
+            "../../config/type='ACL_IPV4' or " +
+            "../../config/type='ACL_MIXED'" {
+            description
+              "Transport-layer fields are valid when specifying
+              L3 or MIXED ACL types";
+          }
+        }
+
+        uses input-interface-top;
+        uses action-top;
+      }
+    }
+  }
+
+  grouping acl-set-config {
+    description
+      "Access Control List config";
+
+    leaf name {
+      type string;
+      description
+        "The name of the access-list set";
+    }
+
+    leaf type {
+      type identityref {
+        base ACL_TYPE;
+      }
+      description
+        "The type determines the fields allowed in the ACL entries
+        belonging to the ACL set (e.g., IPv4, IPv6, etc.)";
+    }
+
+    leaf description {
+      type string;
+      description
+        "Description, or comment, for the ACL set";
+    }
+
+  }
+
+  grouping acl-set-state {
+    description
+      "Access Control List state";
+  }
+
+  grouping acl-set-top {
+    description
+      "Access list entries variables top level container";
+
+    container acl-sets {
+      description
+        "Access list entries variables enclosing container";
+
+      list acl-set {
+        key "name type";
+        description
+          "List of ACL sets, each comprising of a list of ACL
+          entries";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description
+            "Reference to the name list key";
+        }
+
+        leaf type {
+          type leafref {
+            path "../config/type";
+          }
+          description
+            "Reference to the type list key";
+        }
+
+        container config {
+          description
+            "Access list config";
+          uses acl-set-config;
+        }
+
+        container state {
+          config false;
+          description
+            "Access list state information";
+          uses acl-set-config;
+          uses acl-set-state;
+        }
+        uses access-list-entries-top;
+      }
+    }
+  }
+
+  grouping interface-acl-entries-config {
+    description
+      "Configuration data for per-interface ACLs";
+
+  }
+
+  grouping interface-acl-entries-state {
+    description
+      "Operational state data for per-interface ACL entries";
+
+    leaf sequence-id {
+      type leafref {
+        path "/oc-acl:acl/oc-acl:acl-sets/" +
+          "oc-acl:acl-set[oc-acl:name=current()/../../../../set-name]" +
+          "[oc-acl:type=current()/../../../../type]/" +
+          "oc-acl:acl-entries/oc-acl:acl-entry/oc-acl:sequence-id";
+      }
+      description
+        "Reference to an entry in the ACL set applied to an
+        interface";
+    }
+
+    uses acl-counters-state;
+
+  }
+
+  grouping interface-acl-entries-top {
+    description
+      "Top-level grouping for per-interface ACL entries";
+
+    container acl-entries {
+      config false;
+      description
+        "Enclosing container for list of references to ACLs";
+
+      list acl-entry {
+        key "sequence-id";
+        description
+          "List of ACL entries assigned to an interface";
+
+        leaf sequence-id {
+          type leafref {
+            path "../state/sequence-id";
+          }
+          description
+            "Reference to per-interface acl entry key";
+        }
+
+        // no config container since the enclosing container is
+        // read-only
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for per-interface ACL entries";
+
+          uses interface-acl-entries-config;
+          uses interface-acl-entries-state;
+        }
+      }
+    }
+  }
+
+  grouping interface-ingress-acl-config {
+    description
+      "Configuration data for per-interface ingress ACLs";
+
+    leaf set-name {
+      type leafref {
+        path "../../../../../../acl-sets/acl-set/config/name";
+      }
+      description
+        "Reference to the ACL set name applied on ingress";
+    }
+
+    leaf type {
+      type leafref {
+        path "../../../../../../acl-sets/acl-set[name=current()/../set-name]" +
+          "/config/type";
+      }
+      description
+        "Reference to the ACL set type applied on ingress";
+    }
+  }
+
+  grouping interface-ingress-acl-state {
+    description
+      "Operational state data for the per-interface ingress ACL";
+  }
+
+  grouping interface-ingress-acl-top {
+    description
+      "Top-level grouping for per-interface ingress ACL data";
+
+    container ingress-acl-sets {
+      description
+        "Enclosing container the list of ingress ACLs on the
+        interface";
+
+      list ingress-acl-set {
+        key "set-name type";
+        description
+          "List of ingress ACLs on the interface";
+
+        leaf set-name {
+          type leafref {
+            path "../config/set-name";
+          }
+          description
+            "Reference to set name list key";
+        }
+
+        leaf type {
+          type leafref {
+            path "../config/type";
+          }
+          description
+            "Reference to type list key";
+        }
+
+        container config {
+          description
+            "Configuration data ";
+
+          uses interface-ingress-acl-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for interface ingress ACLs";
+
+          uses interface-ingress-acl-config;
+          uses interface-ingress-acl-state;
+        }
+
+        uses interface-acl-entries-top;
+      }
+    }
+  }
+
+  grouping interface-egress-acl-config {
+    description
+      "Configuration data for per-interface egress ACLs";
+
+    leaf set-name {
+      type leafref {
+        path "../../../../../../acl-sets/acl-set/config/name";
+      }
+      description
+        "Reference to the ACL set name applied on egress";
+    }
+
+    leaf type {
+      type leafref {
+        path "../../../../../../acl-sets/acl-set[name=current()/../set-name]" +
+          "/config/type";
+      }
+      description
+        "Reference to the ACL set type applied on egress.";
+    }
+  }
+
+  grouping interface-egress-acl-state {
+    description
+      "Operational state data for the per-interface egress ACL";
+  }
+
+  grouping interface-egress-acl-top {
+    description
+      "Top-level grouping for per-interface egress ACL data";
+
+    container egress-acl-sets {
+      description
+        "Enclosing container the list of egress ACLs on the
+        interface";
+
+      list egress-acl-set {
+        key "set-name type";
+        description
+          "List of egress ACLs on the interface";
+
+        leaf set-name {
+          type leafref {
+            path "../config/set-name";
+          }
+          description
+            "Reference to set name list key";
+        }
+
+        leaf type {
+          type leafref {
+            path "../config/type";
+          }
+          description
+            "Reference to type list key";
+        }
+
+        container config {
+          description
+            "Configuration data ";
+
+          uses interface-egress-acl-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for interface egress ACLs";
+
+          uses interface-egress-acl-config;
+          uses interface-egress-acl-state;
+        }
+
+        uses interface-acl-entries-top;
+      }
+    }
+  }
+
+  grouping acl-interfaces-config {
+    description
+      "Configuration data for interface references";
+
+    leaf id {
+      type oc-if:interface-id;
+      description
+        "User-defined identifier for the interface -- a common
+        convention could be '.'";
+    }
+  }
+
+  grouping acl-interfaces-state {
+    description
+      "Operational state data for interface references";
+  }
+
+  grouping acl-interfaces-top {
+    description
+      "Top-level grouping for interface-specific ACL data";
+
+    container interfaces {
+      description
+        "Enclosing container for the list of interfaces on which
+        ACLs are set";
+
+      list interface {
+        key "id";
+        description
+          "List of interfaces on which ACLs are set. The interface is resolved
+          based on the interface and subinterface leaves of the interface-ref
+          container, which are references to entries in the /interfaces
+          list. The key of the list is an arbitrary value that the
+          implementation should not use to resolve an interface name.";
+
+        leaf id {
+          type leafref {
+            path "../config/id";
+          }
+          description
+            "Reference to the interface id list key";
+        }
+
+        container config {
+          description
+            "Configuration for ACL per-interface data";
+
+          uses acl-interfaces-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state for ACL per-interface data";
+
+          uses acl-interfaces-config;
+          uses acl-interfaces-state;
+        }
+
+        uses oc-if:interface-ref;
+        uses interface-ingress-acl-top;
+        uses interface-egress-acl-top;
+      }
+    }
+  }
+
+
+  grouping acl-config {
+    description
+      "Global configuration data for ACLs";
+  }
+
+  grouping acl-state {
+    description
+      "Global operational state data for ACLs";
+
+    leaf counter-capability {
+      type identityref {
+        base ACL_COUNTER_CAPABILITY;
+      }
+      description
+        "System reported indication of how ACL counters are reported
+        by the target";
+    }
+  }
+  grouping acl-top {
+    description
+      "Top level grouping for ACL data and structure";
+
+    container acl {
+      description
+        "Top level enclosing container for ACL model config
+        and operational state data";
+
+      container config {
+        description
+          "Global config data for ACLs";
+
+        uses acl-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Global operational state data for ACLs";
+
+        uses acl-config;
+        uses acl-state;
+      }
+
+      uses acl-set-top;
+      uses acl-interfaces-top;
+    }
+  }
+
+  // data definition statements
+  uses acl-top;
+
+  // augment statements
+
+
+}
diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-icmpv4-types.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-icmpv4-types.yang
new file mode 100644
index 000000000..486f3e157
--- /dev/null
+++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-icmpv4-types.yang
@@ -0,0 +1,540 @@
+module openconfig-icmpv4-types {
+
+  yang-version "1";
+  namespace "http://openconfig.net/yang/openconfig-icmpv4-types";
+
+  prefix "oc-icmpv4-types";
+
+  import openconfig-extensions { prefix oc-ext; }
+
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "OpenConfig module defining the types and coresponding codes for
+    ICMPv4.";
+
+  oc-ext:openconfig-version "0.1.0";
+
+  revision "2023-01-26" {
+    description
+      "Initial revision of ICMPv4 types module.";
+    reference "0.1.0";
+  }
+
+  identity TYPE {
+    description
+      "Base identity for ICMPv4 codes";
+  }
+
+  identity CODE {
+    description
+      "Base identity for ICMPv4 codes.";
+  }
+
+  identity ECHO_REPLY {
+    description
+      "ICMP echo reply, value 0.";
+    base TYPE;
+    reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
+  }
+
+  identity DST_UNREACHABLE {
+    description
+      "ICMP destination unreachable, value 3.";
+    base TYPE;
+    reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
+  }
+
+  identity REDIRECT {
+    description
+      "ICMP redirect, value 5.";
+    base TYPE;
+    reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
+  }
+
+  identity ECHO {
+    description
+      "ICMP echo, value 8.";
+    base TYPE;
+    reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
+  }
+
+  identity ROUTER_ADVERTISEMENT {
+    description
+      "ICMP router advertisement, value 9.";
+    base TYPE;
+    reference "RFC1256: ICMP Router Discovery Messages";
+  }
+
+  identity ROUTER_SOLICITATION {
+    description
+      "ICMP Router Solicitation, value 10.";
+    base TYPE;
+    reference "RFC1256: ICMP Router Discovery Messages";
+  }
+
+  identity TIME_EXCEEDED {
+    description
+      "ICMP TTL exceede, value 11.";
+    base TYPE;
+    reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
+  }
+
+  identity PARAM_PROBLEM {
+    description
+      "ICMP parameter problem, value 12.";
+    base TYPE;
+    reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
+  }
+
+  identity TIMESTAMP {
+    description
+      "ICMP timestamp, value 13.";
+    base TYPE;
+    reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
+  }
+
+  identity TIMESTAMP_REPLY {
+    description
+      "ICMP timestamp reply, value 14.";
+    base TYPE;
+    reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
+  }
+  identity TRACEROUTE{
+    description
+      "Traceroute (deprecated), value 30.";
+    base TYPE;
+    reference "RFC1393: Traceroute Using an IP Option";
+  }
+  identity PHOTURIS {
+    description
+      "ICMP Photuris, value 40.";
+    base TYPE;
+    reference "RFC2521: CMP Security Failures Messages";
+  }
+
+  identity EXT_ECHO_REQUEST {
+    description
+      "ICMP extended echo request, value 42.";
+    base TYPE;
+    reference "RFC8335: PROBE: A Utility for Probing Interfaces";
+  }
+
+  identity EXT_ECHO_REPLY {
+    description
+      "ICMP extended echo reply, value 43.";
+    base TYPE;
+    reference "RFC8335: PROBE: A Utility for Probing Interfaces";
+  }
+
+  identity ECHO_REPLY_CODE {
+    description
+      "CODE for ICMPv4 Echo Reply.";
+    base CODE;
+  }
+
+  identity ECHO_REPLY_NONE {
+    description
+      "No code, type 0 for Echo Reply.";
+    base ECHO_REPLY_CODE;
+    reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
+  }
+
+  identity DST_UNREACHABLE_CODE {
+    description
+      "Codes for ICMPv4 Destination Unreachable.";
+    base CODE;
+  }
+
+  identity DST_UNREACHABLE_NET {
+    description
+      "ICMPv4 destination network unreachable, code 0.";
+    base DST_UNREACHABLE_CODE;
+    reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
+  }
+
+  identity DST_UNREACHABLE_HOST {
+    description
+      "ICMPv4 destination host unreachable, code 1";
+    base DST_UNREACHABLE_CODE;
+    reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
+  }
+
+  identity DST_UNREACHABLE_PROTOCOL {
+    description
+      "ICMPv4 destination protocol unreachable, code 2.";
+    base DST_UNREACHABLE_CODE;
+    reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
+  }
+
+  identity DST_UNREACHABLE_PORT {
+    description
+      "ICMPv4 Port unreachable, code 3.";
+    base DST_UNREACHABLE_CODE;
+    reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
+  }
+
+  identity DST_UNREACHABLE_CANNOT_FRAGMENT {
+    description
+      "ICMPv4 destination unreachable due to inability to fragment. The df-bit
+      is set but the packet requires fragmentation, code 4.";
+    base DST_UNREACHABLE_CODE;
+    reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
+  }
+
+  identity DST_UNREACHABLE_SRC_ROUTE_FAILED {
+    description
+      "ICMPv4 destination is unreachable as source routing failed, code 5.";
+    base DST_UNREACHABLE_CODE;
+    reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
+  }
+
+  identity DST_UNREACHABLE_DST_NET_UNKNOWN {
+    description
+      "ICMPv4 destination is unreachable as the destination network is
+      unknown, code 6.";
+    base DST_UNREACHABLE_CODE;
+    reference "RFC1122: Requirements for Internet Hosts --
+              Communication Layers";
+  }
+
+  identity DST_UNREACHABLE_DST_HOST_UNKNOWN {
+    description
+      "ICMPv4 destination is unreachable as the destination host is unknown, code 7.";
+    base DST_UNREACHABLE_CODE;
+    reference "RFC1122: Requirements for Internet Hosts --
+          Communication Layers";
+  }
+
+  identity DST_UNREACHABLE_SRC_HOST_ISOLATED {
+    description
+      "ICMPv4 destination unreachable as the source host is isolated, code 8.";
+    base DST_UNREACHABLE_CODE;
+    reference "RFC1122: Requirements for Internet Hosts --
+              Communication Layers";
+  }
+
+  identity DST_UNREACHABLE_DST_NET_ADMIN_PROHIBITED {
+    description
+      "ICMPv4 destination is unreachable as communication with the destination
+      network is administratively prohibited, code 9.";
+    base DST_UNREACHABLE_CODE;
+    reference "RFC1122: Requirements for Internet Hosts --
+              Communication Layers";
+  }
+
+  identity DST_UNREACHABLE_DST_HOST_ADMIN_PROHIBITED {
+    description
+      "ICMPv4 destination is unreachable as communication with the destination
+      host is adminstratively prohibited, code 10.";
+    base DST_UNREACHABLE_CODE;
+    reference "RFC1122: Requirements for Internet Hosts --
+              Communication Layers";
+  }
+
+  identity DST_UNREACHABLE_NET_UNREACHABLE_FOR_TOS {
+    description
+      "ICMPv4 destination network is unreachable for the specified type of
+      service, code 11.";
+    base DST_UNREACHABLE_CODE;
+    reference "RFC1122: Requirements for Internet Hosts --
+              Communication Layers";
+  }
+
+  identity DST_UNREACHABLE_HOST_UNREACHABLE_FOR_TOS {
+    description
+      "ICMPv4 destination host is unreachable for the specified type of
+      service, code 12.";
+    base DST_UNREACHABLE_CODE;
+    reference "RFC1122: Requirements for Internet Hosts --
+              Communication Layers";
+  }
+
+  identity DST_UNREACHABLE_ADMIN_PROHIBITED {
+    description
+      "ICMPv4 destination is unreacable as packets were adminstratively
+      filtered.";
+    base DST_UNREACHABLE_CODE;
+    reference "RFC1812: Requirements for IP Version 4 Routers";
+  }
+
+  identity DST_UNREACHABLE_HOST_PRECEDENCE_VIOLATION {
+    description
+      "ICMPv4 destination is unreachable as the first-hop router has determined
+      that the destination cannot be reached for the specified source/
+      destination host, network, upper-layer protocol and source/destination
+      port. Code 14";
+    base DST_UNREACHABLE_CODE;
+  }
+
+  identity DST_UNREACHABLE_PRECEDENCE_CUTOFF {
+    description
+      "ICMPv4 Precedence cutoff in effect.  The network operators have imposed
+      a minimum level of precedence required for operation, the
+      datagram was sent with a precedence below this level.
+      Code 15.";
+    base DST_UNREACHABLE_CODE;
+    reference "RFC1812: Requirements for IP Version 4 Routers";
+  }
+
+  identity REDIRECT_CODE {
+    base CODE;
+    description
+      "Codes for the ICMPv4 Redirect type.";
+  }
+
+  identity REDIRECT_NETWORK {
+    base REDIRECT_CODE;
+    description
+      "ICMP redirect is being issued for the network or subnet,
+       code 0";
+    reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
+  }
+
+  identity REDIRECT_HOST {
+    base REDIRECT_CODE;
+    description
+      "ICMP redirect is being issued for the host, code 1.";
+    reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
+  }
+
+  identity REDIRECT_TOS_NETWORK {
+    base REDIRECT_CODE;
+    description
+      "ICMP redirect is being issued for the network and type of service. code 2.";
+    reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
+  }
+
+  identity REDIRECT_TOS_HOST {
+    base REDIRECT_CODE;
+    description
+      "ICMP redirect is being issued for the host and type of service,
+      code 3";
+    reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
+  }
+
+  identity ECHO_CODE {
+    base CODE;
+    description
+      "Codes for ICMPv4 echo messages.";
+    reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
+  }
+
+  identity ECHO_NO_CODE {
+    base ECHO_CODE;
+    description
+      "No code.";
+    reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
+  }
+
+  identity ROUTER_ADVERTISEMENT_CODE {
+    base CODE;
+    description
+      "Code for the ICMPv4 router advertisement message.";
+  }
+  identity ROUTER_ADVERTISEMENT_NORMAL {
+    base ROUTER_ADVERTISEMENT_CODE;
+    description
+      "Code 0: Normal router advertisement.";
+    reference "RFC3344: IP Mobility Support for IPv4";
+  }
+
+  identity ROUTER_ADVERTISEMENT_DOES_NOT_ROUTE_COMMON {
+    base ROUTER_ADVERTISEMENT_CODE;
+    description
+      "Code 16: Does not route common traffic.";
+    reference "RFC3344: IP Mobility Support for IPv4";
+  }
+
+  identity ROUTER_SELECTION_CODE {
+    base CODE;
+    description
+      "Codes for the ICMPv4 router selection message.";
+  }
+
+  identity ROUTER_SELECTION_NO_CODE {
+    base ROUTER_SELECTION_CODE;
+    description
+      "No code.";
+    reference "RFC1256: ICMP Router Discovery Messages";
+  }
+
+  identity TIME_EXCEEDED_CODE {
+    base CODE;
+    description
+      "Codes for the ICMPv4 time exceeded code.";
+  }
+
+  identity TIME_EXCEEDED_IN_TRANSIT {
+    base TIME_EXCEEDED_CODE;
+    description
+      "Code 0: Time to Live exceeded in Transit.";
+    reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
+  }
+
+  identity TIME_EXCEEDED_FRAGMENT_REASSEMBLY_IN_TRANSIT {
+    base TIME_EXCEEDED_CODE;
+    description
+      "Code 1: Fragment reassembly time exceeded.";
+    reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
+  }
+
+  identity PARAM_PROBLEM_CODE {
+    base CODE;
+    description
+      "Codes for the ICMPv4 parameter problem message (Type 12).";
+  }
+
+  identity PARAM_PROBLEM_POINTER_INDICATES_ERR {
+    base PARAM_PROBLEM_CODE;
+    description
+      "Code 0: Pointer indicates the error.";
+    reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
+  }
+
+  identity PARAM_PROBLEM_MISSING_REQ_OPTION {
+    base PARAM_PROBLEM_CODE;
+    description
+      "Code 1: Missing a required option.";
+    reference "RFC1108: U.S. Department of Defense
+               Security Options for the Internet Protocol";
+  }
+
+  identity PARAM_PROBLEM_BAD_LENGTH {
+    base PARAM_PROBLEM_CODE;
+    description
+      "Code 2: Bad Length.";
+    reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
+  }
+
+  identity TIMESTAMP_CODE {
+    base CODE;
+    description
+      "Codes of the ICMPv4 timestamp message (Type 13).";
+  }
+  identity TIMESTAMP_NO_CODE {
+    base TIMESTAMP_CODE;
+    description
+      "No code.";
+    reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
+  }
+
+  identity TIMESTAMP_REPLY_CODE {
+    base CODE;
+    description
+      "Codes of the ICMPv4 timestamp reply message (Type 14).";
+  }
+
+  identity TIMESTAMP_REPLY_NO_CODE {
+    base TIMESTAMP_REPLY_CODE;
+    description
+      "No code.";
+    reference "RFC792: INTERNET CONTROL MESSAGE PROTOCOL";
+  }
+
+  identity PHOTURIS_CODE {
+    base CODE;
+    description
+      "Codes of the ICMPv4 Photuris message (type 40).";
+  }
+
+  identity PHOTURIS_BAD_SPI {
+    base PHOTURIS_CODE;
+    description
+      "Code 0: Bad SPI.";
+    reference "RFC2521: ICMP Security Failures Messages";
+  }
+
+  identity PHOTURIS_AUTH_FAILED {
+    base PHOTURIS_CODE;
+    description
+      "Code 1: Authentication failed.";
+    reference "RFC2521: ICMP Security Failures Messages";
+  }
+
+  identity PHOTURIS_DECOMPRESS_FAILED {
+    base PHOTURIS_CODE;
+    description
+      "Code 2: Decompression failed.";
+    reference "RFC2521: ICMP Security Failures Messages";
+  }
+
+  identity PHOTURIS_DECRYPTION_FAILED {
+    base PHOTURIS_CODE;
+    description
+      "Code 3: Decryption failed.";
+    reference "RFC2521: ICMP Security Failures Messages";
+  }
+
+  identity PHOTURIS_NEED_AUTHENTICATION {
+    base PHOTURIS_CODE;
+    description
+      "Code 4: Need authentication.";
+    reference "RFC2521: ICMP Security Failures Messages";
+  }
+
+  identity PHOTURIS_NEED_AUTHORIZATION {
+    base PHOTURIS_CODE;
+    description
+      "Code 5: Need authorization.";
+    reference "RFC2521: ICMP Security Failures Messages";
+  }
+
+  identity EXT_ECHO_REQUEST_CODE {
+    description
+      "Codes of the extended echo request ICMP message.";
+    base CODE;
+  }
+
+  identity EXT_ECHO_REQUEST_NO_ERROR {
+    base EXT_ECHO_REQUEST_CODE;
+    description
+      "Code 0: No error.";
+    reference "RFC8335: PROBE: A Utility for Probing Interfaces";
+  }
+
+  identity EXT_ECHO_REPLY_CODE {
+    description
+      "Codes of the extended echo reply ICMP message (Type 43).";
+    base CODE;
+  }
+
+  identity EXT_ECHO_REPLY_NO_ERROR {
+    base EXT_ECHO_REPLY_CODE;
+    description
+      "Code 0: No error.";
+    reference "RFC8335: PROBE: A Utility for Probing Interfaces";
+  }
+
+  identity EXT_ECHO_REPLY_MALFORMED_QUERY {
+    base EXT_ECHO_REPLY_CODE;
+    description
+      "Code 1: Malformed query.";
+    reference "RFC8335: PROBE: A Utility for Probing Interfaces";
+  }
+
+  identity EXT_ECHO_REPLY_NO_SUCH_INTF {
+    base EXT_ECHO_REPLY_CODE;
+    description
+      "Code 2: No such interface.";
+    reference "RFC8335: PROBE: A Utility for Probing Interfaces";
+  }
+
+  identity EXT_ECHO_REPLY_NO_SUB_TABLE_ENTRY {
+    base EXT_ECHO_REPLY_CODE;
+    description
+      "Code 3: No such table entry.";
+    reference "RFC8335: PROBE: A Utility for Probing Interfaces";
+  }
+
+  identity EXT_ECHO_REPLY_MULTIPLE_INTF_SATISFY_QUERY {
+    base EXT_ECHO_REPLY_CODE;
+    description
+      "Code 4: Multiple interfaces satisfy query.";
+    reference "RFC8335: PROBE: A Utility for Probing Interfaces";
+  }
+}
diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-icmpv6-types.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-icmpv6-types.yang
new file mode 100644
index 000000000..ecd77cabf
--- /dev/null
+++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-icmpv6-types.yang
@@ -0,0 +1,1010 @@
+module openconfig-icmpv6-types {
+
+  yang-version "1";
+  namespace "http://openconfig.net/yang/openconfig-icmpv6-types";
+
+  prefix "oc-icmpv6-types";
+
+  import openconfig-extensions { prefix oc-ext; }
+
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "OpenConfig module defining the types and coresponding subcodes for
+    ICMPv6.";
+
+  oc-ext:openconfig-version "0.1.1";
+
+  revision "2023-05-02" {
+    description
+      "Fix module prefix.";
+    reference "0.1.1";
+  }
+
+  revision "2023-01-26" {
+    description
+      "Initial revision of ICMPv6 types module.";
+    reference "0.1.0";
+  }
+
+  identity TYPE {
+    description
+      "Base identity for ICMPv6 codes";
+  }
+
+  identity CODE {
+    description
+      "Base identity for ICMPv6 subcodes.";
+  }
+
+  identity DESTINATION_UNREACHABLE {
+    base TYPE;
+    description
+      "Type 1: Destination unreachable.";
+    reference
+      "RFC4443: Internet Control Message Protocol (ICMPv6)
+      for the Internet Protocol Version 6 (IPv6) Specification";
+  }
+
+  identity PACKET_TOO_BIG {
+    base TYPE;
+    description
+      "Type 2: Packet too big.";
+    reference
+      "RFC4443: Internet Control Message Protocol (ICMPv6)
+      for the Internet Protocol Version 6 (IPv6) Specification";
+  }
+
+  identity TIME_EXCEEDED {
+    base TYPE;
+    description
+      "Type 3: Time exceeded.";
+    reference
+      "RFC4443: Internet Control Message Protocol (ICMPv6)
+      for the Internet Protocol Version 6 (IPv6) Specification";
+  }
+
+  identity PARAMETER_PROBLEM {
+    base TYPE;
+    description
+      "Type 4: Parameter problem.";
+    reference
+      "RFC4443: Internet Control Message Protocol (ICMPv6)
+      for the Internet Protocol Version 6 (IPv6) Specification";
+  }
+
+  identity ECHO_REQUEST {
+    base TYPE;
+    description
+      "Type 128: Echo request.";
+    reference
+      "RFC4443: Internet Control Message Protocol (ICMPv6)
+      for the Internet Protocol Version 6 (IPv6) Specification";
+  }
+
+  identity ECHO_REPLY {
+    base TYPE;
+    description
+      "Type 129: Echo reply";
+    reference
+      "RFC4443: Internet Control Message Protocol (ICMPv6)
+      for the Internet Protocol Version 6 (IPv6) Specification";
+  }
+
+  identity MULTICAST_LISTENER_QUERY {
+    base TYPE;
+    description
+      "Type 130: Multicast listener query";
+    reference
+      "RFC2710: Multicast Listener Discovery (MLD) for IPv6";
+  }
+
+  identity MULTICAST_LISTENER_REPORT {
+    base TYPE;
+    description
+      "Type 131: Multicast listener report";
+    reference
+      "RFC2710: Multicast Listener Discovery (MLD) for IPv6";
+  }
+
+  identity MULTICAST_LISTENER_DONE {
+    base TYPE;
+    description
+      "Type 132: Multicast listener done";
+    reference
+      "RFC2710: Multicast Listener Discovery (MLD) for IPv6";
+  }
+
+  identity ROUTER_SOLICITATION {
+    base TYPE;
+    description
+      "Type 133: IPv6 router soliciation.";
+    reference
+      "RFC4861: Neighbor Discovery for IP version 6 (IPv6)";
+  }
+
+  identity ROUTER_ADVERTISEMENT {
+    base TYPE;
+    description
+      "Type 134: IPv6 router advertisement.";
+    reference
+      "RFC4861: Neighbor Discovery for IP version 6 (IPv6)";
+  }
+
+  identity NEIGHBOR_SOLICITATION {
+    base TYPE;
+    description
+      "Type 135: IPv6 neighbor solicitation.";
+    reference
+      "RFC4861: Neighbor Discovery for IP version 6 (IPv6)";
+  }
+
+  identity NEIGHBOR_ADVERTISEMENT {
+    base TYPE;
+    description
+      "Type 136: IPv6 neighbor advertisement.";
+    reference
+      "RFC4861: Neighbor Discovery for IP version 6 (IPv6)";
+  }
+
+  identity REDIRECT {
+    base TYPE;
+    description
+      "Type 137: IPv6 ICMP redirect message.";
+    reference
+      "RFC4861: Neighbor Discovery for IP version 6 (IPv6)";
+  }
+
+  identity RENUNBERING {
+    base TYPE;
+    description
+      "Type 138: Router renumbering.";
+    reference
+      "RFC2894: Router Renumbering for IPv6";
+  }
+
+  identity NODE_INFORMATION_QUERY {
+    base TYPE;
+    description
+      "Type 139: ICMP Node Information Query.";
+    reference
+      "RFC4620: IPv6 Node Information Queries";
+  }
+  identity NODE_INFORMATION_RESPONSE {
+    base TYPE;
+    description
+      "Type 140: ICMP Node Information Response.";
+    reference
+      "RFC4620: IPv6 Node Information Queries";
+  }
+
+  identity INVERSE_NEIGHBOR_SOLICITATION {
+    base TYPE;
+    description
+      "Type 141: Inverse Neighbor Discovery Solicitation Message.";
+    reference "RFC3122: Extensions to IPv6 Neighbor Discovery for
+              Inverse Discovery Specification";
+  }
+
+  identity INVERSE_NEIGHBOR_ADVERTISEMENT {
+    base TYPE;
+    description
+      "Type 142: Inverse Neighbor Discovery Advertisement Message.";
+    reference "RFC3122: Extensions to IPv6 Neighbor Discovery for
+              Inverse Discovery Specification";
+  }
+
+  identity VERSION2_MULTICAST_LISTENER {
+    base TYPE;
+    description
+      "Type 143: Version 2 Multicast Listener Report";
+    reference
+      "RFC3810: Multicast Listener Discovery Version 2 (MLDv2) for IPv6";
+  }
+
+  identity HOME_AGENT_ADDRESS_DISCOVERY_REQUEST {
+    base TYPE;
+    description
+      "Type 144: Home Agent Address Discovery Request Message.";
+    reference "RFC6275: Mobility Support in IPv6";
+
+  }
+
+  identity HOME_AGENT_ADDRESS_DISCOVERY_REPLY {
+    base TYPE;
+    description
+      "Type 145: Home Agent Address Discovery Reply Message.";
+    reference "RFC6275: Mobility Support in IPv6";
+
+  }
+
+  identity MOBILE_PREFIX_SOLICITATION {
+    base TYPE;
+    description
+      "Type 147: Mobile Prefix Solicitation.";
+    reference "RFC6275: Mobility Support in IPv6";
+  }
+
+  identity MOBILE_PREFIX_ADVERTISEMENT {
+    base TYPE;
+    description
+      "Type 147: Mobile Prefix Advertisement.";
+    reference "RFC6275: Mobility Support in IPv6";
+  }
+
+  identity CERTIFICATION_PATH_SOLICITATION {
+    base TYPE;
+    description
+      "Type 148: Certification Path Soliciation Message.";
+    reference "RFC3971: SEcure Neighbor Discovery (SEND)";
+  }
+
+  identity CERTIFICATION_PATH_ADVERTISEMENT {
+    base TYPE;
+    description
+      "Type 149: Certification Path Advertisement Message.";
+    reference "RFC3971: SEcure Neighbor Discovery (SEND)";
+  }
+
+  identity MULTICAST_ROUTER_ADVERTISEMENT {
+    base TYPE;
+    description
+      "Type 151: Multicast Router Advertisement.";
+    reference "RFC4286: Multicast Router Discovery";
+  }
+
+  identity MULTICAST_ROUTER_SOLICITATION {
+    base TYPE;
+    description
+      "Type 152: Multicast Router Solicitation.";
+    reference "RFC4286: Multicast Router Discovery";
+  }
+
+  identity MULTICAST_ROUTER_TERMINATION {
+    base TYPE;
+    description
+      "Type 153: Multicast Router Termination.";
+    reference "RFC4286: Multicast Router Discovery";
+  }
+
+  identity FMIPV6 {
+    base TYPE;
+    description
+      "Type 154: Fast handover mode for IPv6.";
+    reference
+      "RFC5568: Mobile IPv6 Fast Handovers";
+  }
+
+  identity RPL_CONTROL {
+    base TYPE;
+    description
+      "Type 155: RPL Control Message.";
+    reference
+      "RFC6550: RPL: IPv6 Routing Protocol for Low-Power and Lossy Networks";
+  }
+
+  identity ILNPV6_LOCATOR_UPDATE {
+    base TYPE;
+    description
+      "Type 156: ILNPv6 Locator Update Message.";
+    reference
+      "RFC6743: ICMP Locator Update Message for
+       the Identifier-Locator Network Protocol for IPv6 (ILNPv6)";
+  }
+
+  identity DUPLICATE_ADDRESS_REQUEST {
+    base TYPE;
+    description
+      "Type 157: Duplicate address request.";
+    reference
+      "RFC6775: Neighbor Discovery Optimization for IPv6 over Low-Power Wireless
+                Personal Area Networks (6LoWPANs)";
+  }
+
+  identity DUPLICATE_ADDRESS_CONFIRMATION {
+    base TYPE;
+    description
+      "Type 158: Duplicate address confirmation.";
+    reference
+      "RFC6775: Neighbor Discovery Optimization for IPv6 over Low-Power Wireless
+                Personal Area Networks (6LoWPANs)";
+  }
+
+  identity MPL_CONTROL {
+    base TYPE;
+    description
+      "Type 159: MPL Control Message.";
+    reference
+      "RFC7731: Multicast Protocol for Low-Power and Lossy Networks (MPL)";
+  }
+
+  identity EXT_ECHO_REQUEST {
+    base TYPE;
+    description
+      "Type 160: Extended echo request.";
+    reference
+      "RFC8335: PROBE: A Utility for Probing Interfaces";
+  }
+
+  identity EXT_ECHO_REPLY {
+    base TYPE;
+    description
+      "Type 161: Extended echo reply.";
+    reference
+      "RFC8335: PROBE: A Utility for Probing Interfaces";
+  }
+
+  identity DST_UNREACHABLE_CODE {
+    base CODE;
+    description
+      "ICMPv6 destination unreachable subcodes.";
+  }
+  identity DST_UNREACHABLE_NO_ROUTE_TO_DST {
+    base DST_UNREACHABLE_CODE;
+    description
+      "Code 0: No route to destination.";
+    reference "RFC4443: Internet Control Message Protocol (ICMPv6)
+          for the Internet Protocol Version 6 (IPv6) Specification";
+  }
+  identity DST_UNREACHABLE_DST_ADMIN_PROHIBITED {
+    base DST_UNREACHABLE_CODE;
+    description
+      "Code 1: Communication with destination adminstratively prohibited.";
+    reference "RFC4443: Internet Control Message Protocol (ICMPv6)
+              for the Internet Protocol Version 6 (IPv6) Specification";
+  }
+
+  identity DST_UNREACHABLE_BEYOND_SCOPE_OF_SRC {
+    base DST_UNREACHABLE_CODE;
+    description
+      "Code 2: Beyond scope of source address.";
+    reference "RFC4443: Internet Control Message Protocol (ICMPv6)
+              for the Internet Protocol Version 6 (IPv6) Specification";
+  }
+
+  identity DST_UNREACHABLE_ADDR {
+    base DST_UNREACHABLE_CODE;
+    description
+      "Code 3: Address unreachable.";
+    reference "RFC4443: Internet Control Message Protocol (ICMPv6)
+              for the Internet Protocol Version 6 (IPv6) Specification";
+  }
+
+  identity DST_UNREACHABLE_PORT {
+    base DST_UNREACHABLE_CODE;
+    description
+      "Code 4: Port unreachable.";
+    reference "RFC4443: Internet Control Message Protocol (ICMPv6)
+              for the Internet Protocol Version 6 (IPv6) Specification";
+  }
+
+  identity DST_UNREACHABLE_SRC_ADDR_FAILED_POLICY {
+    base DST_UNREACHABLE_CODE;
+    description
+      "Code 5: Source address failed ingress/egress policy.";
+    reference "RFC4443: Internet Control Message Protocol (ICMPv6)
+              for the Internet Protocol Version 6 (IPv6) Specification";
+  }
+
+  identity DST_UNREACHABLE_REJECT_ROUTE_TO_DST {
+    base DST_UNREACHABLE_CODE;
+    description
+      "Code 6: Reject route to destination.";
+    reference "RFC4443: Internet Control Message Protocol (ICMPv6)
+              for the Internet Protocol Version 6 (IPv6) Specification";
+  }
+
+  identity DST_UNREACHABLE_ERR_IN_SRC_ROUTING_HDR {
+    base DST_UNREACHABLE_CODE;
+    description
+      "Code 7: Error in Source Routing Header.";
+    reference "RFC8554: An IPv6 Routing Header for Source Routes with
+              the Routing Protocol for Low-Power and Lossy Networks (RPL)";
+  }
+
+  identity DST_UNREACHABLE_HDRS_TOO_LONG {
+    base DST_UNREACHABLE_CODE;
+    description
+      "Type 8: Headers too long";
+    reference "RFC8883: ICMPv6 Errors for Discarding Packets Due to
+              Processing Limits";
+  }
+
+  identity PACKET_TOO_BIG_CODE {
+    base CODE;
+    description
+      "Subcodes for the ICMPv6 Packet Too Big type.";
+  }
+
+  identity PACKET_TOO_BIG_NO_CODE {
+    base PACKET_TOO_BIG_CODE;
+    description
+      "No code, value 0.";
+    reference "RFC4443: Internet Control Message Protocol (ICMPv6)
+              for the Internet Protocol Version 6 (IPv6) Specification";
+  }
+
+  identity TIME_EXCEEDED_CODE {
+    base CODE;
+    description
+      "Subcodes for the Time Exceeded ICMPv6 type.";
+  }
+
+  identity TIME_EXCEEDED_HOP_LIMIT {
+    base TIME_EXCEEDED_CODE;
+    description
+      "Code 0: Hop limit exceeded in transit.";
+    reference "RFC4443: Internet Control Message Protocol (ICMPv6)
+              for the Internet Protocol Version 6 (IPv6) Specification";
+  }
+  identity TIME_EXCEEDED_FRAGMENT_REASSEMBLY {
+    base TIME_EXCEEDED_CODE;
+    description
+      "Code 1: Fragment reassembly time exceeded.";
+    reference "RFC4443: Internet Control Message Protocol (ICMPv6)
+              for the Internet Protocol Version 6 (IPv6) Specification";
+  }
+
+  identity PARAM_PROBLEM_CODE {
+    base CODE;
+    description
+      "Subcodes for the Parameter Problem ICMPv6 type.";
+  }
+
+  identity PARAM_PROBLEM_ERR_HDR_FIELD {
+    base PARAM_PROBLEM_CODE;
+    description
+      "Erroneous header field encountered.";
+    reference "RFC4443: Internet Control Message Protocol (ICMPv6)
+              for the Internet Protocol Version 6 (IPv6) Specification";
+  }
+
+  identity PARAM_PROBLEM_UNRECOGNIZED_NET_HDR_TYPE {
+    base PARAM_PROBLEM_CODE;
+    description
+      "Unrecognized Next Header type encountered.";
+    reference "RFC4443: Internet Control Message Protocol (ICMPv6)
+              for the Internet Protocol Version 6 (IPv6) Specification";
+  }
+
+  identity PARAM_PROBLEM_UNRECOGNIZED_IPV6_OPT {
+    base PARAM_PROBLEM_CODE;
+    description
+      "Unrecognized IPv6 option encountered.";
+    reference "RFC4443: Internet Control Message Protocol (ICMPv6)
+              for the Internet Protocol Version 6 (IPv6) Specification";
+  }
+
+  identity PARAM_PROBLEM_INCOMPLETE_HDR_CHAIN {
+    base PARAM_PROBLEM_CODE;
+    description
+      "IPv6 First Fragment has incomplete IPv6 Header Chain.";
+    reference
+      "RFC7112: Implications of Oversized IPv6 Header Chains";
+  }
+
+  identity PARAM_PROBLEM_SR_UPPER_HDR_ERR {
+    base PARAM_PROBLEM_CODE;
+    description
+      "SR Upper-layer Header Error";
+    reference
+      "RFC8754: IPv6 Segment Routing Header (SRH)";
+  }
+
+  identity PARAM_PROBLEM_UNRECOGNIZED_NEXT_HDR_TYPE {
+    base PARAM_PROBLEM_CODE;
+    description
+      "Unrecognized Next Header type encountered by intermediate node";
+    reference
+      "RFC8883: ICMPv6 Errors for Discarding Packets Due to Processing Limits";
+  }
+
+  identity PARAM_PROBLEM_EXT_HDR_TOO_BIG {
+    base PARAM_PROBLEM_CODE;
+    description
+      "Extension header too big.";
+    reference
+      "RFC8883: ICMPv6 Errors for Discarding Packets Due to Processing Limits";
+  }
+
+  identity PARAM_PROBLEM_EXT_HDR_CHAIN_TOO_LONG {
+    base PARAM_PROBLEM_CODE;
+    description
+      "Extension header chain too long.";
+    reference
+      "RFC8883: ICMPv6 Errors for Discarding Packets Due to Processing Limits";
+  }
+
+  identity PARAM_PROBLEM_TOO_MANY_EXT_HDRS {
+    base PARAM_PROBLEM_CODE;
+    description
+      "Too many extension headers.";
+    reference
+      "RFC8883: ICMPv6 Errors for Discarding Packets Due to Processing Limits";
+  }
+
+  identity PARAM_PROBLEM_TOO_MANY_OPTS {
+    base PARAM_PROBLEM_CODE;
+    description
+      "Too many options in extension header.";
+    reference
+      "RFC8883: ICMPv6 Errors for Discarding Packets Due to Processing Limits";
+  }
+
+  identity PARAM_PROBLEM_OPT_TOO_BIG {
+    base PARAM_PROBLEM_CODE;
+    description
+      "Option too big.";
+    reference
+      "RFC8883: ICMPv6 Errors for Discarding Packets Due to Processing Limits";
+  }
+
+  identity ECHO_REQUEST_CODE {
+    base CODE;
+    description
+      "Subcodes for the ICMPv6 echo request type.";
+  }
+
+  identity ECHO_REQUEST_NO_CODE {
+    base ECHO_REQUEST_CODE;
+    description
+      "No code.";
+    reference "RFC4443: Internet Control Message Protocol (ICMPv6)
+              for the Internet Protocol Version 6 (IPv6) Specification";
+  }
+
+  identity ECHO_REPLY_CODE {
+    base CODE;
+    description
+      "Subcodes for the ICMPv6 echo reply subcode.";
+  }
+
+  identity ECHO_REPLY_NO_CODE {
+    base ECHO_REPLY_CODE;
+    description
+      "No code.";
+    reference "RFC4443: Internet Control Message Protocol (ICMPv6)
+              for the Internet Protocol Version 6 (IPv6) Specification";
+  }
+
+  identity MULTICAST_LISTENER_QUERY_CODE {
+    base CODE;
+    description
+      "Subcodes for the multicast listener query ICMPv6 type.";
+  }
+
+  identity MULTICAST_LISTENER_QUERY_NO_CODE {
+    base MULTICAST_LISTENER_QUERY_CODE;
+    description
+      "No code.";
+    reference
+      "RFC2710: Multicast Listener Discovery (MLD) for IPv6";
+  }
+
+  identity MULTICAST_LISTENER_REPORT_CODE {
+    base CODE;
+    description
+      "Subcodes for the multicast listener report ICMPv6 type.";
+  }
+
+  identity MULTICAST_LISTENER_REPORT_NO_CODE {
+    base MULTICAST_LISTENER_REPORT_CODE;
+    description
+      "No code.";
+    reference
+      "RFC2710: Multicast Listener Discovery (MLD) for IPv6";
+  }
+
+  identity MULTICAST_LISTENER_DONE_CODE {
+    base CODE;
+    description
+      "Subcodes for the multicast listener done ICMPv6 type.";
+  }
+
+  identity MULTICAST_LISTENER_DONE_NO_CODE {
+    base MULTICAST_LISTENER_DONE_CODE;
+    description
+      "No code.";
+    reference
+      "RFC2710: Multicast Listener Discovery (MLD) for IPv6";
+  }
+
+  identity ROUTER_SOLICITATION_CODE {
+    base CODE;
+    description
+      "Subcodes for the router solicitation ICMPv6 type.";
+  }
+  identity ROUTER_SOLICITATION_NO_CODE {
+    base ROUTER_SOLICITATION_CODE;
+    description
+      "No code.";
+    reference
+      "RFC4861: Neighbor Discovery for IP version 6 (IPv6)";
+  }
+
+  identity ROUTER_ADVERTISEMENT_CODE {
+    base CODE;
+    description
+      "Subcodes for the router advertisement ICMPv6 type.";
+  }
+
+  identity ROUTER_ADVERTISEMENT_NO_CODE {
+    base ROUTER_ADVERTISEMENT_CODE;
+    description
+      "No code.";
+    reference
+      "RFC4861: Neighbor Discovery for IP version 6 (IPv6)";
+  }
+
+  identity NEIGHBOR_SOLICITATION_CODE {
+    base CODE;
+    description
+      "Subcodes for the router solicitation ICMPv6 type.";
+  }
+
+  identity NEIGHBOR_SOLICITATION_NO_CODE {
+    base NEIGHBOR_SOLICITATION_CODE;
+    description
+      "No code.";
+    reference
+      "RFC4861: Neighbor Discovery for IP version 6 (IPv6)";
+  }
+
+  identity NEIGHBOR_ADVERTISEMENT_CODE {
+    base CODE;
+    description
+      "Subcodes for the neighbor advertisement ICMPv6 type.";
+  }
+
+  identity NEIGHBOR_ADVERTISEMENT_NO_CODE {
+    base NEIGHBOR_ADVERTISEMENT_CODE;
+    description
+      "No code.";
+    reference
+      "RFC4861: Neighbor Discovery for IP version 6 (IPv6)";
+  }
+
+  identity REDIRECT_CODE {
+    base CODE;
+    description
+      "Subcodes for the redirect ICMPv6 type.";
+  }
+
+  identity REDIRECT_NO_CODE {
+    base REDIRECT_CODE;
+    description
+      "No code.";
+    reference
+      "RFC4861: Neighbor Discovery for IP version 6 (IPv6)";
+  }
+
+  identity RENUMBERING_CODE {
+    base CODE;
+    description
+      "Subcodes for the redirect ICMPv6 type for renumbering.";
+  }
+
+  identity RENUMBERING_COMMAND {
+    base RENUMBERING_CODE;
+    description
+      "Router renumbering command.";
+    reference
+      "RFC2894: Router Renumbering for IPv6";
+  }
+
+  identity RENUNBERING_RESULT {
+    base RENUMBERING_CODE;
+    description
+      "Router renumbering result.";
+    reference
+      "RFC2894: Router Renumbering for IPv6";
+  }
+
+  identity RENUNBERING_SEQ_NUM_RESET {
+    base RENUMBERING_CODE;
+    description
+      "Router renumbering sequence number reset.";
+    reference
+      "RFC2894: Router Renumbering for IPv6";
+  }
+
+  identity NODE_INFORMATION_QUERY_CODE {
+    base CODE;
+    description
+      "Subcodes for the node information query ICMPv6 type.";
+  }
+
+  identity NODE_INFORMATION_QUERY_IPV6_ADDR {
+    base NODE_INFORMATION_QUERY_CODE;
+    description
+      "The data field contains an IPv6 address which is the subject of the
+      query.";
+    reference
+      "RFC4620: IPv6 Node Information Queries";
+  }
+
+  identity NODE_INFORMATION_QUERY_NAME {
+    base NODE_INFORMATION_QUERY_CODE;
+    description
+      "The data field contains a name which is the subject of the
+      query.";
+    reference
+      "RFC4620: IPv6 Node Information Queries";
+  }
+
+  identity NODE_INFORMATION_QUERY_IPV4_ADDR {
+    base NODE_INFORMATION_QUERY_CODE;
+    description
+      "The data field contains an IPv4 address which is the subject of the
+      query.";
+    reference
+      "RFC4620: IPv6 Node Information Queries";
+  }
+
+  identity NDDE_INFORMATION_RESPONSE_CODE {
+    base CODE;
+    description
+      "Subcodes for the node information response ICMPv6 type.";
+  }
+
+  identity NODE_INFORMATION_RESPONSE_SUCCESS {
+    base NDDE_INFORMATION_RESPONSE_CODE;
+    description
+      "A successful reply.";
+    reference
+      "RFC4620: IPv6 Node Information Queries";
+  }
+
+  identity NODE_INFORMATION_RESPONSE_REFUSED {
+    base NDDE_INFORMATION_RESPONSE_CODE;
+    description
+      "The responder refuses to supply the answer.";
+    reference
+      "RFC4620: IPv6 Node Information Queries";
+  }
+
+  identity NODE_INFORMATION_RESPONSE_UNKNOWN {
+    base NDDE_INFORMATION_RESPONSE_CODE;
+    description
+      "The query type is unknown to the responder.";
+    reference
+      "RFC4620: IPv6 Node Information Queries";
+  }
+
+  identity INVERSE_NEIGHBOR_ADVERTISEMENT_CODE {
+    base CODE;
+    description
+      "Subcodes for the Inverse Neighbor Discovery ICMPv6 type.";
+  }
+
+  identity INVERSE_NEIGHBOR_ADVERTISEMENT_NO_CODE {
+    base INVERSE_NEIGHBOR_ADVERTISEMENT_CODE;
+    description
+      "No code.";
+    reference
+      "RFC3122: Extensions to IPv6 Neighbor Discovery for Inverse Discovery
+      Specification";
+  }
+
+  identity INVERSE_NEIGHBOR_SOLICITATION_CODE {
+    base CODE;
+    description
+      "Subcode for the inverse neighbor solicitation ICMP6 type.";
+  }
+
+  identity INVERSE_NEIGHBOR_SOLICITATION_NO_CODE {
+    base INVERSE_NEIGHBOR_SOLICITATION_CODE;
+    description
+      "No code.";
+    reference
+      "RFC3122: Extensions to IPv6 Neighbor Discovery for Inverse Discovery
+      Specification";
+  }
+
+  identity HOME_AGENT_ADDRESS_DISCOVERY_REQUEST_CODE {
+    base CODE;
+    description
+      "Subcodes for the Home Agent Address Discovery Request ICMPv6 type.";
+  }
+
+  identity HOME_AGENT_ADDRESS_DISCOVERY_REQUEST_NO_CODE {
+    base HOME_AGENT_ADDRESS_DISCOVERY_REQUEST_CODE;
+    description
+      "No code.";
+    reference "RFC3775: Mobility Support in IPv6";
+  }
+
+  identity HOME_AGENT_ADDRESS_DISCOVERY_REPLY_CODE {
+    base CODE;
+    description
+      "Subcodes for the Home Agent Address Discovery Reply ICMPv6 type.";
+  }
+
+  identity HOME_AGENT_ADDRESS_DISCOVERY_REPLY_NO_CODE {
+    base HOME_AGENT_ADDRESS_DISCOVERY_REPLY_CODE;
+    description
+      "No code.";
+    reference "RFC3775: Mobility Support in IPv6";
+  }
+
+  identity MOBILE_PREFIX_SOLICITATION_CODE {
+    base CODE;
+    description
+      "Subcodes for the Mobile Prefix Solicitation ICMPv6 type.";
+  }
+
+  identity MOBILE_PREFIX_SOLICITATION_NO_CODE {
+    base MOBILE_PREFIX_SOLICITATION_CODE;
+    description
+      "No code.";
+    reference "RFC3775: Mobility Support in IPv6";
+  }
+
+  identity MOBILE_PREFIX_ADVERTISEMENT_CODE {
+    base CODE;
+    description
+      "Subcodes for the Mobile Prefix Advertisement ICMPv6 type.";
+  }
+
+  identity MOBILE_PREFIX_ADVERTISEMENT_NO_CODE {
+    base MOBILE_PREFIX_ADVERTISEMENT_CODE;
+    description
+      "No code.";
+    reference "RFC3775: Mobility Support in IPv6";
+  }
+
+  identity DUPLICATE_ADDRESS_REQUEST_CODE {
+    base CODE;
+    description
+      "Subcodes for the Duplicate Address Request ICMPv6 type.";
+  }
+
+  identity DUPLICATE_ADDRESS_REQUEST_DAR {
+    base DUPLICATE_ADDRESS_REQUEST_CODE;
+    description
+      "DAR message";
+    reference "RFC6775: Neighbor Discovery Optimization for IPv6 over
+              Low-Power Wireless Personal Area Networks (6LoWPANs)";
+  }
+
+  identity DUPLICATE_ADDRESS_REQUEST_EDAR_ROVR64 {
+    base DUPLICATE_ADDRESS_REQUEST_CODE;
+    description
+      "EDAR message with 64-bit ROVR field.";
+    reference "RFC6775: Neighbor Discovery Optimization for IPv6 over
+              Low-Power Wireless Personal Area Networks (6LoWPANs)";
+  }
+
+  identity DUPLICATE_ADDRESS_REQUEST_EDAR_ROVR128 {
+    base DUPLICATE_ADDRESS_REQUEST_CODE;
+    description
+      "EDAR message with 128-bit ROVR field.";
+    reference "RFC6775: Neighbor Discovery Optimization for IPv6 over
+              Low-Power Wireless Personal Area Networks (6LoWPANs)";
+  }
+
+  identity DUPLICATE_ADDRESS_REQUEST_EDAR_ROVR192 {
+    base DUPLICATE_ADDRESS_REQUEST_CODE;
+    description
+      "EDAR message with 192-bit ROVR field.";
+    reference "RFC6775: Neighbor Discovery Optimization for IPv6 over
+              Low-Power Wireless Personal Area Networks (6LoWPANs)";
+  }
+
+  identity DUPLICATE_ADDRESS_REQUEST_EDAR_ROVR256 {
+    base DUPLICATE_ADDRESS_REQUEST_CODE;
+    description
+      "EDAR message with 256-bit ROVR field.";
+    reference "RFC6775: Neighbor Discovery Optimization for IPv6 over
+              Low-Power Wireless Personal Area Networks (6LoWPANs)";
+  }
+
+  identity DUPLICATE_ADDRESS_REPLY_CODE {
+    base CODE;
+    description
+      "Subcodes for the Duplicate Address Confirmation Code ICMPv6 type.";
+  }
+
+  identity DUPLICATE_ADDRESS_REPLY_DAC {
+    base DUPLICATE_ADDRESS_REPLY_CODE;
+    description
+      "DAC message";
+    reference "RFC6775: Neighbor Discovery Optimization for IPv6 over
+              Low-Power Wireless Personal Area Networks (6LoWPANs)";
+  }
+  identity DUPLICATE_ADDRESS_REPLY_EDAC_ROVR64 {
+    base DUPLICATE_ADDRESS_REPLY_CODE;
+    description
+      "EDAC message with 64-bit ROVR field.";
+    reference "RFC6775: Neighbor Discovery Optimization for IPv6 over
+              Low-Power Wireless Personal Area Networks (6LoWPANs)";
+  }
+
+  identity DUPLICATE_ADDRESS_REPLY_EDAC_ROVR128 {
+    base DUPLICATE_ADDRESS_REPLY_CODE;
+    description
+      "EDAC message with 128-bit ROVR field.";
+    reference "RFC6775: Neighbor Discovery Optimization for IPv6 over
+              Low-Power Wireless Personal Area Networks (6LoWPANs)";
+  }
+
+  identity DUPLICATE_ADDRESS_REPLY_EDAC_ROVR192 {
+    base DUPLICATE_ADDRESS_REPLY_CODE;
+    description
+      "EDAC message with 192-bit ROVR field.";
+    reference "RFC6775: Neighbor Discovery Optimization for IPv6 over
+              Low-Power Wireless Personal Area Networks (6LoWPANs)";
+  }
+
+  identity DUPLICATE_ADDRESS_REPLY_EDAC_ROVR256 {
+    base DUPLICATE_ADDRESS_REPLY_CODE;
+    description
+      "EDAC message with 256-bit ROVR field.";
+    reference "RFC6775: Neighbor Discovery Optimization for IPv6 over
+              Low-Power Wireless Personal Area Networks (6LoWPANs)";
+  }
+
+  identity EXT_ECHO_REQUEST_CODE {
+    base CODE;
+    description
+      "Subcodes for the extended echo request ICMPv6 type.";
+  }
+
+  identity EXT_ECHO_REQUEST_NO_ERROR {
+    base EXT_ECHO_REQUEST_CODE;
+    description
+      "No error.";
+    reference
+      "RFC8355: PROBE: A Utility for Probing Interfaces";
+  }
+
+  identity EXT_ECHO_REPLY_CODE {
+    base CODE;
+    description
+      "Subcodes for the extended echo reply ICMPv6 type.";
+  }
+
+  identity EXT_ECHO_REPLY_NO_ERROR {
+    base EXT_ECHO_REPLY_CODE;
+    description
+      "No error.";
+    reference
+      "RFC8355: PROBE: A Utility for Probing Interfaces";
+  }
+
+  identity EXT_ECHO_REPLY_MALFORMED_QUERY {
+    base EXT_ECHO_REPLY_CODE;
+    description
+      "Malformed query.";
+    reference
+      "RFC8355: PROBE: A Utility for Probing Interfaces";
+  }
+
+  identity EXT_ECHO_REPLY_NO_SUCH_INTERFACE {
+    base EXT_ECHO_REPLY_CODE;
+    description
+      "No such interface.";
+    reference
+      "RFC8355: PROBE: A Utility for Probing Interfaces";
+  }
+
+  identity EXT_ECHO_REPLY_NO_SUCH_TABLE_ENTRY {
+    base EXT_ECHO_REPLY_CODE;
+    description
+      "No such table entry.";
+    reference
+      "RFC8355: PROBE: A Utility for Probing Interfaces";
+  }
+
+  identity EXT_ECHO_REPLY_MULTIPLE_INTF_SATISFY_QUERY {
+    base EXT_ECHO_REPLY_CODE;
+    description
+      "Multiple interfaces satisfy query.";
+    reference
+      "RFC8355: PROBE: A Utility for Probing Interfaces";
+  }
+}
diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-packet-match-types.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-packet-match-types.yang
new file mode 100644
index 000000000..b5f467a74
--- /dev/null
+++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-packet-match-types.yang
@@ -0,0 +1,374 @@
+module openconfig-packet-match-types {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/packet-match-types";
+
+  prefix "oc-pkt-match-types";
+
+  // import some basic types
+  import openconfig-inet-types { prefix oc-inet; }
+  import openconfig-extensions { prefix oc-ext; }
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module defines common types for use in models requiring
+    data definitions related to packet matches.";
+
+  oc-ext:openconfig-version "1.3.3";
+
+  revision "2023-01-29" {
+    description
+      "Whitespace cleanup.";
+    reference "1.3.3";
+  }
+
+  revision "2021-07-14" {
+    description
+      "Use auto-generated regex for port-num-range pattern statements";
+    reference "1.3.2";
+  }
+
+  revision "2021-06-16" {
+    description
+      "Remove trailing whitespace.";
+    reference "1.3.1";
+  }
+
+  revision "2021-05-19" {
+    description
+      "Add IP-in-IP protocol.";
+    reference "1.3.0";
+  }
+
+  revision "2021-03-17" {
+    description
+      "Add MPLS filter Support.";
+      reference "1.2.0";
+  }
+
+  revision "2021-01-07" {
+    description
+      "Remove module extension oc-ext:regexp-posix by making pattern regexes
+      conform to RFC7950.
+
+      Types impacted:
+      - port-num-range";
+    reference "1.1.0";
+  }
+
+  revision "2020-10-20" {
+    description
+      "Fix pattern regex for port-num-range.";
+    reference "1.0.4";
+  }
+
+  revision "2020-06-30" {
+    description
+      "Add OpenConfig POSIX pattern extensions.";
+    reference "1.0.3";
+  }
+
+  revision "2018-11-21" {
+    description
+      "Add OpenConfig module metadata extensions.";
+    reference "1.0.2";
+  }
+
+  revision "2018-04-15" {
+    description
+        "Corrected description and range for ethertype typedef";
+    reference "1.0.1";
+  }
+
+  revision "2017-05-26" {
+    description
+        "Separated IP matches into AFs";
+    reference "1.0.0";
+  }
+
+    revision "2016-08-08" {
+    description
+      "OpenConfig public release";
+    reference "0.2.0";
+  }
+
+  revision "2016-04-27" {
+    description
+      "Initial revision";
+    reference "TBD";
+  }
+
+  // OpenConfig specific extensions for module metadata.
+  oc-ext:catalog-organization "openconfig";
+  oc-ext:origin "openconfig";
+
+
+  // extension statements
+
+  // feature statements
+
+  // identity statements
+
+
+  //TODO: should replace this with an official IEEE module
+  // when available.  Only a select number of types are
+  // defined in this identity.
+  identity ETHERTYPE {
+    description
+      "Base identity for commonly used Ethertype values used
+      in packet header matches on Ethernet frames.  The Ethertype
+      indicates which protocol is encapsulated in the Ethernet
+      payload.";
+    reference
+      "IEEE 802.3";
+  }
+
+  identity ETHERTYPE_IPV4 {
+    base ETHERTYPE;
+    description
+      "IPv4 protocol (0x0800)";
+  }
+
+  identity ETHERTYPE_ARP {
+    base ETHERTYPE;
+    description
+      "Address resolution protocol (0x0806)";
+  }
+
+  identity ETHERTYPE_VLAN {
+    base ETHERTYPE;
+    description
+      "VLAN-tagged frame (as defined by IEEE 802.1q) (0x8100). Note
+      that this value is also used to represent Shortest Path
+      Bridging (IEEE 801.1aq) frames.";
+  }
+
+  identity ETHERTYPE_IPV6 {
+    base ETHERTYPE;
+    description
+      "IPv6 protocol (0x86DD)";
+  }
+
+  identity ETHERTYPE_MPLS {
+    base ETHERTYPE;
+    description
+      "MPLS unicast (0x8847)";
+  }
+
+  identity ETHERTYPE_LLDP {
+    base ETHERTYPE;
+    description
+      "Link Layer Discovery Protocol (0x88CC)";
+  }
+
+  identity ETHERTYPE_ROCE {
+    base ETHERTYPE;
+    description
+      "RDMA over Converged Ethernet (0x8915)";
+  }
+
+
+  //TODO: should replace this with an official IANA module when
+  //available.  Only a select set of protocols are defined with
+  //this identity.
+  identity IP_PROTOCOL {
+    description
+      "Base identity for commonly used IP protocols used in
+      packet header matches";
+    reference
+      "IANA Assigned Internet Protocol Numbers";
+  }
+
+  identity IP_TCP {
+    base IP_PROTOCOL;
+    description
+      "Transmission Control Protocol (6)";
+  }
+
+  identity IP_UDP  {
+    base IP_PROTOCOL;
+    description
+      "User Datagram Protocol (17)";
+  }
+
+  identity IP_ICMP {
+    base IP_PROTOCOL;
+    description
+      "Internet Control Message Protocol (1)";
+  }
+
+  identity IP_IGMP {
+    base IP_PROTOCOL;
+    description
+      "Internet Group Membership Protocol (2)";
+  }
+
+  identity IP_PIM {
+    base IP_PROTOCOL;
+    description
+      "Protocol Independent Multicast (103)";
+  }
+
+  identity IP_RSVP {
+    base IP_PROTOCOL;
+    description
+      "Resource Reservation Protocol (46)";
+  }
+
+  identity IP_GRE {
+    base IP_PROTOCOL;
+    description
+      "Generic Routing Encapsulation (47)";
+  }
+
+  identity IP_AUTH {
+    base IP_PROTOCOL;
+    description
+      "Authentication header, e.g., for IPSEC (51)";
+  }
+
+  identity IP_L2TP {
+    base IP_PROTOCOL;
+    description
+      "Layer Two Tunneling Protocol v.3 (115)";
+  }
+
+  identity IP_IN_IP {
+    base IP_PROTOCOL;
+    description
+      "IP-in-IP tunneling (4)";
+    reference
+      "RFC2003: IP Encapsulation within IP";
+  }
+
+  identity TCP_FLAGS {
+    description
+      "Common TCP flags used in packet header matches";
+    reference
+      "IETF RFC 793 - Transmission Control Protocol
+      IETF RFC 3168 - The Addition of Explicit Congestion
+      Notification (ECN) to IP";
+  }
+
+  identity TCP_SYN {
+    base TCP_FLAGS;
+    description
+      "TCP SYN flag";
+  }
+
+  identity TCP_FIN {
+    base TCP_FLAGS;
+    description
+      "TCP FIN flag";
+  }
+
+  identity TCP_RST {
+    base TCP_FLAGS;
+    description
+      "TCP RST flag";
+  }
+
+  identity TCP_PSH {
+    base TCP_FLAGS;
+    description
+      "TCP push flag";
+  }
+
+  identity TCP_ACK {
+    base TCP_FLAGS;
+    description
+      "TCP ACK flag";
+  }
+
+  identity TCP_URG {
+    base TCP_FLAGS;
+    description
+      "TCP urgent flag";
+  }
+
+  identity TCP_ECE {
+    base TCP_FLAGS;
+    description
+      "TCP ECN-Echo flag.  If the SYN flag is set, indicates that
+      the TCP peer is ECN-capable, otherwise indicates that a
+      packet with Congestion Experienced flag in the IP header
+      is set";
+  }
+
+  identity TCP_CWR {
+    base TCP_FLAGS;
+    description
+      "TCP Congestion Window Reduced flag";
+  }
+
+  // typedef statements
+
+  typedef port-num-range {
+    type union {
+      type string {
+        pattern
+          '(0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|'
+          + '0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|'
+          + '655[0-2][0-9]|6553[0-5])\.\.(0{0,4}[0-9]|0{0,3}[1-9][0-9]|'
+          + '0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|'
+          + '6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])';
+        oc-ext:posix-pattern
+          '^((0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|'
+          + '0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|'
+          + '655[0-2][0-9]|6553[0-5])\.\.(0{0,4}[0-9]|0{0,3}[1-9][0-9]|'
+          + '0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|'
+          + '6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))$';
+      }
+      type oc-inet:port-number;
+      type enumeration {
+        enum ANY {
+          description
+            "Indicates any valid port number (e.g., wildcard)";
+        }
+      }
+    }
+    description
+      "Port numbers may be represented as a single value,
+      an inclusive range as .., or as ANY to
+      indicate a wildcard.";
+  }
+
+  typedef ip-protocol-type {
+    type union {
+      type uint8 {
+        range 0..254;
+      }
+      type identityref {
+        base IP_PROTOCOL;
+      }
+    }
+    description
+      "The IP protocol number may be expressed as a valid protocol
+      number (integer) or using a protocol type defined by the
+      IP_PROTOCOL identity";
+  }
+
+  typedef ethertype-type {
+    type union {
+      type uint16 {
+        range 1536..65535;
+      }
+      type identityref {
+        base ETHERTYPE;
+      }
+    }
+    description
+      "The Ethertype value may be expressed as a 16-bit number in
+      decimal notation, or using a type defined by the
+      ETHERTYPE identity";
+  }
+}
diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-packet-match.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-packet-match.yang
new file mode 100644
index 000000000..c28798664
--- /dev/null
+++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/acl/openconfig-packet-match.yang
@@ -0,0 +1,727 @@
+module openconfig-packet-match {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/header-fields";
+
+  prefix "oc-pkt-match";
+
+  // import some basic types
+  import openconfig-inet-types { prefix oc-inet; }
+  import openconfig-yang-types { prefix oc-yang; }
+  import openconfig-packet-match-types { prefix oc-pkt-match-types; }
+  import openconfig-extensions { prefix oc-ext; }
+  import openconfig-mpls-types { prefix oc-mpls; }
+  import openconfig-defined-sets { prefix oc-sets; }
+  import openconfig-icmpv4-types { prefix oc-icmpv4-types; }
+  import openconfig-icmpv6-types { prefix oc-icmpv6-types; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module defines data related to packet header fields
+    used in matching operations, for example in ACLs.  When a
+    field is omitted from a match expression, the effect is a
+    wildcard ('any') for that field.";
+
+
+  oc-ext:openconfig-version "2.1.0";
+
+  revision "2023-03-01" {
+    description
+      "Add ICMP Fields for filtering.";
+    reference "2.1.0";
+  }
+
+  revision "2023-01-27" {
+    description
+      "Update the mechanism to match detailed transport flags,
+      adding means for AND/OR in the explicitly specified flags
+      and commonly supported match aliases.";
+    reference "2.0.0";
+  }
+
+  revision "2022-06-01" {
+    description
+      "Add the ability to match source/destination ipv4 and
+      ipv6 prefix list and source/destination port list ";
+    reference "1.4.0";
+  }
+
+  revision "2021-06-16" {
+    description
+      "Remove trailing whitespace.";
+    reference "1.3.1";
+  }
+
+  revision "2021-05-19" {
+    description
+      "Add the ability to match multiple DSCPs in a rule.";
+    reference "1.3.0";
+  }
+
+  revision "2021-03-17" {
+    description
+      "Add MPLS filter Support.";
+      reference "1.2.0";
+  }
+
+  revision "2018-11-21" {
+    description
+      "Add OpenConfig module metadata extensions.";
+    reference "1.1.1";
+  }
+
+  revision "2017-12-15" {
+    description
+      "Add MPLS packet field matches";
+    reference "1.1.0";
+  }
+
+  revision "2017-05-26" {
+    description
+      "Separated IP matches into AFs";
+    reference "1.0.0";
+  }
+
+  revision "2016-08-08" {
+    description
+      "OpenConfig public release";
+    reference "0.2.0";
+  }
+
+  revision "2016-04-27" {
+    description
+      "Initial revision";
+    reference "TBD";
+  }
+
+  // OpenConfig specific extensions for module metadata.
+  oc-ext:regexp-posix;
+  oc-ext:catalog-organization "openconfig";
+  oc-ext:origin "openconfig";
+
+
+  // Physical Layer fields
+  // ethernet-header
+  grouping ethernet-header-config {
+    description
+      "Configuration data of fields in Ethernet header.";
+
+    leaf source-mac {
+      type oc-yang:mac-address;
+      description
+        "Source IEEE 802 MAC address.";
+    }
+
+    leaf source-mac-mask {
+      type oc-yang:mac-address;
+      description
+        "Source IEEE 802 MAC address mask.";
+    }
+
+    leaf destination-mac {
+      type oc-yang:mac-address;
+      description
+        "Destination IEEE 802 MAC address.";
+    }
+
+    leaf destination-mac-mask {
+      type oc-yang:mac-address;
+      description
+        "Destination IEEE 802 MAC address mask.";
+    }
+
+    leaf ethertype {
+      type oc-pkt-match-types:ethertype-type;
+      description
+        "Ethertype field to match in Ethernet packets";
+    }
+  }
+
+  grouping ethernet-header-state {
+    description
+      "State information of fields in Ethernet header.";
+  }
+
+  grouping ethernet-header-top {
+    description
+      "Top level container for fields in Ethernet header.";
+
+    container l2 {
+      description
+        "Ethernet header fields";
+
+      container config {
+        description
+          "Configuration data";
+        uses ethernet-header-config;
+      }
+
+      container state {
+        config false;
+        description
+          "State Information.";
+        uses ethernet-header-config;
+        uses ethernet-header-state;
+      }
+    }
+  }
+
+  grouping mpls-header-top {
+    description
+      "Top-level container for fields in an MPLS header.";
+
+    container mpls {
+      description
+        "MPLS header fields";
+
+      container config {
+        description
+          "Configuration parameters relating to fields within
+          the MPLS header.";
+        uses mpls-header-config;
+      }
+
+      container state {
+        config false;
+        description
+          "Operational state parameters relating to fields
+          within the MPLS header";
+        uses mpls-header-config;
+      }
+    }
+  }
+
+  grouping mpls-header-config {
+    description
+      "Configuration parameters relating to matches within
+      MPLS header fields.";
+
+    leaf traffic-class {
+      type oc-mpls:mpls-tc;
+      description
+        "The value of the MPLS traffic class (TC) bits,
+        formerly known as the EXP bits.";
+    }
+
+    leaf start-label-value {
+      type oc-mpls:mpls-label;
+      description
+        "Match MPLS label value on the MPLS header.
+        The usage of this field indicated the upper
+        range value in the top of the stack.
+        The range that is used is inclusive. The match that
+        is done for a particular received pkt_label is:
+        start-label-value <= pkt_label <= end-label-value.
+        The 20-bit label value in an MPLS label
+        stack as specified in RFC 3032.
+        This label value does not include the
+        encodings of Traffic Class and TTL.";
+      }
+
+    leaf end-label-value {
+      type oc-mpls:mpls-label;
+      description
+        "Match MPLS label value on the MPLS header.
+        The usage of this field indicated the upper
+        range value in the top of the stack.
+        The range that is used is inclusive. The match that
+        is done for a particular received pkt_label is:
+        start-label-value <= pkt_label <= end-label-value.
+        The 20-bit label value in an MPLS label
+        stack as specified in RFC 3032.
+        This label value does not include the
+        encodings of Traffic Class and TTL.";
+      }
+
+    leaf ttl-value {
+      type uint8;
+      description
+        "Time-to-live MPLS packet value match.";
+      reference
+        "RFC 3032: MPLS Label Stack Encoding.";
+    }
+  }
+
+  grouping ip-protocol-fields-common-config {
+    description
+      "IP protocol fields common to IPv4 and IPv6";
+
+    leaf dscp {
+      type oc-inet:dscp;
+      description
+        "Value of diffserv codepoint.";
+    }
+
+    leaf-list dscp-set {
+      type oc-inet:dscp;
+      description
+        "A list of DSCP values to be matched for incoming packets. AN OR match should
+        be performed, such that a packet must match one of the values defined in this
+        list. If the field is left empty then any DSCP value matches unless the 'dscp'
+        leaf is specified. It is not valid to specify both 'dscp' and 'dscp-set together.'";
+    }
+
+    leaf length {
+      type uint16;
+      description
+        "In the IPv4 header field, this field is known as the Total
+         Length.  Total Length is the length of the datagram, measured
+         in octets, including internet header and data.
+         In the IPv6 header field, this field is known as the Payload
+         Length, which is the length of the IPv6 payload, i.e., the rest
+         of the packet following the IPv6 header, in octets.";
+      reference
+        "RFC 791: Internet Protocol
+         RFC 8200: Internet Protocol, Version 6 (IPv6) Specification.";
+    }
+
+    leaf protocol {
+      type oc-pkt-match-types:ip-protocol-type;
+      description
+        "The protocol carried in the IP packet, expressed either
+        as its IP protocol number, or by a defined identity.";
+    }
+
+    leaf hop-limit {
+      type uint8 {
+        range 0..255;
+      }
+      description
+        "The IP packet's hop limit -- known as TTL (in hops) in
+        IPv4 packets, and hop limit in IPv6";
+    }
+  }
+
+  // IP Layer
+  // ip-protocol-fields
+  grouping ipv4-protocol-fields-config {
+    description
+      "Configuration data of IP protocol fields
+      for IPv4";
+
+    leaf source-address {
+      type oc-inet:ipv4-prefix;
+      description
+        "Source IPv4 address prefix.";
+    }
+
+    leaf source-address-prefix-set {
+      type leafref {
+         path "/oc-sets:defined-sets/oc-sets:ipv4-prefix-sets"
+            + "/oc-sets:ipv4-prefix-set/oc-sets:name";
+       }
+      description
+          "Reference to a IPv4 address prefix Set
+          to match the source address";
+    }
+
+    leaf destination-address {
+      type oc-inet:ipv4-prefix;
+      description
+        "Destination IPv4 address prefix.";
+    }
+
+    leaf destination-address-prefix-set {
+      type leafref {
+         path "/oc-sets:defined-sets/oc-sets:ipv4-prefix-sets"
+            + "/oc-sets:ipv4-prefix-set/oc-sets:name";
+       }
+      description
+          "Reference to a IPv4 address prefix set
+          to match the destination address";
+    }
+
+    uses ip-protocol-fields-common-config;
+
+  }
+
+  grouping ipv4-protocol-fields-state {
+    description
+      "State information of IP header fields for IPv4";
+  }
+
+  grouping ipv4-protocol-fields-top {
+    description
+      "IP header fields for IPv4";
+
+    container ipv4 {
+      description
+        "Top level container for IPv4 match field data";
+
+      container config {
+        description
+          "Configuration data for IPv4 match fields";
+        uses ipv4-protocol-fields-config;
+      }
+
+      container state {
+        config false;
+        description
+          "State information for IPv4 match fields";
+        uses ipv4-protocol-fields-config;
+        uses ipv4-protocol-fields-state;
+      }
+      uses ip-icmpv4-header-fields-top;
+    }
+  }
+
+  grouping ipv6-protocol-fields-config {
+    description
+      "Configuration data for IPv6 match fields";
+
+    leaf source-address {
+      type oc-inet:ipv6-prefix;
+      description
+        "Source IPv6 address prefix.";
+    }
+
+    leaf source-address-prefix-set {
+      type leafref {
+         path "/oc-sets:defined-sets/oc-sets:ipv6-prefix-sets"
+            + "/oc-sets:ipv6-prefix-set/oc-sets:name";
+       }
+      description
+          "Reference to a IPv6 address prefix set
+          to match the source address";
+    }
+
+    leaf source-flow-label {
+      type oc-inet:ipv6-flow-label;
+      description
+        "Source IPv6 Flow label.";
+    }
+
+    leaf destination-address {
+      type oc-inet:ipv6-prefix;
+      description
+        "Destination IPv6 address prefix.";
+    }
+
+    leaf destination-address-prefix-set {
+      type leafref {
+         path "/oc-sets:defined-sets/oc-sets:ipv6-prefix-sets"
+            + "/oc-sets:ipv6-prefix-set/oc-sets:name";
+       }
+      description
+          "Reference to a IPv6 address prefix set
+          to match the destination address";
+    }
+
+    leaf destination-flow-label {
+      type oc-inet:ipv6-flow-label;
+      description
+        "Destination IPv6 Flow label.";
+    }
+
+    uses ip-protocol-fields-common-config;
+  }
+
+  grouping ipv6-protocol-fields-state {
+    description
+      "Operational state data for IPv6 match fields";
+  }
+
+  grouping ipv6-protocol-fields-top {
+    description
+      "Top-level grouping for IPv6 match fields";
+
+    container ipv6 {
+      description
+        "Top-level container for IPv6 match field data";
+
+      container config {
+        description
+          "Configuration data for IPv6 match fields";
+
+        uses ipv6-protocol-fields-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for IPv6 match fields";
+
+        uses ipv6-protocol-fields-config;
+        uses ipv6-protocol-fields-state;
+      }
+      uses ip-icmpv6-header-fields-top;
+    }
+  }
+
+  // Transport fields
+  grouping transport-fields-config {
+    description
+      "Configuration data of transport-layer packet fields";
+
+    leaf source-port {
+      type oc-pkt-match-types:port-num-range;
+      description
+        "Source port or range";
+    }
+
+    leaf source-port-set {
+      type leafref {
+         path "/oc-sets:defined-sets/oc-sets:port-sets"
+            + "/oc-sets:port-set/oc-sets:name";
+       }
+      description
+          "Reference to a port set
+          to match the source port";
+    }
+
+    leaf destination-port {
+      type oc-pkt-match-types:port-num-range;
+      description
+        "Destination port or range";
+    }
+
+    leaf destination-port-set {
+      type leafref {
+         path "/oc-sets:defined-sets/oc-sets:port-sets"
+            + "/oc-sets:port-set/oc-sets:name";
+       }
+      description
+          "Reference to a port set
+          to match the destination port";
+    }
+
+    leaf detail-mode {
+      type enumeration {
+        enum EXPLICIT {
+          description
+            "Specifies that the mode for matching details at the transport
+             layer is to explicitly match transport flags.";
+        }
+        enum BUILTIN {
+          description
+            "Specifies that the mode for matching details at the transport
+            layer is to using implementation built-ins which may map to
+            multiple flags.";
+        }
+      }
+      description
+        "Mode that is used for matching detailed fields at the transport
+        layer. When EXPLICIT is specified, the implementation should
+        match based on the explicit flags that are specified in the
+        corresponding leaf. When BUILTIN is specified, the implementation
+        must expand the contents of the corresponding leaf to the flags
+        and/or fields that match the pre-defined built-in values.";
+    }
+
+    leaf explicit-detail-match-mode {
+      type enumeration {
+        enum ANY {
+          description
+            "Matches of the explicit-detail-flags field are treated as
+            an OR between the values in the list.";
+        }
+        enum ALL {
+          description
+            "Matches of the explicit-details-flags field are treated
+            as an AND of the values in the list.";
+        }
+      }
+      description
+        "Specifies how the contents of the explicit-details-flags list
+        are to be treated. ANY implies that any of the flags may match,
+        where ALL indicates that all the flags must be matched.";
+      when "../detail-mode = 'EXPLICIT'" {
+        description
+          "This leaf is only valid when the mode for matches is specified to
+          be explicit.";
+      }
+    }
+
+    leaf-list explicit-tcp-flags {
+      type identityref {
+        base oc-pkt-match-types:TCP_FLAGS;
+      }
+      description
+        "An explicit list of the TCP flags that are to be matched. The
+        mechanism for the match is specified by the explicit-detail-match-mode
+        leaf.";
+      when "../detail-mode = 'EXPLICIT'" {
+        description
+          "This leaf is only valid when the mode for matches is specified to
+          be explicit.";
+      }
+    }
+
+    leaf builtin-detail {
+      type enumeration {
+        enum TCP_INITIAL {
+          description
+            "Matches the first packet of a TCP session based on a packet
+            not having the ACK flag set, and having the SYN flag set.";
+        }
+        enum TCP_ESTABLISHED {
+          description
+            "Matches an established TCP session based on a packet having
+            the ACK or RST flags set. This does not match the first
+            packet.";
+        }
+        enum FRAGMENT {
+          description
+            "Matches non-zero values of the fragment-offset field, indicating
+            this packet is a follow up to a fragmented datagram.";
+        }
+      }
+      description
+        "Specifies a built-in (alias) for a match condition that matches
+        multiple flags, or specifies particular logic as to the flag matches
+        to be implemented. This leaf is only valid when the detail-match-mode
+        leaf is BUILTIN.";
+      when "../detail-mode = 'BUILTIN'" {
+        description
+          "This leaf is only valid when the mode for matches is specified to
+          be builtin.";
+      }
+    }
+  }
+
+  grouping transport-fields-state {
+    description
+      "State data of transport-fields";
+  }
+
+  grouping transport-fields-top {
+    description
+      "Destination transport-fields top level grouping";
+
+    container transport {
+      description
+        "Transport fields container";
+
+      container config {
+        description
+          "Configuration data";
+        uses transport-fields-config;
+      }
+
+      container state {
+        config false;
+        description
+          "State data";
+        uses transport-fields-config;
+        uses transport-fields-state;
+      }
+    }
+  }
+
+  grouping ip-icmpv4-header-fields-top {
+    description
+      "Top grouping for ICMPv4 filtering";
+
+    container icmpv4 {
+      description
+        "Top container for ICMPv4 filtering";
+
+      container config {
+        description
+          "Configuration attributes for ICMPv4 filtering";
+
+        uses ip-icmpv4-header-fields-config;
+      }
+
+      container state {
+        description
+          "State attributes for ICMPv4 filtering";
+        config false;
+
+        uses ip-icmpv4-header-fields-config;
+      }
+    }
+  }
+
+  grouping ip-icmpv6-header-fields-top {
+    description
+      "Top grouping for ICMPv6 filtering";
+
+    container icmpv6 {
+      description
+        "Top container for ICMPv6 filtering";
+
+      container config {
+        description
+          "Configuration attributes for ICMPv6 filtering";
+
+        uses ip-icmpv6-header-fields-config;
+      }
+
+      container state {
+        description
+          "State attributes for ICMPv6 filtering";
+        config false;
+
+        uses ip-icmpv6-header-fields-config;
+      }
+    }
+  }
+
+  grouping ip-icmpv4-header-fields-config {
+    description
+      "Collection of ICMPv4 header fields that can be
+       used to set up a match filter.";
+
+    leaf type {
+      type identityref {
+        base oc-icmpv4-types:TYPE;
+      }
+      description
+        "ICMPv4 type to be matched.";
+      reference
+        "RFC 792: Internet Control Message Protocol";
+    }
+
+    leaf code {
+      type identityref {
+        base oc-icmpv4-types:CODE;
+      }
+      description
+        "ICMPv4 code to be matched.";
+      reference
+        "RFC 792: Internet Control Message Protocol";
+    }
+  }
+
+  grouping ip-icmpv6-header-fields-config {
+    description
+      "Collection of ICMPv6 header fields that can be
+       used to set up a match filter.";
+
+    leaf type {
+      type identityref {
+        base oc-icmpv6-types:TYPE;
+      }
+      description
+        "ICMPv6 type to be matched.";
+      reference
+        "RFC 4443: Internet Control Message Protocol (ICMPv6)
+                   for Internet Protocol Version 6 (IPv6)
+                   Specification.";
+    }
+
+    leaf code {
+      type identityref {
+        base oc-icmpv6-types:CODE;
+      }
+      description
+        "ICMP code to be matched.";
+      reference
+        "RFC 4443: Internet Control Message Protocol (ICMPv6)
+                   for Internet Protocol Version 6 (IPv6)
+                   Specification.";
+    }
+  }
+
+}
diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/defined-sets/openconfig-defined-sets.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/defined-sets/openconfig-defined-sets.yang
new file mode 100644
index 000000000..0c2a92bec
--- /dev/null
+++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/defined-sets/openconfig-defined-sets.yang
@@ -0,0 +1,227 @@
+module openconfig-defined-sets {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/defined-sets";
+
+  prefix "oc-sets";
+
+  import openconfig-extensions { prefix oc-ext; }
+  import openconfig-inet-types { prefix oc-inet; }
+  import openconfig-packet-match-types { prefix oc-pkt-match-types; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module defines configuration and operational state
+    data for defined sets (sets of IPv4 prefixes, sets of
+    IPv6 prefixes, sets of ports, etc). These sets are used,
+    for example, in network access control lists (i.e., filters,
+    rules, etc.) in the matching fields.";
+
+  oc-ext:openconfig-version "1.0.0";
+
+  revision "2022-12-14" {
+    description
+      "Initial version of the defined set model";
+    reference "1.0.0";
+  }
+
+  // OpenConfig specific extensions for module metadata.
+  oc-ext:catalog-organization "openconfig";
+  oc-ext:origin "openconfig";
+
+  grouping ipv4-prefix-sets-config {
+    description "Configuration parameters of IPv4 prefix sets.";
+
+    leaf name {
+      type string;
+      description
+         "A user defined name of the IPv4 prefix set.";
+    }
+
+    leaf description {
+      type string;
+      description "A user defined IPv4 prefix set description.";
+    }
+
+    leaf-list prefix {
+       type oc-inet:ipv4-prefix;
+       description
+         "A user defined list of IPv4 prefixes to be used in match
+         conditions. Each entry is a IPv4 + mask combination.";
+    }
+  }
+
+  grouping ipv6-prefix-sets-config {
+    description "Configuration parameters of IPv6 prefix sets.";
+
+    leaf name {
+      type string;
+      description
+        "Name of the IPv6 prefix set.";
+    }
+
+    leaf description {
+      type string;
+      description
+        "A user defined IPv6 prefix set description.";
+    }
+
+    leaf-list prefix {
+       type oc-inet:ipv6-prefix;
+       description
+         "A user defined list of IPv6 prefixes to be used in match
+         conditions. Each entry is a IPv6 + mask combination.";
+    }
+  }
+
+  grouping port-sets-config {
+    description
+      "Configuration parameters of port sets.";
+
+    leaf name {
+        type string;
+        description
+          "A user defined name of the port set.";
+      }
+
+      leaf description {
+        type string;
+        description
+          "A user defined description for the port set";
+      }
+
+      leaf-list port {
+        type oc-pkt-match-types:port-num-range;
+        description
+          "A user defined set of ports to be
+          used in the match conditions.";
+      }
+  }
+
+  grouping defined-sets {
+    description "Configuration of Defined Sets.";
+
+    container ipv4-prefix-sets {
+      description
+        "Container to hold the list of IPv4 prefix sets.";
+
+      list ipv4-prefix-set {
+        key "name";
+        description
+          "List of IPv4 prefix sets.";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description
+            "Reference to the name of the IPv4 prefix set.";
+        }
+
+        container config {
+          description
+            "Configuration data for IPv4 prefix sets.";
+          uses ipv4-prefix-sets-config;
+        }
+
+        container state {
+          config false;
+          description
+            "State data for IPv4 prefix sets.";
+          uses ipv4-prefix-sets-config;
+        }
+      }
+    }
+
+    container ipv6-prefix-sets {
+      description
+        "Container to hold the list of IPv4 prefix sets.";
+
+      list ipv6-prefix-set {
+        key "name";
+        description "List of IPv6 prefix sets. Each defined set
+        is uniquely identified by a name";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description
+            "Reference to the name of the IPv6 prefix set.";
+        }
+
+        container config {
+          description
+            "Configuration data for IPv6 prefix sets.";
+          uses ipv6-prefix-sets-config;
+        }
+
+        container state {
+          config false;
+          description
+            "State data for prefix lists.";
+          uses ipv6-prefix-sets-config;
+        }
+      }
+    }
+
+    container port-sets {
+      description
+        "Container to hold the list of port sets.";
+
+      list port-set {
+        key "name";
+        description
+          "List of port sets. Each por set is uniquely
+          identified by its name";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description
+            "Name of the port set. The name is used to
+             reference the set in match conditions.";
+        }
+
+        container config {
+          description
+            "Configuration data for port lists.";
+          uses port-sets-config;
+        }
+
+        container state {
+          config false;
+          description
+            "State data for port lists.";
+          uses port-sets-config;
+        }
+      }
+    }
+  }
+
+
+
+  grouping defined-sets-top {
+    description
+      "Top level grouping for defined-sets";
+
+    container defined-sets {
+      description
+        "Top level enclosing container for defined-set model
+        config and operational state data.";
+      uses defined-sets;
+    }
+  }
+
+  uses defined-sets-top;
+
+}
diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/interfaces/openconfig-if-aggregate.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/interfaces/openconfig-if-aggregate.yang
new file mode 100644
index 000000000..f6a577bb0
--- /dev/null
+++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/interfaces/openconfig-if-aggregate.yang
@@ -0,0 +1,249 @@
+module openconfig-if-aggregate {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/interfaces/aggregate";
+
+  prefix "oc-lag";
+
+  // import some basic types
+  import openconfig-interfaces { prefix oc-if; }
+  import openconfig-if-ethernet { prefix oc-eth; }
+  import iana-if-type { prefix ianaift; }
+  import openconfig-extensions { prefix oc-ext; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "Model for managing aggregated (aka bundle, LAG) interfaces.";
+
+  oc-ext:openconfig-version "2.4.4";
+
+  revision "2022-06-28" {
+    description
+      "Remove reference to invalid oc-ift type check";
+    reference "2.4.4";
+  }
+
+  revision "2020-05-01" {
+    description
+      "Update when statements to reference config nodes
+      from config true elements.";
+    reference "2.4.3";
+  }
+
+  revision "2019-04-16" {
+    description
+      "Update import prefix for iana-if-type module";
+    reference "2.4.2";
+  }
+
+  revision "2018-11-21" {
+    description
+      "Add OpenConfig module metadata extensions.";
+    reference "2.3.2";
+  }
+
+  revision "2018-03-23" {
+    description
+      "Fix/cleanup when statements in aggregates model.";
+    reference "2.3.1";
+  }
+
+  revision "2018-01-05" {
+    description
+      "Add logical loopback to interface.";
+    reference "2.3.0";
+  }
+
+  revision "2017-12-22" {
+    description
+      "Add IPv4 proxy ARP configuration.";
+    reference "2.2.0";
+  }
+
+  revision "2017-12-21" {
+    description
+      "Added IPv6 router advertisement configuration.";
+    reference "2.1.0";
+  }
+
+  revision "2017-07-14" {
+    description
+      "Added Ethernet/IP state data; Add dhcp-client;
+      migrate to OpenConfig types modules; Removed or
+      renamed opstate values";
+    reference "2.0.0";
+  }
+
+  revision "2016-12-22" {
+    description
+      "Fixes to Ethernet interfaces model";
+    reference "1.1.0";
+  }
+
+  // OpenConfig specific extensions for module metadata.
+  oc-ext:regexp-posix;
+  oc-ext:catalog-organization "openconfig";
+  oc-ext:origin "openconfig";
+
+  // extension statements
+
+  // feature statements
+
+  // identity statements
+
+  // typedef statements
+
+  typedef aggregation-type {
+    type enumeration {
+      enum LACP {
+        description "LAG managed by LACP";
+      }
+      enum STATIC {
+        description "Statically configured bundle / LAG";
+      }
+    }
+    description
+      "Type to define the lag-type, i.e., how the LAG is
+      defined and managed";
+  }
+
+  // grouping statements
+
+
+  grouping aggregation-logical-config {
+    description
+      "Configuration data for aggregate interfaces";
+
+
+    leaf lag-type {
+      type aggregation-type;
+      description
+        "Sets the type of LAG, i.e., how it is
+        configured / maintained";
+    }
+
+    leaf min-links {
+      type uint16;
+      description
+        "Specifies the mininum number of member
+        interfaces that must be active for the aggregate interface
+        to be available";
+    }
+  }
+
+  grouping aggregation-logical-state {
+    description
+      "Operational state data for aggregate interfaces";
+
+    leaf lag-speed {
+      type uint32;
+      units Mbps;
+      description
+        "Reports effective speed of the aggregate interface,
+        based on speed of active member interfaces";
+    }
+
+    leaf-list member {
+      when "../../config/lag-type = 'STATIC'" {
+        description
+          "The simple list of member interfaces is active
+          when the aggregate is statically configured";
+      }
+      type oc-if:base-interface-ref;
+      description
+        "List of current member interfaces for the aggregate,
+        expressed as references to existing interfaces";
+    }
+  }
+
+  grouping aggregation-logical-top {
+    description "Top-level data definitions for LAGs";
+
+    container aggregation {
+
+      description
+        "Options for logical interfaces representing
+        aggregates";
+
+      container config {
+        description
+          "Configuration variables for logical aggregate /
+          LAG interfaces";
+
+        uses aggregation-logical-config;
+      }
+
+      container state {
+
+        config false;
+        description
+          "Operational state variables for logical
+          aggregate / LAG interfaces";
+
+        uses aggregation-logical-config;
+        uses aggregation-logical-state;
+
+      }
+    }
+  }
+
+  grouping ethernet-if-aggregation-config {
+    description
+      "Adds configuration items for Ethernet interfaces
+      belonging to a logical aggregate / LAG";
+
+    leaf aggregate-id {
+      type leafref {
+        path "/oc-if:interfaces/oc-if:interface/oc-if:name";
+      }
+      description
+        "Specify the logical aggregate interface to which
+        this interface belongs";
+    }
+  }
+
+  // data definition statements
+
+  // augment statements
+
+  augment "/oc-if:interfaces/oc-if:interface" {
+
+    description "Adds LAG configuration to the interface module";
+
+    uses aggregation-logical-top {
+      when "oc-if:config/oc-if:type = 'ianaift:ieee8023adLag'" {
+        description
+          "active when the interface is set to type LAG";
+      }
+    }
+  }
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-eth:ethernet/" +
+    "oc-eth:config" {
+    description
+      "Adds LAG settings to individual Ethernet interfaces";
+
+    uses ethernet-if-aggregation-config;
+  }
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-eth:ethernet/" +
+    "oc-eth:state" {
+    description
+      "Adds LAG settings to individual Ethernet interfaces";
+
+    uses ethernet-if-aggregation-config;
+  }
+
+  // rpc statements
+
+  // notification statements
+
+}
diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/interfaces/openconfig-if-ethernet.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/interfaces/openconfig-if-ethernet.yang
new file mode 100644
index 000000000..3991923f6
--- /dev/null
+++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/interfaces/openconfig-if-ethernet.yang
@@ -0,0 +1,693 @@
+module openconfig-if-ethernet {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/interfaces/ethernet";
+
+  prefix "oc-eth";
+
+  // import some basic types
+  import openconfig-interfaces { prefix oc-if; }
+  import iana-if-type { prefix ianaift; }
+  import openconfig-yang-types { prefix oc-yang; }
+  import openconfig-extensions { prefix oc-ext; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "Model for managing Ethernet interfaces -- augments the OpenConfig
+    model for interface configuration and state.";
+
+  oc-ext:openconfig-version "2.13.0";
+
+  revision "2023-03-10" {
+    description
+      "Allow Ethernet configuration parameters to be
+      used for aggregate (LAG) interfaces.";
+    reference "2.13.0";
+  }
+
+  revision "2022-04-20" {
+    description
+      "Remove unused import";
+    reference "2.12.2";
+  }
+
+  revision "2021-07-20" {
+    description
+      "Fix typo in hardware MAC address description.";
+    reference "2.12.1";
+  }
+
+  revision "2021-07-07" {
+    description
+      "Add support for configuring fec-mode per interface.";
+    reference "2.12.0";
+  }
+
+  revision "2021-06-16" {
+    description
+      "Remove trailing whitespace.";
+    reference "2.11.1";
+  }
+
+  revision "2021-06-09" {
+    description
+      "Add support for standalone link training.";
+    reference "2.11.0";
+  }
+
+  revision "2021-05-17" {
+    description
+      "Add ethernet counters: in-carrier-errors,
+      in-interrupted-tx, in-late-collision, in-mac-errors-rx,
+      in-single-collision, in-symbol-error and out-mac-errors-tx";
+    reference "2.10.0";
+  }
+
+  revision "2021-03-30" {
+    description
+      "Add counter for drops due to oversized frames.";
+    reference "2.9.0";
+  }
+
+  revision "2020-05-06" {
+    description
+      "Minor formatting fix.";
+    reference "2.8.1";
+  }
+
+  revision "2020-05-06" {
+    description
+      "Add 200G, 400G, 600G and 800G Ethernet speeds.";
+    reference "2.8.0";
+  }
+
+  revision "2020-05-05" {
+    description
+      "Fix when statement checks to use rw paths when
+      from a rw context.";
+    reference "2.7.3";
+  }
+
+  revision "2019-04-16" {
+    description
+      "Update import prefix for iana-if-type module";
+    reference "2.7.2";
+  }
+
+  revision "2018-11-21" {
+    description
+      "Add OpenConfig module metadata extensions.";
+    reference "2.6.2";
+  }
+
+  revision "2018-09-04" {
+    description
+      "Remove in-crc-align-errors as it is a duplicate of
+      in-crc-errors";
+    reference "2.6.1";
+  }
+
+  revision "2018-08-28" {
+    description
+      "Add Ethernet counter in-block-errors";
+    reference "2.6.0";
+  }
+
+  revision "2018-07-02" {
+    description
+      "Add new ethernet counters of in-undersize-frames,
+      in-crc-align-errors and the distribution container";
+    reference "2.5.0";
+  }
+
+  revision "2018-04-10" {
+    description
+      "Add identities for 2.5 and 5 Gbps.";
+    reference "2.4.0";
+  }
+
+  revision "2018-01-05" {
+    description
+      "Add logical loopback to interface.";
+    reference "2.3.0";
+  }
+
+  revision "2017-12-21" {
+    description
+      "Added IPv6 router advertisement configuration.";
+    reference "2.1.0";
+  }
+
+  revision "2017-07-14" {
+    description
+      "Added Ethernet/IP state data; Add dhcp-client;
+      migrate to OpenConfig types modules; Removed or
+      renamed opstate values";
+    reference "2.0.0";
+  }
+
+  revision "2016-12-22" {
+    description
+      "Fixes to Ethernet interfaces model";
+    reference "1.1.0";
+  }
+
+  // OpenConfig specific extensions for module metadata.
+  oc-ext:regexp-posix;
+  oc-ext:catalog-organization "openconfig";
+  oc-ext:origin "openconfig";
+
+  // identity statements
+  identity INTERFACE_FEC {
+    description
+      "Base type to specify FEC modes that can be configured on the interface.
+       These are FEC modes defined for applying to logical interfaces and their
+       underlying electrical channels.";
+  }
+
+  identity FEC_FC {
+    base INTERFACE_FEC;
+    description
+      "Firecode is used for channels with NRZ modulation and speeds less than 100G.
+      This FEC is designed to comply with the IEEE 802.3, Clause 74.";
+  }
+
+  identity FEC_RS528 {
+    base INTERFACE_FEC;
+    description
+      "RS528 is used for channels with NRZ modulation. This FEC is designed to
+      comply with IEEE 802.3, Clause 91.";
+  }
+
+  identity FEC_RS544 {
+    base INTERFACE_FEC;
+    description
+      "RS544 is used for channels with PAM4 modulation.";
+  }
+
+  identity FEC_RS544_2X_INTERLEAVE {
+    base INTERFACE_FEC;
+    description
+      "RS544-2x-interleave is used for channels with PAM4 modulation.";
+  }
+
+  identity FEC_DISABLED {
+    base INTERFACE_FEC;
+    description
+      "FEC is administratively disabled.";
+  }
+
+  identity ETHERNET_SPEED {
+    description "base type to specify available Ethernet link
+    speeds";
+  }
+
+  identity SPEED_10MB {
+    base ETHERNET_SPEED;
+    description "10 Mbps Ethernet";
+  }
+
+  identity SPEED_100MB {
+    base ETHERNET_SPEED;
+    description "100 Mbps Ethernet";
+  }
+
+  identity SPEED_1GB {
+    base ETHERNET_SPEED;
+    description "1 Gbps Ethernet";
+  }
+
+  identity SPEED_2500MB {
+    base ETHERNET_SPEED;
+    description "2.5 Gbps Ethernet";
+  }
+
+  identity SPEED_5GB {
+    base ETHERNET_SPEED;
+    description "5 Gbps Ethernet";
+  }
+
+  identity SPEED_10GB {
+    base ETHERNET_SPEED;
+    description "10 Gbps Ethernet";
+  }
+
+  identity SPEED_25GB {
+    base ETHERNET_SPEED;
+    description "25 Gbps Ethernet";
+  }
+
+  identity SPEED_40GB {
+    base ETHERNET_SPEED;
+    description "40 Gbps Ethernet";
+  }
+
+  identity SPEED_50GB {
+    base ETHERNET_SPEED;
+    description "50 Gbps Ethernet";
+  }
+
+  identity SPEED_100GB {
+    base ETHERNET_SPEED;
+    description "100 Gbps Ethernet";
+  }
+
+  identity SPEED_200GB {
+    base ETHERNET_SPEED;
+    description "200 Gbps Ethernet";
+  }
+
+  identity SPEED_400GB {
+    base ETHERNET_SPEED;
+    description "400 Gbps Ethernet";
+  }
+
+  identity SPEED_600GB {
+    base ETHERNET_SPEED;
+    description "600 Gbps Ethernet";
+  }
+
+  identity SPEED_800GB {
+    base ETHERNET_SPEED;
+    description "800 Gbps Ethernet";
+  }
+
+  identity SPEED_UNKNOWN {
+    base ETHERNET_SPEED;
+    description
+      "Interface speed is unknown.  Systems may report
+      speed UNKNOWN when an interface is down or unpopuplated (e.g.,
+      pluggable not present).";
+  }
+
+  // typedef statements
+
+
+  // grouping statements
+
+  grouping ethernet-interface-config {
+    description "Configuration items for Ethernet interfaces";
+
+    leaf mac-address {
+      type oc-yang:mac-address;
+      description
+        "Assigns a MAC address to the Ethernet interface.  If not
+        specified, the corresponding operational state leaf is
+        expected to show the system-assigned MAC address.";
+    }
+
+    leaf auto-negotiate {
+      type boolean;
+      default true;
+      description
+        "Set to TRUE to request the interface to auto-negotiate
+        transmission parameters with its peer interface.  When
+        set to FALSE, the transmission parameters are specified
+        manually.";
+      reference
+        "IEEE 802.3-2012 auto-negotiation transmission parameters";
+    }
+
+    leaf standalone-link-training {
+      type boolean;
+      default false;
+      description
+        "Link training is automatic tuning of the SerDes transmit and
+        receive parameters to ensure an optimal connection over copper
+        links. It is normally run as part of the auto negotiation
+        sequence as specified in IEEE 802.3 Clause 73.
+
+        Standalone link training is used when full auto negotiation is
+        not desired on an Ethernet link but link training is needed.
+        It is configured by setting the standalone-link-training leaf
+        to TRUE and augo-negotiate leaf to FALSE.
+
+        Note: If auto-negotiate is true, then the value of standalone
+        link training leaf will be ignored.";
+    }
+
+    leaf duplex-mode {
+      type enumeration {
+        enum FULL {
+          description "Full duplex mode";
+        }
+        enum HALF {
+          description "Half duplex mode";
+        }
+      }
+      description
+        "When auto-negotiate is TRUE, this optionally sets the
+        duplex mode that will be advertised to the peer.  If
+        unspecified, the interface should negotiate the duplex mode
+        directly (typically full-duplex).  When auto-negotiate is
+        FALSE, this sets the duplex mode on the interface directly.";
+    }
+
+    leaf port-speed {
+      type identityref {
+        base ETHERNET_SPEED;
+      }
+      description
+        "When auto-negotiate is TRUE, this optionally sets the
+        port-speed mode that will be advertised to the peer for
+        negotiation.  If unspecified, it is expected that the
+        interface will select the highest speed available based on
+        negotiation.  When auto-negotiate is set to FALSE, sets the
+        link speed to a fixed value -- supported values are defined
+        by ETHERNET_SPEED identities";
+    }
+
+    leaf enable-flow-control {
+      type boolean;
+      default false;
+      description
+        "Enable or disable flow control for this interface.
+        Ethernet flow control is a mechanism by which a receiver
+        may send PAUSE frames to a sender to stop transmission for
+        a specified time.
+
+        This setting should override auto-negotiated flow control
+        settings.  If left unspecified, and auto-negotiate is TRUE,
+        flow control mode is negotiated with the peer interface.";
+      reference
+        "IEEE 802.3x";
+    }
+
+    leaf fec-mode {
+      type identityref {
+        base INTERFACE_FEC;
+      }
+      description
+        "The FEC mode applied to the physical channels associated with
+        the interface.";
+    }
+  }
+
+  grouping ethernet-interface-state-counters {
+    description
+      "Ethernet-specific counters and statistics";
+
+    // ingress counters
+
+    leaf in-mac-control-frames {
+      type oc-yang:counter64;
+      description
+        "MAC layer control frames received on the interface";
+    }
+
+    leaf in-mac-pause-frames {
+      type oc-yang:counter64;
+      description
+        "MAC layer PAUSE frames received on the interface";
+    }
+
+    leaf in-oversize-frames {
+      type oc-yang:counter64;
+      description
+        "The total number of frames received that were
+        longer than 1518 octets (excluding framing bits,
+        but including FCS octets) and were otherwise
+        well formed.";
+    }
+
+    leaf in-undersize-frames {
+      type oc-yang:counter64;
+      description
+        "The total number of frames received that were
+        less than 64 octets long (excluding framing bits,
+        but including FCS octets) and were otherwise well
+        formed.";
+      reference
+        "RFC 2819: Remote Network Monitoring MIB -
+        etherStatsUndersizePkts";
+    }
+
+    leaf in-jabber-frames {
+      type oc-yang:counter64;
+      description
+        "Number of jabber frames received on the
+        interface.  Jabber frames are typically defined as oversize
+        frames which also have a bad CRC.  Implementations may use
+        slightly different definitions of what constitutes a jabber
+        frame.  Often indicative of a NIC hardware problem.";
+    }
+
+    leaf in-fragment-frames {
+      type oc-yang:counter64;
+      description
+        "The total number of frames received that were less than
+        64 octets in length (excluding framing bits but including
+        FCS octets) and had either a bad Frame Check Sequence
+        (FCS) with an integral number of octets (FCS Error) or a
+        bad FCS with a non-integral number of octets (Alignment
+        Error).";
+    }
+
+    leaf in-8021q-frames {
+      type oc-yang:counter64;
+      description
+        "Number of 802.1q tagged frames received on the interface";
+    }
+
+    leaf in-crc-errors {
+      type oc-yang:counter64;
+      description
+        "The total number of frames received that
+        had a length (excluding framing bits, but
+        including FCS octets) of between 64 and 1518
+        octets, inclusive, but had either a bad
+        Frame Check Sequence (FCS) with an integral
+        number of octets (FCS Error) or a bad FCS with
+        a non-integral number of octets (Alignment Error)";
+      reference
+        "RFC 2819: Remote Network Monitoring MIB -
+        etherStatsCRCAlignErrors";
+    }
+
+    leaf in-block-errors {
+      type oc-yang:counter64;
+      description
+        "The number of received errored blocks. Error detection codes
+        are capable of detecting whether one or more errors have
+        occurred in a given sequence of bits – the block. It is
+        normally not possible to determine the exact number of errored
+        bits within the block";
+    }
+
+    leaf in-carrier-errors {
+      type oc-yang:counter64;
+      description
+        "The number of received errored frames due to a carrier issue.
+        The value refers to MIB counter for
+        dot3StatsCarrierSenseErrors
+        oid=1.3.6.1.2.1.10.7.2.1.11";
+      reference
+        "RFC 1643 Definitions of Managed
+        Objects for the Ethernet-like Interface Types.";
+    }
+
+    leaf in-interrupted-tx {
+      type oc-yang:counter64;
+      description
+        "The number of received errored frames due to interrupted
+        transmission issue. The value refers to MIB counter for
+        dot3StatsDeferredTransmissions
+        oid=1.3.6.1.2.1.10.7.2.1.7";
+      reference
+        "RFC 1643 Definitions of Managed
+        Objects for the Ethernet-like Interface Types.";
+    }
+
+    leaf in-late-collision {
+      type oc-yang:counter64;
+      description
+        "The number of received errored frames due to late collision
+        issue. The value refers to MIB counter for
+        dot3StatsLateCollisions
+        oid=1.3.6.1.2.1.10.7.2.1.8";
+      reference
+        "RFC 1643 Definitions of Managed
+        Objects for the Ethernet-like Interface Types.";
+    }
+
+    leaf in-mac-errors-rx {
+      type oc-yang:counter64;
+      description
+        "The number of received errored frames due to MAC errors
+        received. The value refers to MIB counter for
+        dot3StatsInternalMacReceiveErrors
+        oid=1.3.6.1.2.1.10.7.2.1.16";
+      reference
+        "RFC 1643 Definitions of Managed
+        Objects for the Ethernet-like Interface Types.";
+    }
+
+    leaf in-single-collision {
+      type oc-yang:counter64;
+      description
+        "The number of received errored frames due to single collision
+        issue. The value refers to MIB counter for
+        dot3StatsSingleCollisionFrames
+        oid=1.3.6.1.2.1.10.7.2.1.4";
+      reference
+        "RFC 1643 Definitions of Managed
+        Objects for the Ethernet-like Interface Types.";
+     }
+
+    leaf in-symbol-error {
+      type oc-yang:counter64;
+      description
+        "The number of received errored frames due to symbol error.
+        The value refers to MIB counter for
+        in-symbol-error
+        oid=1.3.6.1.2.1.10.7.2.1.18";
+      reference
+        "RFC 1643 Definitions of Managed
+        Objects for the Ethernet-like Interface Types.";
+    }
+
+    leaf in-maxsize-exceeded {
+      type oc-yang:counter64;
+      description
+        "The total number frames received that are well-formed but
+        dropped due to exceeding the maximum frame size on the interface
+        (e.g., MTU or MRU)";
+    }
+
+    // egress counters
+
+    leaf out-mac-control-frames {
+      type oc-yang:counter64;
+      description
+        "MAC layer control frames sent on the interface";
+    }
+
+    leaf out-mac-pause-frames {
+      type oc-yang:counter64;
+      description
+        "MAC layer PAUSE frames sent on the interface";
+    }
+
+    leaf out-8021q-frames {
+      type oc-yang:counter64;
+      description
+        "Number of 802.1q tagged frames sent on the interface";
+    }
+
+     leaf out-mac-errors-tx {
+      type oc-yang:counter64;
+      description
+        "The number of sent errored frames due to MAC errors
+         transmitted. The value refers to MIB counter for
+         dot3StatsInternalMacTransmitErrors
+         oid=1.3.6.1.2.1.10.7.2.1.10";
+      reference
+        "RFC 1643 Definitions of Managed
+        Objects for the Ethernet-like Interface Types.";
+     }
+
+  }
+
+  grouping ethernet-interface-state {
+    description
+      "Grouping for defining Ethernet-specific operational state";
+
+    leaf hw-mac-address {
+      type oc-yang:mac-address;
+      description
+        "Represents the 'burned-in', or system-assigned, MAC
+        address for the Ethernet interface.";
+    }
+
+    leaf negotiated-duplex-mode {
+      type enumeration {
+        enum FULL {
+          description "Full duplex mode";
+        }
+        enum HALF {
+          description "Half duplex mode";
+        }
+      }
+      description
+        "When auto-negotiate is set to TRUE, and the interface has
+        completed auto-negotiation with the remote peer, this value
+        shows the duplex mode that has been negotiated.";
+    }
+
+    leaf negotiated-port-speed {
+      type identityref {
+        base ETHERNET_SPEED;
+      }
+      description
+        "When auto-negotiate is set to TRUE, and the interface has
+        completed auto-negotiation with the remote peer, this value
+        shows the interface speed that has been negotiated.";
+    }
+
+    container counters {
+      description "Ethernet interface counters";
+
+      uses ethernet-interface-state-counters;
+    }
+  }
+
+  // data definition statements
+
+  grouping ethernet-top {
+    description "top-level Ethernet config and state containers";
+
+    container ethernet {
+      description
+        "Top-level container for ethernet configuration
+        and state";
+
+      container config {
+        description "Configuration data for ethernet interfaces";
+
+        uses ethernet-interface-config;
+
+      }
+
+      container state {
+
+        config false;
+        description "State variables for Ethernet interfaces";
+
+        uses ethernet-interface-config;
+        uses ethernet-interface-state;
+
+      }
+
+    }
+  }
+
+  // augment statements
+
+  augment "/oc-if:interfaces/oc-if:interface" {
+    description "Adds addtional Ethernet-specific configuration to
+    interfaces model";
+
+    uses ethernet-top {
+      when "oc-if:config/oc-if:type = 'ianaift:ethernetCsmacd' or " +
+           "oc-if:config/oc-if:type = 'ianaift:ieee8023adLag'" {
+      description
+        "Additional interface configuration parameters when
+        the interface type is Ethernet, or the interface is an aggregate
+        interface.";
+      }
+    }
+  }
+
+  // rpc statements
+
+  // notification statements
+
+}
diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/interfaces/openconfig-if-ip.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/interfaces/openconfig-if-ip.yang
new file mode 100644
index 000000000..8aebaaa06
--- /dev/null
+++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/interfaces/openconfig-if-ip.yang
@@ -0,0 +1,1611 @@
+module openconfig-if-ip {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/interfaces/ip";
+
+  prefix "oc-ip";
+
+  // import some basic types
+  import openconfig-inet-types { prefix oc-inet; }
+  import openconfig-interfaces { prefix oc-if; }
+  import openconfig-vlan { prefix oc-vlan; }
+  import openconfig-yang-types { prefix oc-yang; }
+  import openconfig-extensions { prefix oc-ext; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "This model defines data for managing configuration and
+    operational state on IP (IPv4 and IPv6) interfaces.
+
+    This model reuses data items defined in the IETF YANG model for
+    interfaces described by RFC 7277 with an alternate structure
+    (particularly for operational state data) and with
+    additional configuration items.
+
+    Portions of this code were derived from IETF RFC 7277.
+    Please reproduce this note if possible.
+
+    IETF code is subject to the following copyright and license:
+    Copyright (c) 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).";
+
+  oc-ext:openconfig-version "3.5.1";
+
+  revision "2024-03-13" {
+    description
+      "Update in-pkts and out-pkts descriptions.";
+    reference "3.5.1";
+  }
+
+  revision "2023-08-14" {
+    description
+      "Add multicast counters for IPv4, IPv6.";
+    reference "3.5.0";
+  }
+
+revision "2023-06-30" {
+    description
+      "Deprecate IPv6 router advertisment config suppress leaf and add config
+      mode leaf.";
+    reference "3.4.0";
+  }
+
+  revision "2023-04-12" {
+    description
+      "Add ipv4 address type configuration.";
+    reference "3.3.0";
+  }
+
+  revision "2023-02-06" {
+    description
+      "Add IPv6 link-local configuration.";
+    reference "3.2.0";
+  }
+
+  revision "2022-11-09" {
+    description
+      "Add additional IPv6 router-advertisement features.";
+    reference "3.1.0";
+  }
+
+  revision "2019-01-08" {
+    description
+      "Eliminate use of the 'empty' type.";
+    reference "3.0.0";
+  }
+
+  revision "2018-11-21" {
+    description
+      "Add OpenConfig module metadata extensions.";
+    reference "2.3.1";
+  }
+
+  revision "2018-01-05" {
+    description
+      "Add logical loopback to interface.";
+    reference "2.3.0";
+  }
+
+  revision "2017-12-21" {
+    description
+      "Added IPv6 router advertisement configuration.";
+    reference "2.1.0";
+  }
+
+  revision "2017-07-14" {
+    description
+      "Added Ethernet/IP state data; Add dhcp-client;
+      migrate to OpenConfig types modules; Removed or
+      renamed opstate values";
+    reference "2.0.0";
+  }
+
+  revision "2017-04-03"{
+    description
+      "Update copyright notice.";
+    reference "1.1.1";
+  }
+
+  revision "2016-12-22" {
+    description
+      "Fixes to Ethernet interfaces model";
+    reference "1.1.0";
+  }
+
+  // OpenConfig specific extensions for module metadata.
+  oc-ext:regexp-posix;
+  oc-ext:catalog-organization "openconfig";
+  oc-ext:origin "openconfig";
+
+  // typedef statements
+
+  typedef ip-address-origin {
+    type enumeration {
+      enum OTHER {
+        description
+          "None of the following.";
+        }
+      enum STATIC {
+        description
+          "Indicates that the address has been statically
+          configured - for example, using NETCONF or a Command Line
+          Interface.";
+      }
+      enum DHCP {
+        description
+          "Indicates an address that has been assigned to this
+          system by a DHCP server.";
+      }
+      enum LINK_LAYER {
+        description
+          "Indicates an address created by IPv6 stateless
+          autoconfiguration that embeds a link-layer address in its
+          interface identifier.";
+      }
+      enum RANDOM {
+        description
+          "Indicates an address chosen by the system at
+          random, e.g., an IPv4 address within 169.254/16, an
+          RFC 4941 temporary address, or an RFC 7217 semantically
+          opaque address.";
+        reference
+          "RFC 4941: Privacy Extensions for Stateless Address
+                    Autoconfiguration in IPv6
+          RFC 7217: A Method for Generating Semantically Opaque
+                    Interface Identifiers with IPv6 Stateless
+                    Address Autoconfiguration (SLAAC)";
+      }
+    }
+    description
+     "The origin of an address.";
+  }
+
+  typedef neighbor-origin {
+    type enumeration {
+      enum OTHER {
+       description
+         "None of the following.";
+      }
+      enum STATIC {
+       description
+         "Indicates that the mapping has been statically
+          configured - for example, using NETCONF or a Command Line
+          Interface.";
+      }
+      enum DYNAMIC {
+       description
+        "Indicates that the mapping has been dynamically resolved
+        using, e.g., IPv4 ARP or the IPv6 Neighbor Discovery
+        protocol.";
+      }
+    }
+    description
+      "The origin of a neighbor entry.";
+  }
+
+  typedef ipv4-address-type {
+    type enumeration {
+      enum PRIMARY {
+        description
+          "The primary address on the interface. There can only be one primary
+          address associated on an interface.";
+      }
+      enum SECONDARY {
+        description
+          "Secondary address on an interface. There can be multiple secondary
+          addresses associated on an interface.";
+      }
+    }
+
+    description
+      "The type of an IPv4 address.";
+  }
+
+  // grouping statements
+
+  grouping ip-common-global-config {
+    description
+      "Shared configuration data for IPv4 or IPv6 assigned
+      globally on an interface.";
+
+    leaf dhcp-client {
+      type boolean;
+      default false;
+      description
+        "Enables a DHCP client on the interface in order to request
+        an address";
+    }
+  }
+
+  grouping ip-common-counters-state {
+    description
+      "Operational state for IP traffic statistics for IPv4 and
+      IPv6";
+
+    container counters {
+      description
+        "Packet and byte counters for IP transmission and
+        reception for the address family.";
+
+
+      leaf in-pkts {
+        type oc-yang:counter64;
+        description
+          "The total number of IP packets received for the specified
+          address family, including all IP unicast, multicast,
+          broadcast and error packets.";
+        reference
+          "RFC 4293 - Management Information Base for the
+          Internet Protocol (IP)";
+      }
+
+      leaf in-octets {
+        type oc-yang:counter64;
+        description
+          "The total number of octets received in input IP packets
+          for the specified address family, including those received
+          in error.";
+        reference
+          "RFC 4293 - Management Information Base for the
+          Internet Protocol (IP)";
+      }
+
+      leaf in-multicast-pkts {
+        type oc-yang:counter64;
+        description
+          "The number of IP packets received for the specified
+          address family that are multicast packets.
+          Discontinuities in the value of this counter can occur
+          at re-initialization of the management system, and at
+          other times as indicated by the value of
+          'last-clear'.";
+        reference
+          "RFC 4293: Management Information Base for the Internet
+          Protocol (IP) - ipSystemStatsHCInMcastPkts";
+      }
+
+      leaf in-multicast-octets {
+        type oc-yang:counter64;
+        description
+          "The total number of octets received in input IP
+           multicast packets for the specified address
+           family, including those received in error.";
+        reference
+          "RFC 4293: Management Information Base for the Internet
+          Protocol (IP) - ipSystemStatsHCInMcastOctets";
+        }
+
+      leaf in-error-pkts {
+        // TODO: this counter combines several error conditions --
+        // could consider breaking them out to separate leaf nodes
+        type oc-yang:counter64;
+        description
+          "Number of IP packets discarded due to errors for the
+          specified address family, including errors in the IP
+          header, no route found to the IP destination, invalid
+          address, unknown protocol, etc.";
+        reference
+          "RFC 4293 - Management Information Base for the
+          Internet Protocol (IP)";
+      }
+
+      leaf in-forwarded-pkts {
+        type oc-yang:counter64;
+        description
+          "The number of input packets for which the device was not
+          their final IP destination and for which the device
+          attempted to find a route to forward them to that final
+          destination.";
+        reference
+          "RFC 4293 - Management Information Base for the
+          Internet Protocol (IP)";
+      }
+
+      leaf in-forwarded-octets {
+        type oc-yang:counter64;
+        description
+          "The number of octets received in input IP packets
+          for the specified address family for which the device was
+          not their final IP destination and for which the
+          device attempted to find a route to forward them to that
+          final destination.";
+        reference
+          "RFC 4293 - Management Information Base for the
+          Internet Protocol (IP)";
+      }
+
+      leaf in-discarded-pkts {
+        type oc-yang:counter64;
+        description
+          "The number of input IP packets for the
+          specified address family, for which no problems were
+          encountered to prevent their continued processing, but
+          were discarded (e.g., for lack of buffer space).";
+        reference
+          "RFC 4293 - Management Information Base for the
+          Internet Protocol (IP)";
+      }
+
+      leaf out-pkts {
+        type oc-yang:counter64;
+        description
+          "The total number of IP packets for the
+          specified address family that the device supplied
+          to the lower layers for transmission.  This includes
+          packets generated locally and those forwarded by the
+          device as well as unicast, multicast and broadcast
+          packets.";
+        reference
+          "RFC 4293 - Management Information Base for the
+          Internet Protocol (IP)";
+      }
+
+      leaf out-octets {
+        type oc-yang:counter64;
+        description
+          "The total number of octets in IP packets for the
+          specified address family that the device
+          supplied to the lower layers for transmission.  This
+          includes packets generated locally and those forwarded by
+          the device.";
+        reference
+          "RFC 4293 - Management Information Base for the
+          Internet Protocol (IP)";
+      }
+
+      leaf out-multicast-pkts {
+        type oc-yang:counter64;
+        description
+          "The total number of IP multicast packets transmitted.
+
+          Discontinuities in the value of this counter can occur
+          at re-initialization of the management system, and at
+          other times as indicated by the value of
+          'last-clear'.";
+        reference
+          "RFC 4293 - Management Information Base for the
+          Internet Protocol (IP)
+            - ipSystemStatsHCOutMcastPkts";
+      }
+
+      leaf out-multicast-octets {
+        type oc-yang:counter64;
+        description
+          "The total number of IP multicast octets transmitted.  This
+          includes packets generated locally and those forwarded by
+          the device.";
+        reference
+          "RFC 4293 - Management Information Base for the
+          Internet Protocol (IP)";
+      }
+
+      leaf out-error-pkts {
+        // TODO: this counter combines several error conditions --
+        // could consider breaking them out to separate leaf nodes
+        type oc-yang:counter64;
+        description
+          "Number of IP packets for the specified address family
+          locally generated and discarded due to errors, including
+          no route found to the IP destination.";
+        reference
+          "RFC 4293 - Management Information Base for the
+          Internet Protocol (IP)";
+      }
+
+      leaf out-forwarded-pkts {
+        type oc-yang:counter64;
+        description
+          "The number of packets for which this entity was not their
+          final IP destination and for which it was successful in
+          finding a path to their final destination.";
+        reference
+          "RFC 4293 - Management Information Base for the
+          Internet Protocol (IP)";
+      }
+
+      leaf out-forwarded-octets {
+        type oc-yang:counter64;
+        description
+          "The number of octets in packets for which this entity was
+          not their final IP destination and for which it was
+          successful in finding a path to their final destination.";
+        reference
+          "RFC 4293 - Management Information Base for the
+          Internet Protocol (IP)";
+      }
+
+      leaf out-discarded-pkts {
+        type oc-yang:counter64;
+        description
+          "The number of output IP packets for the
+          specified address family for which no problem was
+          encountered to prevent their transmission to their
+          destination, but were discarded (e.g., for lack of
+          buffer space).";
+        reference
+          "RFC 4293 - Management Information Base for the
+          Internet Protocol (IP)";
+      }
+    }
+
+  }
+
+
+
+  grouping ipv4-global-config {
+    description
+      "Configuration data for IPv4 interfaces across
+      all addresses assigned to the interface";
+
+    leaf enabled {
+     type boolean;
+     default true;
+     description
+       "Controls whether IPv4 is enabled or disabled on this
+        interface.  When IPv4 is enabled, this interface is
+        connected to an IPv4 stack, and the interface can send
+        and receive IPv4 packets.";
+    }
+
+    leaf mtu {
+     type uint16 {
+       range "68..max";
+     }
+     units octets;
+     description
+       "The size, in octets, of the largest IPv4 packet that the
+        interface will send and receive.
+
+        The server may restrict the allowed values for this leaf,
+        depending on the interface's type.
+
+        If this leaf is not configured, the operationally used MTU
+        depends on the interface's type.";
+     reference
+       "RFC 791: Internet Protocol";
+    }
+
+    uses ip-common-global-config;
+
+
+  }
+
+  grouping ipv4-address-config {
+    description
+      "Per IPv4 adresss configuration data for the
+      interface.";
+
+    leaf ip {
+       type oc-inet:ipv4-address;
+       description
+        "The IPv4 address on the interface.";
+    }
+
+    leaf prefix-length {
+      type uint8 {
+       range "0..32";
+      }
+      description
+       "The length of the subnet prefix.";
+    }
+
+    leaf type {
+      type ipv4-address-type;
+      default PRIMARY;
+      description
+        "Specifies the explicit type of the IPv4 address being assigned
+        to the interface. By default, addresses are assumed to be a primary address.
+        Where secondary addresses is to be configured, this leaf should be set
+        to SECONDARY.";
+    }
+  }
+
+  grouping ipv4-neighbor-config {
+    description
+      "Per IPv4 neighbor configuration data. Neighbor
+      entries are analagous to static ARP entries, i.e., they
+      create a correspondence between IP and link-layer addresses";
+
+    leaf ip {
+     type oc-inet:ipv4-address;
+     description
+       "The IPv4 address of the neighbor node.";
+    }
+    leaf link-layer-address {
+     type oc-yang:phys-address;
+     mandatory true;
+     description
+       "The link-layer address of the neighbor node.";
+    }
+  }
+
+  grouping ipv4-address-state {
+    description
+      "State variables for IPv4 addresses on the interface";
+
+    leaf origin {
+      type ip-address-origin;
+      description
+       "The origin of this address, e.g., statically configured,
+       assigned by DHCP, etc..";
+    }
+  }
+
+  grouping ipv4-neighbor-state {
+    description
+      "State variables for IPv4 neighbor entries on the interface.";
+
+    leaf origin {
+      type neighbor-origin;
+      description
+        "The origin of this neighbor entry, static or dynamic.";
+    }
+  }
+
+  grouping ipv6-global-config {
+    description
+      "Configuration data at the global level for each
+      IPv6 interface";
+
+    leaf enabled {
+      type boolean;
+      default true;
+      description
+        "Controls whether IPv6 is enabled or disabled on this
+        interface.  When IPv6 is enabled, this interface is
+        connected to an IPv6 stack, and the interface can send
+        and receive IPv6 packets.";
+    }
+
+    leaf mtu {
+      type uint32 {
+       range "1280..max";
+      }
+      units octets;
+      description
+        "The size, in octets, of the largest IPv6 packet that the
+        interface will send and receive.
+
+        The server may restrict the allowed values for this leaf,
+        depending on the interface's type.
+
+        If this leaf is not configured, the operationally used MTU
+        depends on the interface's type.";
+      reference
+        "RFC 2460: Internet Protocol, Version 6 (IPv6) Specification
+                  Section 5";
+    }
+
+    leaf dup-addr-detect-transmits {
+      type uint32;
+      default 1;
+      description
+        "The number of consecutive Neighbor Solicitation messages
+        sent while performing Duplicate Address Detection on a
+        tentative address.  A value of zero indicates that
+        Duplicate Address Detection is not performed on
+        tentative addresses.  A value of one indicates a single
+        transmission with no follow-up retransmissions.";
+      reference
+        "RFC 4862: IPv6 Stateless Address Autoconfiguration";
+    }
+
+    uses ip-common-global-config;
+  }
+
+  grouping ipv6-address-config {
+    description "Per-address configuration data for IPv6 interfaces";
+
+    leaf ip {
+      type oc-inet:ipv6-address;
+      description
+        "The IPv6 address on the interface.";
+    }
+
+    leaf prefix-length {
+      type uint8 {
+        range "0..128";
+      }
+      mandatory true;
+      description
+        "The length of the subnet prefix.";
+    }
+
+    leaf type {
+      type oc-inet:ipv6-address-type;
+      default GLOBAL_UNICAST;
+      description
+        "Specifies the explicit type of the IPv6 address being assigned
+        to the interface. By default, addresses are assumed to be
+        global unicast.  Where a link-local address is to be explicitly
+        configured, this leaf should be set to LINK_LOCAL.";
+    }
+
+  }
+
+  grouping ipv6-address-state {
+    description
+      "Per-address operational state data for IPv6 interfaces";
+
+    leaf origin {
+      type ip-address-origin;
+      description
+        "The origin of this address, e.g., static, dhcp, etc.";
+    }
+
+    leaf status {
+      type enumeration {
+        enum PREFERRED {
+          description
+            "This is a valid address that can appear as the
+            destination or source address of a packet.";
+        }
+        enum DEPRECATED {
+          description
+            "This is a valid but deprecated address that should
+            no longer be used as a source address in new
+            communications, but packets addressed to such an
+            address are processed as expected.";
+        }
+        enum INVALID {
+          description
+            "This isn't a valid address, and it shouldn't appear
+            as the destination or source address of a packet.";
+        }
+        enum INACCESSIBLE {
+          description
+            "The address is not accessible because the interface
+            to which this address is assigned is not
+            operational.";
+        }
+        enum UNKNOWN {
+          description
+            "The status cannot be determined for some reason.";
+        }
+        enum TENTATIVE {
+          description
+            "The uniqueness of the address on the link is being
+            verified.  Addresses in this state should not be
+            used for general communication and should only be
+            used to determine the uniqueness of the address.";
+        }
+        enum DUPLICATE {
+          description
+           "The address has been determined to be non-unique on
+            the link and so must not be used.";
+        }
+        enum OPTIMISTIC {
+          description
+            "The address is available for use, subject to
+            restrictions, while its uniqueness on a link is
+            being verified.";
+        }
+      }
+      description
+        "The status of an address.  Most of the states correspond
+        to states from the IPv6 Stateless Address
+        Autoconfiguration protocol.";
+      reference
+          "RFC 4293: Management Information Base for the
+                      Internet Protocol (IP)
+                      - IpAddressStatusTC
+            RFC 4862: IPv6 Stateless Address Autoconfiguration";
+    }
+  }
+
+  grouping ipv6-neighbor-config {
+    description
+      "Per-neighbor configuration data for IPv6 interfaces";
+
+    leaf ip {
+      type oc-inet:ipv6-address;
+      description
+        "The IPv6 address of the neighbor node.";
+    }
+
+    leaf link-layer-address {
+      type oc-yang:phys-address;
+      mandatory true;
+      description
+        "The link-layer address of the neighbor node.";
+    }
+  }
+
+  grouping ipv6-neighbor-state {
+    description "Per-neighbor state variables for IPv6 interfaces";
+
+    leaf origin {
+      type neighbor-origin;
+      description
+        "The origin of this neighbor entry.";
+    }
+    leaf is-router {
+      type boolean;
+      description
+        "Indicates that the neighbor node acts as a router.";
+    }
+    leaf neighbor-state {
+      type enumeration {
+        enum INCOMPLETE {
+          description
+          "Address resolution is in progress, and the link-layer
+                address of the neighbor has not yet been
+                determined.";
+        }
+        enum REACHABLE {
+          description
+          "Roughly speaking, the neighbor is known to have been
+                reachable recently (within tens of seconds ago).";
+        }
+        enum STALE {
+          description
+          "The neighbor is no longer known to be reachable, but
+                until traffic is sent to the neighbor no attempt
+                should be made to verify its reachability.";
+        }
+        enum DELAY {
+          description
+          "The neighbor is no longer known to be reachable, and
+                traffic has recently been sent to the neighbor.
+                Rather than probe the neighbor immediately, however,
+                delay sending probes for a short while in order to
+                give upper-layer protocols a chance to provide
+                reachability confirmation.";
+        }
+        enum PROBE {
+          description
+          "The neighbor is no longer known to be reachable, and
+                unicast Neighbor Solicitation probes are being sent
+                to verify reachability.";
+        }
+      }
+      description
+        "The Neighbor Unreachability Detection state of this
+        entry.";
+      reference
+        "RFC 4861: Neighbor Discovery for IP version 6 (IPv6)
+             Section 7.3.2";
+    }
+  }
+
+  grouping ip-vrrp-ipv6-config {
+    description
+      "IPv6-specific configuration data for VRRP on IPv6
+      interfaces";
+
+      leaf virtual-link-local {
+        type oc-inet:ip-address;
+        description
+          "For VRRP on IPv6 interfaces, sets the virtual link local
+          address";
+      }
+  }
+
+  grouping ip-vrrp-ipv6-state {
+    description
+      "IPv6-specific operational state for VRRP on IPv6 interfaces";
+
+    uses ip-vrrp-ipv6-config;
+  }
+
+  grouping ip-vrrp-tracking-config {
+    description
+      "Configuration data for tracking interfaces
+      in a VRRP group";
+
+    leaf-list track-interface {
+      type leafref {
+        path "/oc-if:interfaces/oc-if:interface/oc-if:name";
+      }
+      // TODO: we may need to add some restriction to ethernet
+      // or IP interfaces.
+      description
+        "Sets a list of one or more interfaces that should
+        be tracked for up/down events to dynamically change the
+        priority state of the VRRP group, and potentially
+        change the mastership if the tracked interface going
+        down lowers the priority sufficiently.  Any of the tracked
+        interfaces going down will cause the priority to be lowered.
+        Some implementations may only support a single
+        tracked interface.";
+    }
+
+    leaf priority-decrement {
+      type uint8 {
+        range 0..254;
+      }
+      default 0;
+      description "Set the value to subtract from priority when
+      the tracked interface goes down";
+    }
+  }
+
+  grouping ip-vrrp-tracking-state {
+    description
+      "Operational state data for tracking interfaces in a VRRP
+      group";
+  }
+
+  grouping ip-vrrp-tracking-top {
+    description
+      "Top-level grouping for VRRP interface tracking";
+
+    container interface-tracking {
+      description
+        "Top-level container for VRRP interface tracking";
+
+      container config {
+        description
+          "Configuration data for VRRP interface tracking";
+
+        uses ip-vrrp-tracking-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for VRRP interface tracking";
+
+        uses ip-vrrp-tracking-config;
+        uses ip-vrrp-tracking-state;
+      }
+    }
+  }
+
+  grouping ip-vrrp-config {
+    description
+      "Configuration data for VRRP on IP interfaces";
+
+    leaf virtual-router-id {
+      type uint8 {
+        range 1..255;
+      }
+      description
+        "Set the virtual router id for use by the VRRP group.  This
+        usually also determines the virtual MAC address that is
+        generated for the VRRP group";
+    }
+
+    leaf-list virtual-address {
+      type oc-inet:ip-address;
+      description
+        "Configure one or more virtual addresses for the
+        VRRP group";
+    }
+
+    leaf priority {
+      type uint8 {
+        range 1..254;
+      }
+      default 100;
+      description
+        "Specifies the sending VRRP interface's priority
+        for the virtual router.  Higher values equal higher
+        priority";
+    }
+
+    leaf preempt {
+      type boolean;
+      default true;
+      description
+        "When set to true, enables preemption by a higher
+        priority backup router of a lower priority master router";
+    }
+
+    leaf preempt-delay {
+      type uint16 {
+        range 0..3600;
+      }
+      default 0;
+      description
+        "Set the delay the higher priority router waits
+        before preempting";
+    }
+
+    leaf accept-mode {
+      type boolean;
+      // TODO: should we adopt the RFC default given the common
+      // operational practice of setting to true?
+      default false;
+      description
+        "Configure whether packets destined for
+        virtual addresses are accepted even when the virtual
+        address is not owned by the router interface";
+    }
+
+    leaf advertisement-interval {
+      type uint16 {
+        range 1..4095;
+      }
+      // TODO this range is theoretical -- needs to be validated
+      // against major implementations.
+      units "centiseconds";
+      default 100;
+      description
+        "Sets the interval between successive VRRP
+        advertisements -- RFC 5798 defines this as a 12-bit
+        value expressed as 0.1 seconds, with default 100, i.e.,
+        1 second.  Several implementation express this in units of
+        seconds";
+    }
+  }
+
+  grouping ip-vrrp-state {
+    description
+      "Operational state data for VRRP on IP interfaces";
+
+    leaf current-priority {
+      type uint8;
+      description "Operational value of the priority for the
+      interface in the VRRP group";
+    }
+  }
+
+  grouping ip-vrrp-top {
+    description
+      "Top-level grouping for Virtual Router Redundancy Protocol";
+
+    container vrrp {
+      description
+        "Enclosing container for VRRP groups handled by this
+        IP interface";
+
+      reference "RFC 5798 - Virtual Router Redundancy Protocol
+        (VRRP) Version 3 for IPv4 and IPv6";
+
+      list vrrp-group {
+        key "virtual-router-id";
+        description
+          "List of VRRP groups, keyed by virtual router id";
+
+        leaf virtual-router-id {
+          type leafref {
+            path "../config/virtual-router-id";
+          }
+          description
+            "References the configured virtual router id for this
+            VRRP group";
+        }
+
+        container config {
+          description
+            "Configuration data for the VRRP group";
+
+          uses ip-vrrp-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for the VRRP group";
+
+          uses ip-vrrp-config;
+          uses ip-vrrp-state;
+        }
+
+        uses ip-vrrp-tracking-top;
+      }
+    }
+  }
+
+  grouping ipv6-ra-config {
+    description
+      "Configuration parameters for IPv6 router advertisements.";
+
+    leaf enable {
+      type boolean;
+      default true;
+      description
+        "If set to false, all IPv6 router advertisement functions are
+        disabled.  The local system will not transmit router advertisement
+        messages and will not respond to router solicitation messages.";
+    }
+
+    leaf interval {
+      type uint32;
+      units seconds;
+      description
+        "The interval between periodic router advertisement neighbor
+        discovery messages sent on this interface expressed in
+        seconds.";
+    }
+
+    leaf lifetime {
+      type uint32;
+      units seconds;
+      description
+        "The lifetime advertised in the router advertisement neighbor
+        discovery message on this interface.";
+    }
+
+    leaf suppress {
+      status deprecated;
+      type boolean;
+      default false;
+      description
+        "When set to true, router advertisement neighbor discovery
+        messages are not transmitted on this interface.";
+    }
+
+    leaf mode {
+      type enumeration {
+        enum ALL {
+          description
+            "The system will transmit unsolicited router advertisement
+            messages and respond to router solicitation requests.";
+        }
+        enum DISABLE_UNSOLICITED_RA {
+          description
+            "Unsolicted router advertisement messages are not transmitted on
+            this interface.  Responses to router solicitation messages will
+            be transmitted.";
+        }
+      }
+      default "ALL";
+      description
+        "Mode controls which set of behaviors the local system should perform
+        to support IPv6 router advertisements.";
+      reference "RFC4861: Neighbor Discovery for IP version 6 (IPv6)";
+    }
+
+    leaf managed {
+      type boolean;
+      default false;
+      description
+        "When set to true, the managed address configuration (M) flag is set in
+        the advertised router advertisement. The M flag indicates that there are
+        addresses available via DHCPv6.";
+      reference "RFC4861: Neighbor Discovery for IPv6, section 4.2";
+    }
+
+    leaf other-config {
+      type boolean;
+      default false;
+      description
+        "When set to true, the other configuration (O) flag is set in the
+        advertised router advertisement. The O flag indicates that there is
+        other configuration available via DHCPv6 (e.g., DNS servers).";
+      reference "RFC4861: Neighbor Discovery for IPv6, section 4.2";
+    }
+  }
+
+  grouping ipv6-ra-prefix-config {
+    description
+      "Configuration parameters for an individual prefix within an IPv6
+      router advertisement.";
+
+    leaf prefix {
+      type oc-inet:ipv6-prefix;
+      description
+        "IPv6 prefix to be advertised within the router advertisement
+        message.";
+    }
+
+    leaf valid-lifetime {
+      type uint32;
+      units seconds;
+      description
+        "The length of time that the prefix is valid relative to the time
+        the packet was sent.";
+      reference "RFC4861: Neighbor Discovery for IPv6, section 4.6.2";
+    }
+
+    leaf preferred-lifetime {
+      type uint32;
+      units seconds;
+      description
+        "The length of time that the address within the prefix remains
+        in the preferred state, i.e., unrestricted use is allowed by
+        upper-layer protocols. See RFC4862 for a complete definition
+        of preferred behaviours.";
+      reference "RFC4861: Neighbor Discovery for IPv6, section 4.6.2";
+    }
+
+    leaf disable-advertisement {
+      type boolean;
+      description
+        "When set to true, the prefix is not advertised within
+        router advertisement messages that are sent as a result of
+        router soliciation messages.";
+    }
+
+    leaf disable-autoconfiguration {
+      type boolean;
+      description
+        "When set to true, the prefix is marked as not to be used for stateless
+        address configuration. This is achieved by setting the autonomous address
+        configuration bit for the prefix.";
+      reference "RFC4861: Neighbor Discovery for IPv6, section 4.6.1";
+    }
+
+    leaf enable-onlink {
+      type boolean;
+      description
+        "When set to true, the prefix is marked as being on link by setting the
+        L-bit for the prefix within a router advertisement.";
+      reference "RFC4861: Neighbor Discovery for IPv6, section 4.6.1";
+    }
+  }
+
+  grouping ipv4-proxy-arp-config {
+    description
+      "Configuration parameters for IPv4 proxy ARP";
+
+    leaf mode {
+      type enumeration {
+        enum DISABLE {
+          description
+            "The system should not respond to ARP requests that
+            do not specify an IP address configured on the local
+            subinterface as the target address.";
+        }
+        enum REMOTE_ONLY {
+          description
+            "The system responds to ARP requests only when the
+            sender and target IP addresses are in different
+            subnets.";
+        }
+        enum ALL {
+          description
+            "The system responds to ARP requests where the sender
+            and target IP addresses are in different subnets, as well
+            as those where they are in the same subnet.";
+        }
+      }
+      default "DISABLE";
+      description
+        "When set to a value other than DISABLE, the local system should
+        respond to ARP requests that are for target addresses other than
+        those that are configured on the local subinterface using its own
+        MAC address as the target hardware address. If the REMOTE_ONLY
+        value is specified, replies are only sent when the target address
+        falls outside the locally configured subnets on the interface,
+        whereas with the ALL value, all requests, regardless of their
+        target address are replied to.";
+      reference "RFC1027: Using ARP to Implement Transparent Subnet Gateways";
+    }
+  }
+
+  grouping ipv4-top {
+    description "Top-level configuration and state for IPv4
+    interfaces";
+
+    container ipv4 {
+      description
+        "Parameters for the IPv4 address family.";
+
+      container addresses {
+        description
+          "Enclosing container for address list";
+
+        list address {
+          key "ip";
+          description
+           "The list of configured IPv4 addresses on the interface.";
+
+          leaf ip {
+            type leafref {
+              path "../config/ip";
+            }
+            description "References the configured IP address";
+          }
+
+          container config {
+            description "Configuration data for each configured IPv4
+            address on the interface";
+
+            uses ipv4-address-config;
+
+          }
+
+          container state {
+
+            config false;
+            description "Operational state data for each IPv4 address
+            configured on the interface";
+
+            uses ipv4-address-config;
+            uses ipv4-address-state;
+          }
+
+        }
+      }
+
+      container proxy-arp {
+        description
+          "Configuration and operational state parameters
+          relating to proxy ARP. This functionality allows a
+          system to respond to ARP requests that are not
+          explicitly destined to the local system.";
+
+        container config {
+          description
+            "Configuration parameters for proxy ARP";
+          uses ipv4-proxy-arp-config;
+        }
+
+        container state {
+          config false;
+          description
+            "Operational state parameters for proxy ARP";
+          uses ipv4-proxy-arp-config;
+        }
+      }
+
+      container neighbors {
+        description
+          "Enclosing container for neighbor list";
+
+        list neighbor {
+          key "ip";
+          description
+           "A list of mappings from IPv4 addresses to
+            link-layer addresses.
+
+            Entries in this list are used as static entries in the
+            ARP Cache.";
+          reference
+           "RFC 826: An Ethernet Address Resolution Protocol";
+
+          leaf ip {
+            type leafref  {
+              path "../config/ip";
+            }
+            description "References the configured IP address";
+          }
+
+          container config {
+            description "Configuration data for each configured IPv4
+            address on the interface";
+
+            uses ipv4-neighbor-config;
+
+          }
+
+          container state {
+
+            config false;
+            description "Operational state data for each IPv4 address
+            configured on the interface";
+
+            uses ipv4-neighbor-config;
+            uses ipv4-neighbor-state;
+          }
+        }
+      }
+
+      uses oc-if:sub-unnumbered-top;
+
+      container config {
+        description
+          "Top-level IPv4 configuration data for the interface";
+
+        uses ipv4-global-config;
+      }
+
+      container state {
+
+        config false;
+        description
+          "Top level IPv4 operational state data";
+
+        uses ipv4-global-config;
+        uses ip-common-counters-state;
+      }
+    }
+  }
+
+  grouping ipv6-top {
+    description
+      "Top-level configuration and state for IPv6 interfaces";
+
+    container ipv6 {
+      description
+       "Parameters for the IPv6 address family.";
+
+      container addresses {
+        description
+          "Enclosing container for address list";
+
+        list address {
+          key "ip";
+          description
+           "The list of configured IPv6 addresses on the interface.";
+
+          leaf ip {
+            type leafref {
+              path "../config/ip";
+            }
+            description "References the configured IP address";
+          }
+
+          container config {
+            description
+              "Configuration data for each IPv6 address on
+              the interface";
+
+            uses ipv6-address-config;
+
+          }
+
+          container state {
+
+            config false;
+            description
+              "State data for each IPv6 address on the
+              interface";
+
+            uses ipv6-address-config;
+            uses ipv6-address-state;
+          }
+        }
+      }
+
+      container router-advertisement {
+        description
+          "Configuration and operational state parameters relating to
+          router advertisements.";
+
+        container config {
+          description
+            "Configuration parameters relating to router advertisements
+            for IPv6.";
+          uses ipv6-ra-config;
+        }
+
+        container state {
+          config false;
+          description
+            "Operational state parameters relating to router
+             advertisements for IPv6.";
+          uses ipv6-ra-config;
+        }
+
+        container prefixes {
+          description
+            "Container for a list of prefixes that are included in the
+            router advertisement message.";
+
+          list prefix {
+            key "prefix";
+
+            description
+              "List of prefixes that are to be included in the IPv6
+              router-advertisement messages for the interface. The list
+              is keyed by the IPv6 prefix in CIDR representation.
+
+              Prefixes that are listed are those that are to be
+              advertised in router advertisement messages. Where there
+              are IPv6 global addresses configured on an interface and
+              the prefix is not listed in the prefix list, it MUST NOT
+              be advertised in the router advertisement message.";
+
+            leaf prefix {
+              type leafref {
+                path "../config/prefix";
+              }
+              description
+                "Reference to the IPv6 prefix key for the prefix list.";
+            }
+
+            container config {
+              description
+                "Configuration parameters corresponding to an IPv6 prefix
+                within the router advertisement.";
+
+              uses ipv6-ra-prefix-config;
+            }
+
+            container state {
+              config false;
+              description
+                "Operational state parameters corresponding to an IPv6 prefix
+                within the router advertisement.";
+
+              uses ipv6-ra-prefix-config;
+            }
+          }
+        }
+      }
+
+      container neighbors {
+        description
+          "Enclosing container for list of IPv6 neighbors";
+
+        list neighbor {
+          key "ip";
+          description
+            "List of IPv6 neighbors";
+
+          leaf ip {
+            type leafref {
+              path "../config/ip";
+            }
+            description
+              "References the configured IP neighbor address";
+          }
+
+          container config {
+            description "Configuration data for each IPv6 address on
+            the interface";
+
+            uses ipv6-neighbor-config;
+
+          }
+
+          container state {
+
+            config false;
+            description "State data for each IPv6 address on the
+            interface";
+
+            uses ipv6-neighbor-config;
+            uses ipv6-neighbor-state;
+          }
+        }
+      }
+      uses oc-if:sub-unnumbered-top;
+
+      container config {
+        description "Top-level config data for the IPv6 interface";
+
+        uses ipv6-global-config;
+      }
+
+      container state {
+        config false;
+        description
+          "Top-level operational state data for the IPv6 interface";
+
+        uses ipv6-global-config;
+        uses ip-common-counters-state;
+
+      }
+    }
+  }
+
+  // augment statements
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-if:subinterfaces/" +
+    "oc-if:subinterface" {
+    description
+      "IPv4 address family configuration for
+      interfaces";
+
+    uses ipv4-top;
+
+  }
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-if:subinterfaces/" +
+    "oc-if:subinterface" {
+    description
+      "IPv6 address family configuration for
+      interfaces";
+
+    uses ipv6-top;
+
+  }
+
+  // VRRP for IPv4 interfaces
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-if:subinterfaces/" +
+    "oc-if:subinterface/oc-ip:ipv4/oc-ip:addresses/oc-ip:address" {
+
+    description
+      "Additional IP addr family configuration for
+      interfaces";
+
+    uses ip-vrrp-top;
+
+  }
+
+  // VRRP for IPv6 interfaces
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-if:subinterfaces/" +
+    "oc-if:subinterface/oc-ip:ipv6/oc-ip:addresses/oc-ip:address" {
+    description
+      "Additional IP addr family configuration for
+      interfaces";
+
+    uses ip-vrrp-top;
+
+  }
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-if:subinterfaces/" +
+    "oc-if:subinterface/oc-ip:ipv6/oc-ip:addresses/oc-ip:address/" +
+    "vrrp/vrrp-group/config" {
+    description
+      "Additional VRRP data for IPv6 interfaces";
+
+    uses ip-vrrp-ipv6-config;
+  }
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-if:subinterfaces/" +
+  "oc-if:subinterface/oc-ip:ipv6/oc-ip:addresses/oc-ip:address/vrrp/" +
+    "vrrp-group/state" {
+    description
+      "Additional VRRP data for IPv6 interfaces";
+
+    uses ip-vrrp-ipv6-state;
+  }
+
+  // Augments for for routed VLANs
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-vlan:routed-vlan" {
+    description
+      "IPv4 address family configuration for
+      interfaces";
+
+    uses ipv4-top;
+  }
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-vlan:routed-vlan" {
+    description
+      "IPv6 address family configuration for
+      interfaces";
+
+    uses ipv6-top;
+  }
+
+  // VRRP for routed VLAN interfaces
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-vlan:routed-vlan/" +
+    "oc-ip:ipv4/oc-ip:addresses/oc-ip:address" {
+    description
+      "Additional IP addr family configuration for
+      interfaces";
+
+    uses ip-vrrp-top;
+
+  }
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-vlan:routed-vlan/" +
+    "oc-ip:ipv6/oc-ip:addresses/oc-ip:address" {
+    description
+      "Additional IP addr family configuration for
+      interfaces";
+
+    uses ip-vrrp-top;
+
+  }
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-vlan:routed-vlan/" +
+    "oc-ip:ipv6/oc-ip:addresses/oc-ip:address/vrrp/vrrp-group/config" {
+    description
+      "Additional VRRP data for IPv6 interfaces";
+
+    uses ip-vrrp-ipv6-config;
+  }
+
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-vlan:routed-vlan/" +
+    "oc-ip:ipv6/oc-ip:addresses/oc-ip:address/vrrp/vrrp-group/state" {
+    description
+      "Additional VRRP data for IPv6 interfaces";
+
+    uses ip-vrrp-ipv6-state;
+  }
+
+  // rpc statements
+
+  // notification statements
+}
diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/interfaces/openconfig-interfaces.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/interfaces/openconfig-interfaces.yang
new file mode 100644
index 000000000..2cf2bdc84
--- /dev/null
+++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/interfaces/openconfig-interfaces.yang
@@ -0,0 +1,1336 @@
+module openconfig-interfaces {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/interfaces";
+
+  prefix "oc-if";
+
+  // import some basic types
+  import ietf-interfaces { prefix ietf-if; }
+  import openconfig-yang-types { prefix oc-yang; }
+  import openconfig-types { prefix oc-types; }
+  import openconfig-extensions { prefix oc-ext; }
+  import openconfig-transport-types { prefix oc-opt-types; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "Model for managing network interfaces and subinterfaces.  This
+    module also defines convenience types / groupings for other
+    models to create references to interfaces:
+
+      base-interface-ref (type) -  reference to a base interface
+      interface-ref (grouping) -  container for reference to a
+        interface + subinterface
+      interface-ref-state (grouping) - container for read-only
+        (opstate) reference to interface + subinterface
+
+    This model reuses data items defined in the IETF YANG model for
+    interfaces described by RFC 7223 with an alternate structure
+    (particularly for operational state data) and with
+    additional configuration items.
+
+    Portions of this code were derived from IETF RFC 7223.
+    Please reproduce this note if possible.
+
+    IETF code is subject to the following copyright and license:
+    Copyright (c) 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).";
+
+  oc-ext:openconfig-version "3.7.1";
+
+  revision "2024-04-04" {
+      description
+        "Use single quotes in descriptions.";
+      reference
+        "3.7.1";
+  }
+
+  revision "2023-11-06" {
+      description
+        "Clarify description for admin-status TESTING.";
+      reference
+        "3.7.0";
+  }
+
+  revision "2023-08-29" {
+      description
+        "Add augment for penalty-based additive-increase, exponential-decrease link damping algorithm.";
+      reference
+        "3.6.0";
+  }
+
+  revision "2023-07-14" {
+    description
+      "Move counters which apply to both interfaces and subinterfaces to
+      a common grouping.  Deprecate physical counters from subinterface";
+    reference "3.5.0";
+  }
+
+  revision "2023-02-06" {
+    description
+      "Add further specification to interface-ref type to
+       clarify that the interface and subinterface leaves
+       are how an interface is referenced, regardless of
+       context.";
+    reference "3.0.2";
+  }
+
+  revision "2022-10-25" {
+    description
+      "change loopback-mode to align with available modes";
+    reference "3.0.1";
+  }
+
+  revision "2021-04-06" {
+    description
+      "Add leaves for management and cpu interfaces";
+    reference "2.5.0";
+  }
+
+  revision "2019-11-19" {
+    description
+      "Update description of interface name.";
+    reference "2.4.3";
+  }
+
+  revision "2019-07-10" {
+    description
+      "Remove redundant nanosecond units statements to reflect
+      universal definition of timeticks64 type.";
+    reference "2.4.2";
+  }
+
+  revision "2018-11-21" {
+    description
+      "Add OpenConfig module metadata extensions.";
+    reference "2.4.1";
+  }
+
+  revision "2018-08-07" {
+    description
+      "Add leaf to indicate whether an interface is physical or
+      logical.";
+    reference "2.4.0";
+  }
+
+  revision "2018-07-02" {
+    description
+      "Add in-pkts and out-pkts in counters";
+    reference "2.3.2";
+  }
+
+  revision "2018-04-24" {
+    description
+      "Clarified behavior of last-change state leaf";
+    reference "2.3.1";
+  }
+
+  revision "2018-01-05" {
+    description
+      "Add logical loopback to interface.";
+    reference "2.3.0";
+  }
+
+  revision "2017-12-22" {
+    description
+      "Add IPv4 proxy ARP configuration.";
+    reference "2.2.0";
+  }
+
+  revision "2017-12-21" {
+    description
+      "Added IPv6 router advertisement configuration.";
+    reference "2.1.0";
+  }
+
+  revision "2017-07-14" {
+    description
+      "Added Ethernet/IP state data; Add dhcp-client;
+      migrate to OpenConfig types modules; Removed or
+      renamed opstate values";
+    reference "2.0.0";
+  }
+
+  revision "2017-04-03" {
+    description
+      "Update copyright notice.";
+    reference "1.1.1";
+  }
+
+  revision "2016-12-22" {
+    description
+      "Fixes to Ethernet interfaces model";
+    reference "1.1.0";
+  }
+
+  // OpenConfig specific extensions for module metadata.
+  oc-ext:regexp-posix;
+  oc-ext:catalog-organization "openconfig";
+  oc-ext:origin "openconfig";
+
+  // typedef statements
+
+  typedef base-interface-ref {
+    type leafref {
+      path "/oc-if:interfaces/oc-if:interface/oc-if:name";
+    }
+    description
+      "Reusable type for by-name reference to a base interface.
+      This type may be used in cases where ability to reference
+      a subinterface is not required.";
+  }
+
+  typedef interface-id {
+    type string;
+    description
+      "User-defined identifier for an interface, generally used to
+      name a interface reference.  The id can be arbitrary but a
+      useful convention is to use a combination of base interface
+      name and subinterface index.";
+  }
+
+  // grouping statements
+
+  grouping interface-ref-common {
+    description
+      "Reference leafrefs to interface / subinterface";
+
+    leaf interface {
+      type leafref {
+        path "/oc-if:interfaces/oc-if:interface/oc-if:name";
+      }
+      description
+        "Reference to a base interface.  If a reference to a
+        subinterface is required, this leaf must be specified
+        to indicate the base interface.";
+    }
+
+    leaf subinterface {
+      type leafref {
+        path "/oc-if:interfaces/" +
+          "oc-if:interface[oc-if:name=current()/../interface]/" +
+          "oc-if:subinterfaces/oc-if:subinterface/oc-if:index";
+      }
+      description
+        "Reference to a subinterface -- this requires the base
+        interface to be specified using the interface leaf in
+        this container.  If only a reference to a base interface
+        is requuired, this leaf should not be set.";
+    }
+  }
+
+  grouping interface-ref-state-container {
+    description
+      "Reusable opstate w/container for a reference to an
+      interface or subinterface";
+
+    container state {
+      config false;
+      description
+        "Operational state for interface-ref";
+
+      uses interface-ref-common;
+    }
+  }
+
+  grouping interface-ref {
+    description
+      "Reusable definition for a reference to an interface or
+      subinterface";
+
+    container interface-ref {
+      description
+        "Reference to an interface or subinterface. The interface
+        that is being referenced is uniquely referenced based on
+        the specified interface and subinterface leaves. In contexts
+        where a Layer 3 interface is to be referenced, both the
+        interface and subinterface leaves must be populated, as
+        Layer 3 configuration within the OpenConfig models is
+        associated with a subinterface. In the case where a
+        Layer 2 interface is to be referenced, only the
+        interface is specified.
+
+        The interface/subinterface leaf tuple must be used as
+        the means by which the interface is specified, regardless
+        of any other context information (e.g., key in a list).";
+
+      container config {
+        description
+          "Configured reference to interface / subinterface";
+        oc-ext:telemetry-on-change;
+
+        uses interface-ref-common;
+      }
+
+      uses interface-ref-state-container;
+    }
+  }
+
+  grouping interface-ref-state {
+    description
+      "Reusable opstate w/container for a reference to an
+      interface or subinterface";
+
+    container interface-ref {
+      description
+        "Reference to an interface or subinterface";
+
+      uses interface-ref-state-container;
+    }
+  }
+
+  grouping base-interface-ref-state {
+    description
+      "Reusable opstate w/container for a reference to a
+      base interface (no subinterface).";
+
+      container state {
+        config false;
+        description
+          "Operational state for base interface reference";
+
+        leaf interface {
+          type base-interface-ref;
+          description
+            "Reference to a base interface.";
+        }
+      }
+  }
+
+
+  grouping interface-common-config {
+    description
+      "Configuration data data nodes common to physical interfaces
+      and subinterfaces";
+
+    leaf description {
+      type string;
+      description
+        "A textual description of the interface.
+
+        A server implementation MAY map this leaf to the ifAlias
+        MIB object.  Such an implementation needs to use some
+        mechanism to handle the differences in size and characters
+        allowed between this leaf and ifAlias.  The definition of
+        such a mechanism is outside the scope of this document.
+
+        Since ifAlias is defined to be stored in non-volatile
+        storage, the MIB implementation MUST map ifAlias to the
+        value of 'description' in the persistently stored
+        datastore.
+
+        Specifically, if the device supports ':startup', when
+        ifAlias is read the device MUST return the value of
+        'description' in the 'startup' datastore, and when it is
+        written, it MUST be written to the 'running' and 'startup'
+        datastores.  Note that it is up to the implementation to
+
+        decide whether to modify this single leaf in 'startup' or
+        perform an implicit copy-config from 'running' to
+        'startup'.
+
+        If the device does not support ':startup', ifAlias MUST
+        be mapped to the 'description' leaf in the 'running'
+        datastore.";
+      reference
+        "RFC 2863: The Interfaces Group MIB - ifAlias";
+    }
+
+    leaf enabled {
+      type boolean;
+      default "true";
+      description
+        "This leaf contains the configured, desired state of the
+        interface.
+
+        Systems that implement the IF-MIB use the value of this
+        leaf in the 'running' datastore to set
+        IF-MIB.ifAdminStatus to 'up' or 'down' after an ifEntry
+        has been initialized, as described in RFC 2863.
+
+        Changes in this leaf in the 'running' datastore are
+        reflected in ifAdminStatus, but if ifAdminStatus is
+        changed over SNMP, this leaf is not affected.";
+      reference
+        "RFC 2863: The Interfaces Group MIB - ifAdminStatus";
+    }
+
+  }
+
+  grouping interface-phys-config {
+    description
+      "Configuration data for physical interfaces";
+
+    leaf name {
+      type string;
+      description
+        "The name of the interface.
+
+        A device MAY restrict the allowed values for this leaf,
+        possibly depending on the type of the interface.
+        For system-controlled interfaces, this leaf is the
+        device-specific name of the interface.  The 'config false'
+        list interfaces/interface[name]/state contains the currently
+        existing interfaces on the device.
+
+        If a client tries to create configuration for a
+        system-controlled interface that is not present in the
+        corresponding state list, the server MAY reject
+        the request if the implementation does not support
+        pre-provisioning of interfaces or if the name refers to
+        an interface that can never exist in the system.  A
+        NETCONF server MUST reply with an rpc-error with the
+        error-tag 'invalid-value' in this case.
+
+        The IETF model in RFC 7223 provides YANG features for the
+        following (i.e., pre-provisioning and arbitrary-names),
+        however they are omitted here:
+
+          If the device supports pre-provisioning of interface
+          configuration, the 'pre-provisioning' feature is
+          advertised.
+
+          If the device allows arbitrarily named user-controlled
+          interfaces, the 'arbitrary-names' feature is advertised.
+
+        When a configured user-controlled interface is created by
+        the system, it is instantiated with the same name in the
+        /interfaces/interface[name]/state list.";
+    }
+
+    leaf type {
+      type identityref {
+        base ietf-if:interface-type;
+      }
+      mandatory true;
+      description
+        "The type of the interface.
+
+        When an interface entry is created, a server MAY
+        initialize the type leaf with a valid value, e.g., if it
+        is possible to derive the type from the name of the
+        interface.
+
+        If a client tries to set the type of an interface to a
+        value that can never be used by the system, e.g., if the
+        type is not supported or if the type does not match the
+        name of the interface, the server MUST reject the request.
+        A NETCONF server MUST reply with an rpc-error with the
+        error-tag 'invalid-value' in this case.";
+      reference
+        "RFC 2863: The Interfaces Group MIB - ifType";
+    }
+
+    leaf mtu {
+      type uint16;
+      description
+        "Set the max transmission unit size in octets
+        for the physical interface.  If this is not set, the mtu is
+        set to the operational default -- e.g., 1514 bytes on an
+        Ethernet interface.";
+    }
+
+    leaf loopback-mode {
+      type oc-opt-types:loopback-mode-type;
+      description
+        "Sets the loopback type on the interface. Setting the
+        mode to something besides NONE activates the loopback in
+        the specified mode.";
+    }
+
+    uses interface-common-config;
+  }
+
+  grouping interface-phys-holdtime-config {
+    description
+      "Configuration data for interface hold-time settings --
+      applies to physical interfaces.";
+
+    leaf up {
+      type uint32;
+      units milliseconds;
+      default 0;
+      description
+        "Dampens advertisement when the interface
+        transitions from down to up.  A zero value means dampening
+        is turned off, i.e., immediate notification.";
+    }
+
+    leaf down {
+      type uint32;
+      units milliseconds;
+      default 0;
+      description
+        "Dampens advertisement when the interface transitions from
+        up to down.  A zero value means dampening is turned off,
+        i.e., immediate notification.";
+    }
+  }
+
+  grouping interface-phys-holdtime-state {
+    description
+      "Operational state data for interface hold-time.";
+  }
+
+  grouping interface-phys-holdtime-top {
+    description
+      "Top-level grouping for setting link transition
+      dampening on physical and other types of interfaces.";
+
+    container hold-time {
+      description
+        "Top-level container for hold-time settings to enable
+        dampening advertisements of interface transitions.";
+
+      container config {
+        description
+          "Configuration data for interface hold-time settings.";
+        oc-ext:telemetry-on-change;
+
+        uses interface-phys-holdtime-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for interface hold-time.";
+
+        uses interface-phys-holdtime-config;
+        uses interface-phys-holdtime-state;
+      }
+    }
+  }
+
+  grouping interface-link-damping-config {
+    description
+      "Configuration data for interface link damping settings.";
+
+    leaf max-suppress-time {
+      type uint32;
+      units milliseconds;
+      default 0;
+      description
+        "Maximum time an interface can remain damped since the last link down event no matter how unstable it has been prior to this period of stability. In a damped state, the interface's state change will not be advertised.";
+    }
+
+    leaf decay-half-life {
+      type uint32;
+      units milliseconds;
+      default 0;
+        description
+          "The amount of time after which an interface's penalty is decreased by half. Decay-half-time should not be more than max-suppress-time.";
+    }
+
+    leaf suppress-threshold {
+      type uint32;
+      default 0;
+        description
+          "The accumulated penalty that triggers the damping of an interface. A value of 0 indicates config is disabled.";
+    }
+
+    leaf reuse-threshold {
+      type uint32;
+      default 0;
+      description
+        "When the accumulated penalty decreases to this reuse threshold, the interface is not damped anymore. Interface state changes are advertised to applications. A value of 0 indicates config is disabled.";
+    }
+
+    leaf flap-penalty {
+      type uint32;
+      default 0;
+      description
+        "A penalty that each down event costs. A value of 0 indicates the config is disabled.";
+    }
+  }
+  grouping interface-link-damping-state {
+    description
+      "Operational state data for interface link damping settings.";
+  }
+  grouping link-damping-top {
+    description
+      "Top level grouping for link damping parameters.";
+
+    container penalty-based-aied {
+      description
+        "Top level container to suppress UP->DOWN link events using a penalty based additive-increase, exponential-decrease algorithm.";
+
+      container config {
+        description
+          "Configuration data for link damping settings.";
+          uses interface-link-damping-config;
+      }
+
+      container state {
+        config false;
+        description
+          "Operational state data for link damping settings.";
+        uses interface-link-damping-config;
+        uses interface-link-damping-state;
+      }
+    }
+  }
+
+  grouping interface-common-state {
+    description
+      "Operational state data (in addition to intended configuration)
+      at the global level for this interface";
+
+    oc-ext:operational;
+
+    leaf ifindex {
+      type uint32;
+      description
+        "System assigned number for each interface.  Corresponds to
+        ifIndex object in SNMP Interface MIB";
+      reference
+        "RFC 2863 - The Interfaces Group MIB";
+      oc-ext:telemetry-on-change;
+    }
+
+    leaf admin-status {
+      type enumeration {
+        enum UP {
+          description
+            "Ready to pass packets.";
+        }
+        enum DOWN {
+          description
+            "Not ready to pass packets and not in some test mode.";
+        }
+        enum TESTING {
+          description
+            "The interface should be treated as if in admin-down state for
+            control plane protocols.  In addition, while in TESTING state the
+            device should remove the interface from aggregate interfaces.
+            An interface transition to the TESTING state based on a qualification
+            workflow, or internal device triggered action - such as the gNOI Link
+            Qualification service";
+            reference
+              "gNOI Link Qualification Service
+               https://github.com/openconfig/gnoi/blob/main/packet_link_qualification/index.md";
+        }
+      }
+      //TODO:consider converting to an identity to have the
+      //flexibility to remove some values defined by RFC 7223 that
+      //are not used or not implemented consistently.
+      mandatory true;
+      description
+        "The desired state of the interface.  In RFC 7223 this leaf
+        has the same read semantics as ifAdminStatus.  Here, it
+        reflects the administrative state as set by enabling or
+        disabling the interface.";
+      reference
+        "RFC 2863: The Interfaces Group MIB - ifAdminStatus";
+      oc-ext:telemetry-on-change;
+    }
+
+    leaf oper-status {
+      type enumeration {
+        enum UP {
+          value 1;
+          description
+            "Ready to pass packets.";
+        }
+        enum DOWN {
+          value 2;
+          description
+            "The interface does not pass any packets.";
+        }
+        enum TESTING {
+          value 3;
+          description
+            "In test mode.  No operational packets can
+             be passed.";
+        }
+        enum UNKNOWN {
+          value 4;
+          description
+            "Status cannot be determined for some reason.";
+        }
+        enum DORMANT {
+          value 5;
+          description
+            "Waiting for some external event.";
+        }
+        enum NOT_PRESENT {
+          value 6;
+          description
+            "Some component (typically hardware) is missing.";
+        }
+        enum LOWER_LAYER_DOWN {
+          value 7;
+          description
+            "Down due to state of lower-layer interface(s).";
+        }
+      }
+      //TODO:consider converting to an identity to have the
+      //flexibility to remove some values defined by RFC 7223 that
+      //are not used or not implemented consistently.
+      mandatory true;
+      description
+        "The current operational state of the interface.
+
+         This leaf has the same semantics as ifOperStatus.";
+      reference
+        "RFC 2863: The Interfaces Group MIB - ifOperStatus";
+      oc-ext:telemetry-on-change;
+    }
+
+    leaf last-change {
+      type oc-types:timeticks64;
+      description
+        "This timestamp indicates the absolute time of the last
+        state change of the interface (e.g., up-to-down transition).
+        This is different than the SNMP ifLastChange object in the
+        standard interface MIB in that it is not relative to the
+        system boot time (i.e,. sysUpTime).
+
+        The value is the timestamp in nanoseconds relative to
+        the Unix Epoch (Jan 1, 1970 00:00:00 UTC).";
+      oc-ext:telemetry-on-change;
+    }
+
+    leaf logical {
+      type boolean;
+      description
+        "When set to true, the interface is a logical interface
+        which does not have an associated physical port or
+        channel on the system.";
+      oc-ext:telemetry-on-change;
+    }
+
+    leaf management {
+      type boolean;
+      description
+        "When set to true, the interface is a dedicated
+        management interface that is not connected to dataplane
+        interfaces.  It may be used to connect the system to an
+        out-of-band management network, for example.";
+      oc-ext:telemetry-on-change;
+    }
+
+    leaf cpu {
+      type boolean;
+      description
+        "When set to true, the interface is for traffic
+        that is handled by the system CPU, sometimes also called the
+        control plane interface.  On systems that represent the CPU
+        interface as an Ethernet interface, for example, this leaf
+        should be used to distinguish the CPU interface from dataplane
+        interfaces.";
+      oc-ext:telemetry-on-change;
+    }
+  }
+
+  grouping interface-common-counters-state {
+    description
+      "Operational state representing interface counters and statistics
+      applicable to (physical) interfaces and (logical) subinterfaces.";
+
+    leaf in-octets {
+      type oc-yang:counter64;
+      description
+        "The total number of octets received on the interface,
+        including framing characters.
+
+        Discontinuities in the value of this counter can occur
+        at re-initialization of the management system, and at
+        other times as indicated by the value of
+        'last-clear'.";
+      reference
+        "RFC 2863: The Interfaces Group MIB - ifHCInOctets.
+        RFC 4293: Management Information Base for the
+        Internet Protocol (IP).";
+    }
+
+    leaf in-pkts {
+      type oc-yang:counter64;
+      description
+        "The total number of packets received on the interface,
+        including all unicast, multicast, broadcast and bad packets
+        etc.";
+      reference
+        "RFC 2819: Remote Network Monitoring Management Information Base.
+        RFC 4293: Management Information Base for the
+        Internet Protocol (IP).";
+    }
+
+    leaf in-unicast-pkts {
+      type oc-yang:counter64;
+      description
+        "The number of packets, delivered by this sub-layer to a
+        higher (sub-)layer, that were not addressed to a
+        multicast or broadcast address at this sub-layer.
+
+        Discontinuities in the value of this counter can occur
+        at re-initialization of the management system, and at
+        other times as indicated by the value of
+        'last-clear'.";
+      reference
+        "RFC 2863: The Interfaces Group MIB - ifHCInUcastPkts.
+        RFC 4293: Management Information Base for the
+        Internet Protocol (IP).";
+    }
+
+    leaf in-broadcast-pkts {
+      type oc-yang:counter64;
+      description
+        "The number of packets, delivered by this sub-layer to a
+        higher (sub-)layer, that were addressed to a broadcast
+        address at this sub-layer.
+
+        Discontinuities in the value of this counter can occur
+        at re-initialization of the management system, and at
+        other times as indicated by the value of
+        'last-clear'.";
+      reference
+        "RFC 2863: The Interfaces Group MIB - ifHCInBroadcastPkts.
+        RFC 4293: Management Information Base for the
+        Internet Protocol (IP).";
+    }
+
+    leaf in-multicast-pkts {
+      type oc-yang:counter64;
+      description
+        "The number of packets, delivered by this sub-layer to a
+        higher (sub-)layer, that were addressed to a multicast
+        address at this sub-layer.  For a MAC-layer protocol,
+        this includes both Group and Functional addresses.
+
+        Discontinuities in the value of this counter can occur
+        at re-initialization of the management system, and at
+        other times as indicated by the value of
+        'last-clear'.";
+      reference
+        "RFC 2863: The Interfaces Group MIB - ifHCInMulticastPkts.
+        RFC 4293: Management Information Base for the
+        Internet Protocol (IP).";
+    }
+
+    leaf in-errors {
+      type oc-yang:counter64;
+      description
+        "For packet-oriented interfaces, the number of inbound
+        packets that contained errors preventing them from being
+        deliverable to a higher-layer protocol.  For character-
+        oriented or fixed-length interfaces, the number of
+        inbound transmission units that contained errors
+        preventing them from being deliverable to a higher-layer
+        protocol.
+
+        Discontinuities in the value of this counter can occur
+        at re-initialization of the management system, and at
+        other times as indicated by the value of
+        'last-clear'.";
+      reference
+        "RFC 2863: The Interfaces Group MIB - ifInErrors.
+        RFC 4293: Management Information Base for the
+        Internet Protocol (IP).";
+    }
+
+    leaf in-discards {
+      type oc-yang:counter64;
+      description
+        "The number of inbound packets that were chosen to be
+        discarded even though no errors had been detected to
+        prevent their being deliverable to a higher-layer
+        protocol.  One possible reason for discarding such a
+        packet could be to free up buffer space.
+
+        Discontinuities in the value of this counter can occur
+        at re-initialization of the management system, and at
+        other times as indicated by the value of
+        'last-clear'.";
+
+
+      reference
+        "RFC 2863: The Interfaces Group MIB - ifInDiscards.
+        RFC 4293: Management Information Base for the
+        Internet Protocol (IP).";
+    }
+
+    leaf out-octets {
+      type oc-yang:counter64;
+      description
+        "The total number of octets transmitted out of the
+        interface, including framing characters.
+
+        Discontinuities in the value of this counter can occur
+        at re-initialization of the management system, and at
+        other times as indicated by the value of
+        'last-clear'.";
+      reference
+        "RFC 2863: The Interfaces Group MIB - ifHCOutOctets.
+        RFC 4293: Management Information Base for the
+        Internet Protocol (IP).";
+    }
+
+    leaf out-pkts {
+      type oc-yang:counter64;
+      description
+        "The total number of packets transmitted out of the
+        interface, including all unicast, multicast, broadcast,
+        and bad packets etc.";
+      reference
+        "RFC 2819: Remote Network Monitoring Management Information Base.
+        RFC 4293: Management Information Base for the
+        Internet Protocol (IP).";
+    }
+
+    leaf out-unicast-pkts {
+      type oc-yang:counter64;
+      description
+        "The total number of packets that higher-level protocols
+        requested be transmitted, and that were not addressed
+        to a multicast or broadcast address at this sub-layer,
+        including those that were discarded or not sent.
+
+        Discontinuities in the value of this counter can occur
+        at re-initialization of the management system, and at
+        other times as indicated by the value of
+        'last-clear'.";
+      reference
+        "RFC 2863: The Interfaces Group MIB - ifHCOutUcastPkts.
+        RFC 4293: Management Information Base for the
+        Internet Protocol (IP).";
+    }
+
+    leaf out-broadcast-pkts {
+      type oc-yang:counter64;
+      description
+        "The total number of packets that higher-level protocols
+        requested be transmitted, and that were addressed to a
+        broadcast address at this sub-layer, including those
+        that were discarded or not sent.
+
+        Discontinuities in the value of this counter can occur
+        at re-initialization of the management system, and at
+        other times as indicated by the value of
+        'last-clear'.";
+      reference
+        "RFC 2863: The Interfaces Group MIB - ifHCOutBroadcastPkts.
+        RFC 4293: Management Information Base for the
+        Internet Protocol (IP).";
+    }
+
+    leaf out-multicast-pkts {
+      type oc-yang:counter64;
+      description
+        "The total number of packets that higher-level protocols
+        requested be transmitted, and that were addressed to a
+        multicast address at this sub-layer, including those
+        that were discarded or not sent.  For a MAC-layer
+        protocol, this includes both Group and Functional
+        addresses.
+
+        Discontinuities in the value of this counter can occur
+        at re-initialization of the management system, and at
+        other times as indicated by the value of
+        'last-clear'.";
+      reference
+        "RFC 2863: The Interfaces Group MIB - ifHCOutMulticastPkts.
+        RFC 4293: Management Information Base for the
+        Internet Protocol (IP).";
+    }
+
+    leaf out-discards {
+      type oc-yang:counter64;
+      description
+        "The number of outbound packets that were chosen to be
+        discarded even though no errors had been detected to
+        prevent their being transmitted.  One possible reason
+        for discarding such a packet could be to free up buffer
+        space.
+
+        Discontinuities in the value of this counter can occur
+        at re-initialization of the management system, and at
+        other times as indicated by the value of
+        'last-clear'.";
+      reference
+        "RFC 2863: The Interfaces Group MIB - ifOutDiscards.
+        RFC 4293: Management Information Base for the
+        Internet Protocol (IP).";
+    }
+
+    leaf out-errors {
+      type oc-yang:counter64;
+      description
+        "For packet-oriented interfaces, the number of outbound
+        packets that could not be transmitted because of errors.
+        For character-oriented or fixed-length interfaces, the
+        number of outbound transmission units that could not be
+        transmitted because of errors.
+
+        Discontinuities in the value of this counter can occur
+        at re-initialization of the management system, and at
+        other times as indicated by the value of
+        'last-clear'.";
+      reference
+        "RFC 2863: The Interfaces Group MIB - ifOutErrors.
+        RFC 4293: Management Information Base for the
+        Internet Protocol (IP).";
+    }
+
+    leaf last-clear {
+      type oc-types:timeticks64;
+      description
+        "Timestamp of the last time the interface counters were
+        cleared.
+
+        The value is the timestamp in nanoseconds relative to
+        the Unix Epoch (Jan 1, 1970 00:00:00 UTC).";
+      oc-ext:telemetry-on-change;
+    }
+  }
+
+  grouping interface-counters-state {
+    description
+      "Operational state representing interface counters
+      and statistics.";
+
+    oc-ext:operational;
+
+    leaf in-unknown-protos {
+      type oc-yang:counter64;
+      description
+        "For packet-oriented interfaces, the number of packets
+        received via the interface that were discarded because
+        of an unknown or unsupported protocol.  For
+        character-oriented or fixed-length interfaces that
+        support protocol multiplexing, the number of
+        transmission units received via the interface that were
+        discarded because of an unknown or unsupported protocol.
+        For any interface that does not support protocol
+        multiplexing, this counter is not present.
+
+        Discontinuities in the value of this counter can occur
+        at re-initialization of the management system, and at
+        other times as indicated by the value of
+        'last-clear'.";
+      reference
+        "RFC 2863: The Interfaces Group MIB - ifInUnknownProtos";
+    }
+
+    leaf in-fcs-errors {
+      type oc-yang:counter64;
+      description
+        "Number of received packets which had errors in the
+        frame check sequence (FCS), i.e., framing errors.
+
+        Discontinuities in the value of this counter can occur
+        when the device is re-initialization as indicated by the
+        value of 'last-clear'.";
+    }
+
+    leaf carrier-transitions {
+      type oc-yang:counter64;
+      description
+        "Number of times the interface state has transitioned
+        between up and down since the time the device restarted
+        or the last-clear time, whichever is most recent.";
+      oc-ext:telemetry-on-change;
+    }
+
+    leaf resets {
+      type oc-yang:counter64;
+      description
+        "Number of times the interface hardware has been reset.  The
+        triggers and effects of this event are hardware-specifc.";
+      oc-ext:telemetry-on-change;
+
+    }
+  }
+
+  grouping subinterfaces-counters-state {
+    description
+      "Operational state representing counters unique to subinterfaces";
+
+    oc-ext:operational;
+    leaf in-unknown-protos {
+      type oc-yang:counter64;
+      status deprecated;
+      description
+        "For packet-oriented interfaces, the number of packets
+        received via the interface that were discarded because
+        of an unknown or unsupported protocol.  For
+        character-oriented or fixed-length interfaces that
+        support protocol multiplexing, the number of
+        transmission units received via the interface that were
+        discarded because of an unknown or unsupported protocol.
+        For any interface that does not support protocol
+        multiplexing, this counter is not present.
+
+        Discontinuities in the value of this counter can occur
+        at re-initialization of the management system, and at
+        other times as indicated by the value of
+        'last-clear'.";
+      reference
+        "RFC 2863: The Interfaces Group MIB - ifInUnknownProtos";
+    }
+
+    leaf in-fcs-errors {
+      type oc-yang:counter64;
+      status deprecated;
+      description
+        "Number of received packets which had errors in the
+        frame check sequence (FCS), i.e., framing errors.
+
+        Discontinuities in the value of this counter can occur
+        when the device is re-initialization as indicated by the
+        value of 'last-clear'.";
+    }
+
+    leaf carrier-transitions {
+      type oc-yang:counter64;
+      status deprecated;
+      description
+        "Number of times the interface state has transitioned
+        between up and down since the time the device restarted
+        or the last-clear time, whichever is most recent.";
+      oc-ext:telemetry-on-change;
+    }
+
+  }
+
+  // data definition statements
+
+  grouping sub-unnumbered-config {
+    description
+      "Configuration data for unnumbered subinterfaces";
+
+    leaf enabled {
+      type boolean;
+      default false;
+      description
+        "Indicates that the subinterface is unnumbered.  By default
+        the subinterface is numbered, i.e., expected to have an
+        IP address configuration.";
+    }
+  }
+
+  grouping sub-unnumbered-state {
+    description
+      "Operational state data unnumbered subinterfaces";
+  }
+
+  grouping sub-unnumbered-top {
+    description
+      "Top-level grouping unnumbered subinterfaces";
+
+    container unnumbered {
+      description
+        "Top-level container for setting unnumbered interfaces.
+        Includes reference the interface that provides the
+        address information";
+
+      container config {
+        description
+          "Configuration data for unnumbered interface";
+        oc-ext:telemetry-on-change;
+
+        uses sub-unnumbered-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for unnumbered interfaces";
+
+        uses sub-unnumbered-config;
+        uses sub-unnumbered-state;
+      }
+
+      uses oc-if:interface-ref;
+    }
+  }
+
+  grouping subinterfaces-config {
+    description
+      "Configuration data for subinterfaces";
+
+    leaf index {
+      type uint32;
+      default 0;
+      description
+        "The index of the subinterface, or logical interface number.
+        On systems with no support for subinterfaces, or not using
+        subinterfaces, this value should default to 0, i.e., the
+        default subinterface.";
+    }
+
+    uses interface-common-config;
+
+  }
+
+  grouping subinterfaces-state {
+    description
+      "Operational state data for subinterfaces";
+
+    oc-ext:operational;
+
+    leaf name {
+      type string;
+      description
+        "The system-assigned name for the sub-interface.  This MAY
+        be a combination of the base interface name and the
+        subinterface index, or some other convention used by the
+        system.";
+      oc-ext:telemetry-on-change;
+    }
+
+    uses interface-common-state;
+
+    container counters {
+      description
+        "A collection of interface specific statistics entitites which are
+        not common to subinterfaces.";
+
+      uses interface-common-counters-state;
+      uses subinterfaces-counters-state;
+     }
+  }
+
+  grouping subinterfaces-top {
+    description
+      "Subinterface data for logical interfaces associated with a
+      given interface";
+
+    container subinterfaces {
+      description
+        "Enclosing container for the list of subinterfaces associated
+        with a physical interface";
+
+      list subinterface {
+        key "index";
+
+        description
+          "The list of subinterfaces (logical interfaces) associated
+          with a physical interface";
+
+        leaf index {
+          type leafref {
+            path "../config/index";
+          }
+          description
+            "The index number of the subinterface -- used to address
+            the logical interface";
+        }
+
+        container config {
+          description
+            "Configurable items at the subinterface level";
+          oc-ext:telemetry-on-change;
+
+          uses subinterfaces-config;
+        }
+
+        container state {
+
+          config false;
+          description
+            "Operational state data for logical interfaces";
+
+          uses subinterfaces-config;
+          uses subinterfaces-state;
+        }
+      }
+    }
+  }
+
+  grouping interfaces-top {
+    description
+      "Top-level grouping for interface configuration and
+      operational state data";
+
+    container interfaces {
+      description
+        "Top level container for interfaces, including configuration
+        and state data.";
+
+
+      list interface {
+        key "name";
+
+        description
+          "The list of named interfaces on the device.";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description
+            "References the name of the interface";
+            //TODO: need to consider whether this should actually
+            //reference the name in the state subtree, which
+            //presumably would be the system-assigned name, or the
+            //configured name.  Points to the config/name now
+            //because of YANG 1.0 limitation that the list
+            //key must have the same "config" as the list, and
+            //also can't point to a non-config node.
+        }
+
+        container config {
+          description
+            "Configurable items at the global, physical interface
+            level";
+          oc-ext:telemetry-on-change;
+
+          uses interface-phys-config;
+        }
+
+        container state {
+
+          config false;
+          description
+            "Operational state data at the global interface level";
+
+          uses interface-phys-config;
+          uses interface-common-state;
+
+          container counters {
+            description
+              "A collection of interface specific statistics entitites which are
+              not common to subinterfaces.";
+
+            uses interface-common-counters-state;
+            uses interface-counters-state;
+          }
+        }
+
+        uses interface-phys-holdtime-top {
+          when "./penalty-based-aied/config/suppress-threshold = 0
+          or ./penalty-based-aied/config/reuse-threshold = 0
+          or ./penalty-based-aied/config/flap-penalty = 0" {
+          description
+            "Hold time and penalty-based-aied are two algorithms to suppress
+            link transitions and must be mutually exclusive.";
+          }
+        }
+        uses link-damping-top;
+        uses subinterfaces-top;
+      }
+    }
+  }
+
+  uses interfaces-top;
+
+}
diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/mpls/openconfig-mpls-types.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/mpls/openconfig-mpls-types.yang
new file mode 100644
index 000000000..765e467cf
--- /dev/null
+++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/mpls/openconfig-mpls-types.yang
@@ -0,0 +1,548 @@
+module openconfig-mpls-types {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/mpls-types";
+
+  prefix "oc-mplst";
+
+  import openconfig-extensions { prefix oc-ext; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "General types for MPLS / TE data model";
+
+  oc-ext:openconfig-version "3.5.0";
+
+  revision "2023-12-14" {
+    description
+      "Added additional attributes oc-if:interface-ref
+      and metric attributes to static lsp";
+    reference "3.5.0";
+  }
+
+  revision "2021-12-01" {
+    description
+      "Add new identity for RSVP authentication types";
+    reference "3.4.0";
+  }
+
+  revision "2021-06-16" {
+    description
+      "Remove trailing whitespace";
+    reference "3.3.1";
+  }
+
+  revision "2021-03-23" {
+    description
+      "Add new identity for path metric types.";
+    reference "3.3.0";
+  }
+
+  revision "2020-02-04" {
+    description
+      "Consistent prefix for openconfig-mpls-types.";
+    reference "3.2.0";
+  }
+
+  revision "2019-03-26" {
+    description
+      "Add Pseudowire encapsulation.";
+    reference "3.1.0";
+  }
+
+  revision "2018-11-21" {
+    description
+      "Add OpenConfig module metadata extensions.";
+    reference "3.0.1";
+  }
+
+  revision "2018-07-02" {
+    description
+      "Add new RSVP-TE statistics, remove associated-rsvp-session
+      leaf. Remove use of date-and-time.";
+    reference "3.0.0";
+  }
+
+  revision "2018-06-16" {
+    description
+      "Included attributes for base LDP configuration.";
+     reference "2.6.0";
+  }
+
+  revision "2018-06-13" {
+    description
+      "Add ttl-propagation to global MPLS config";
+    reference "2.5.0";
+  }
+
+  revision "2018-06-05" {
+    description
+      "Fixed bugs in when statements on RSVP-TE attributes";
+    reference "2.4.2";
+  }
+
+  revision "2017-08-24" {
+    description
+      "Minor formatting fixes.";
+    reference "2.4.1";
+  }
+
+  revision "2017-06-21" {
+    description
+      "Add TC bits typedef.";
+    reference "2.4.0";
+  }
+
+  revision "2017-03-22" {
+    description
+      "Add RSVP calculated-absolute-subscription-bw";
+    reference "2.3.0";
+  }
+
+  revision "2017-01-26" {
+    description
+      "Add RSVP Tspec, clarify units for RSVP, remove unused LDP";
+    reference "2.2.0";
+  }
+
+  revision "2016-12-15" {
+    description
+      "Add additional MPLS parameters";
+    reference "2.1.0";
+  }
+
+  revision "2016-09-01" {
+    description
+      "Revisions based on implementation feedback";
+    reference "2.0.0";
+  }
+
+  revision "2016-08-08" {
+    description
+      "Public release of MPLS models";
+    reference "1.0.1";
+  }
+
+  // identity statements
+
+  identity PATH_COMPUTATION_METHOD {
+    description
+     "base identity for supported path computation
+      mechanisms";
+  }
+
+  identity LOCALLY_COMPUTED {
+    base PATH_COMPUTATION_METHOD;
+    description
+      "indicates a constrained-path LSP in which the
+      path is computed by the local LER";
+  }
+
+  identity EXTERNALLY_QUERIED {
+    base PATH_COMPUTATION_METHOD;
+    description
+     "Constrained-path LSP in which the path is
+      obtained by querying an external source, such as a PCE server.
+      In the case that an LSP is defined to be externally queried, it may
+      also have associated explicit definitions (which are provided to the
+      external source to aid computation); and the path that is returned by
+      the external source is not required to provide a wholly resolved
+      path back to the originating system - that is to say, some local
+      computation may also be required";
+  }
+
+  identity EXPLICITLY_DEFINED {
+    base PATH_COMPUTATION_METHOD;
+    description
+     "constrained-path LSP in which the path is
+      explicitly specified as a collection of strict or/and loose
+      hops";
+  }
+
+
+  // using identities rather than enum types to simplify adding new
+  // signaling protocols as they are introduced and supported
+  identity PATH_SETUP_PROTOCOL {
+    description
+      "base identity for supported MPLS signaling
+      protocols";
+  }
+
+  identity PATH_SETUP_RSVP {
+    base PATH_SETUP_PROTOCOL;
+    description
+      "RSVP-TE signaling protocol";
+  }
+
+  identity PATH_SETUP_SR {
+    base PATH_SETUP_PROTOCOL;
+    description
+      "Segment routing";
+  }
+
+  identity PATH_SETUP_LDP {
+    base PATH_SETUP_PROTOCOL;
+    description
+      "LDP - RFC 5036";
+  }
+
+
+  identity PROTECTION_TYPE {
+    description
+      "base identity for protection type";
+  }
+
+  identity UNPROTECTED {
+    base PROTECTION_TYPE;
+    description
+      "no protection is desired";
+  }
+
+  identity LINK_PROTECTION_REQUIRED {
+    base PROTECTION_TYPE;
+    description
+      "link protection is desired";
+  }
+
+  identity LINK_NODE_PROTECTION_REQUESTED {
+    base PROTECTION_TYPE;
+    description
+      "node and link protection are both desired";
+  }
+
+  identity LSP_ROLE {
+    description
+      "Base identity for describing the role of
+       label switched path at the current node";
+  }
+
+  identity INGRESS {
+    base LSP_ROLE;
+    description
+      "Label switched path is an ingress (headend)
+       LSP";
+  }
+
+  identity EGRESS {
+    base LSP_ROLE;
+    description
+      "Label switched path is an egress (tailend)
+       LSP";
+  }
+
+  identity TRANSIT {
+    base LSP_ROLE;
+    description
+      "Label switched path is a transit LSP";
+  }
+
+
+  identity TUNNEL_TYPE {
+    description
+      "Base identity from which specific tunnel types are
+      derived.";
+  }
+
+  identity P2P {
+    base TUNNEL_TYPE;
+    description
+      "TE point-to-point tunnel type.";
+  }
+
+  identity P2MP {
+    base TUNNEL_TYPE;
+    description
+      "TE point-to-multipoint tunnel type.";
+  }
+
+
+  identity LSP_OPER_STATUS {
+    description
+      "Base identity for LSP operational status";
+  }
+
+  identity DOWN {
+    base LSP_OPER_STATUS;
+    description
+      "LSP is operationally down or out of service";
+  }
+
+  identity UP {
+    base LSP_OPER_STATUS;
+    description
+      "LSP is operationally active and available
+       for traffic.";
+  }
+
+  identity TUNNEL_ADMIN_STATUS {
+    description
+      "Base identity for tunnel administrative status";
+  }
+
+  identity ADMIN_DOWN {
+    base TUNNEL_ADMIN_STATUS;
+    description
+      "LSP is administratively down";
+  }
+
+  identity ADMIN_UP {
+    base TUNNEL_ADMIN_STATUS;
+    description
+      "LSP is administratively up";
+  }
+
+  identity NULL_LABEL_TYPE {
+    description
+      "Base identity from which specific null-label types are
+      derived.";
+  }
+
+  identity EXPLICIT {
+    base NULL_LABEL_TYPE;
+    description
+      "Explicit null label is used.";
+  }
+
+  identity IMPLICIT {
+    base NULL_LABEL_TYPE;
+    description
+      "Implicit null label is used.";
+  }
+
+  identity LSP_METRIC_TYPE {
+    description
+      "Base identity for types of LSP metric specification";
+  }
+
+  identity LSP_METRIC_RELATIVE {
+    base LSP_METRIC_TYPE;
+    description
+      "The metric specified for the LSPs to which this identity refers
+      is specified as a relative value to the IGP metric cost to the
+      LSP's tail-end.";
+  }
+
+  identity LSP_METRIC_ABSOLUTE {
+    base LSP_METRIC_TYPE;
+    description
+      "The metric specified for the LSPs to which this identity refers
+      is specified as an absolute value";
+  }
+
+  identity LSP_METRIC_INHERITED {
+    base LSP_METRIC_TYPE;
+    description
+      "The metric for for the LSPs to which this identity refers is
+      not specified explicitly - but rather inherited from the IGP
+      cost directly";
+  }
+
+  // Note: The IANA PWE3 Types Registry has several more values than these
+  identity PSEUDOWIRE_ENCAPSULATION {
+    description
+      "Sets the PDU type of the PSEUDOWIRE Example in RFC4448. This value
+      should be enumerated from the IANA Pseudowire types registry";
+  }
+
+  identity PWE_ETHERNET_TAGGED_MODE {
+    base PSEUDOWIRE_ENCAPSULATION;
+    description
+      "Ethernet Tagged Mode RFC4448";
+    reference "IANA PWE3 0x0004";
+  }
+
+  identity PWE_ETHERNET_RAW_MODE {
+    base PSEUDOWIRE_ENCAPSULATION;
+    description
+      "Ethernet Raw Mode RFC4448";
+    reference "IANA PWE3 0x0005";
+  }
+
+  identity PATH_METRIC_TYPE {
+    description
+      "Base identity for path metric type.";
+  }
+
+  identity TE_METRIC {
+    base PATH_METRIC_TYPE;
+    description
+      "TE path metric.";
+    reference
+      "RFC3785: Use of Interior Gateway Protocol (IGP) Metric as a
+      second MPLS Traffic Engineering (TE) Metric.
+      RFC5440: Path Computation Element (PCE) Communication Protocol (PCEP).";
+  }
+
+  identity IGP_METRIC {
+    base PATH_METRIC_TYPE;
+    description
+      "IGP path metric.";
+    reference
+      "RFC5440: Path Computation Element (PCE) Communication Protocol (PCEP).";
+  }
+
+  identity HOP_COUNT {
+    base PATH_METRIC_TYPE;
+    description
+      "Hop count path metric.";
+    reference
+      "RFC5440: Path Computation Element (PCE) Communication Protocol (PCEP).";
+  }
+
+  identity PATH_DELAY {
+    base PATH_METRIC_TYPE;
+    description
+      "Unidirectional average link delay.
+      It represents the sum of the Link Delay metric
+      of all links along a P2P path.";
+    reference
+      "RFC8570 IS-IS Traffic Engineering (TE) Metric Extensions.
+      RFC7471 OSPF Traffic Engineering (TE) Metric Extensions.
+      RFC 8233: Extensions to the Path Computation Element Communication Protocol (PCEP)
+      to Compute Service-Aware Label Switched Paths (LSPs) Path Computation Element (PCE)
+      Communication Protocol (PCEP).";
+  }
+
+  identity RSVP_AUTH_TYPE {
+    description
+      "Base identity for RSVP message authentication types";
+    reference
+      "RFC2747: RSVP Cryptographic Authentication";
+  }
+
+  identity RSVP_AUTH_MD5 {
+    base RSVP_AUTH_TYPE;
+    description
+      "HMAC-MD5 message authentication";
+  }
+
+  // typedef statements
+  typedef mpls-label {
+    type union {
+      type uint32 {
+        range 16..1048575;
+      }
+      type enumeration {
+        enum IPV4_EXPLICIT_NULL {
+          value 0;
+          description
+            "valid at the bottom of the label stack,
+            indicates that stack must be popped and packet forwarded
+            based on IPv4 header";
+        }
+        enum ROUTER_ALERT {
+          value 1;
+          description
+            "allowed anywhere in the label stack except
+            the bottom, local router delivers packet to the local CPU
+            when this label is at the top of the stack";
+        }
+        enum IPV6_EXPLICIT_NULL {
+          value 2;
+          description
+            "valid at the bottom of the label stack,
+            indicates that stack must be popped and packet forwarded
+            based on IPv6 header";
+        }
+        enum IMPLICIT_NULL {
+          value 3;
+          description
+            "assigned by local LSR but not carried in
+            packets";
+        }
+        enum ENTROPY_LABEL_INDICATOR {
+          value 7;
+          description
+            "Entropy label indicator, to allow an LSR
+            to distinguish between entropy label and applicaiton
+            labels RFC 6790";
+        }
+        enum NO_LABEL {
+          description
+            "This value is utilised to indicate that the packet that
+            is forwarded by the local system does not have an MPLS
+            header applied to it. Typically, this is used at the
+            egress of an LSP";
+        }
+      }
+    }
+    description
+      "type for MPLS label value encoding";
+    reference "RFC 3032 - MPLS Label Stack Encoding";
+  }
+
+  typedef tunnel-type {
+    type enumeration {
+      enum P2P {
+        description
+          "point-to-point label-switched-path";
+      }
+      enum P2MP {
+        description
+          "point-to-multipoint label-switched-path";
+      }
+      enum MP2MP {
+        description
+          "multipoint-to-multipoint label-switched-path";
+      }
+    }
+    description
+      "defines the tunnel type for the LSP";
+    reference
+      "RFC 6388 - Label Distribution Protocol Extensions for
+      Point-to-Multipoint and Multipoint-to-Multipoint Label Switched
+      Paths
+      RFC 4875 - Extensions to  Resource Reservation Protocol
+      - Traffic Engineering (RSVP-TE) for Point-to-Multipoint TE
+      Label Switched Paths (LSPs)";
+  }
+
+  typedef bandwidth-kbps {
+    type uint64;
+    units "Kbps";
+    description
+      "Bandwidth values expressed in kilobits per second";
+  }
+
+  typedef bandwidth-mbps {
+    type uint64;
+    units "Mbps";
+    description
+      "Bandwidth values expressed in megabits per second";
+  }
+
+  typedef bandwidth-gbps {
+    type uint64;
+    units "Gbps";
+    description
+      "Bandwidth values expressed in gigabits per second";
+  }
+
+  typedef mpls-tc {
+    type uint8 {
+      range "0..7";
+    }
+    description
+      "Values of the MPLS Traffic Class (formerly known as
+      Experimental, EXP) bits";
+  }
+
+  // grouping statements
+
+  // data definition statements
+
+  // augment statements
+
+  // rpc statements
+
+  // notification statements
+
+}
diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/openconfig-extensions.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/openconfig-extensions.yang
new file mode 100644
index 000000000..2e0fd9f07
--- /dev/null
+++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/openconfig-extensions.yang
@@ -0,0 +1,206 @@
+module openconfig-extensions {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/openconfig-ext";
+
+  prefix "oc-ext";
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module provides extensions to the YANG language to allow
+    OpenConfig specific functionality and meta-data to be defined.";
+
+  oc-ext:openconfig-version "0.5.1";
+
+  revision "2022-10-05" {
+    description
+      "Add missing version statement.";
+    reference "0.5.1";
+  }
+
+  revision "2020-06-16" {
+    description
+      "Add extension for POSIX pattern statements.";
+    reference "0.5.0";
+  }
+
+  revision "2018-10-17" {
+    description
+      "Add extension for regular expression type.";
+    reference "0.4.0";
+  }
+
+  revision "2017-04-11" {
+    description
+      "rename password type to 'hashed' and clarify description";
+    reference "0.3.0";
+  }
+
+  revision "2017-01-29" {
+    description
+      "Added extension for annotating encrypted values.";
+    reference "0.2.0";
+  }
+
+  revision "2015-10-09" {
+    description
+      "Initial OpenConfig public release";
+    reference "0.1.0";
+  }
+
+
+  // extension statements
+  extension openconfig-version {
+    argument "semver" {
+      yin-element false;
+    }
+    description
+      "The OpenConfig version number for the module. This is
+      expressed as a semantic version number of the form:
+        x.y.z
+      where:
+        * x corresponds to the major version,
+        * y corresponds to a minor version,
+        * z corresponds to a patch version.
+      This version corresponds to the model file within which it is
+      defined, and does not cover the whole set of OpenConfig models.
+
+      Individual YANG modules are versioned independently -- the
+      semantic version is generally incremented only when there is a
+      change in the corresponding file.  Submodules should always
+      have the same semantic version as their parent modules.
+
+      A major version number of 0 indicates that this model is still
+      in development (whether within OpenConfig or with industry
+      partners), and is potentially subject to change.
+
+      Following a release of major version 1, all modules will
+      increment major revision number where backwards incompatible
+      changes to the model are made.
+
+      The minor version is changed when features are added to the
+      model that do not impact current clients use of the model.
+
+      The patch-level version is incremented when non-feature changes
+      (such as bugfixes or clarifications to human-readable
+      descriptions that do not impact model functionality) are made
+      that maintain backwards compatibility.
+
+      The version number is stored in the module meta-data.";
+  }
+
+  extension openconfig-hashed-value {
+    description
+      "This extension provides an annotation on schema nodes to
+      indicate that the corresponding value should be stored and
+      reported in hashed form.
+
+      Hash algorithms are by definition not reversible. Clients
+      reading the configuration or applied configuration for the node
+      should expect to receive only the hashed value. Values written
+      in cleartext will be hashed. This annotation may be used on
+      nodes such as secure passwords in which the device never reports
+      a cleartext value, even if the input is provided as cleartext.";
+  }
+
+  extension regexp-posix {
+     description
+      "This extension indicates that the regular expressions included
+      within the YANG module specified are conformant with the POSIX
+      regular expression format rather than the W3C standard that is
+      specified by RFC6020 and RFC7950.";
+  }
+
+  extension posix-pattern {
+    argument "pattern" {
+      yin-element false;
+    }
+    description
+      "Provides a POSIX ERE regular expression pattern statement as an
+      alternative to YANG regular expresssions based on XML Schema Datatypes.
+      It is used the same way as the standard YANG pattern statement defined in
+      RFC6020 and RFC7950, but takes an argument that is a POSIX ERE regular
+      expression string.";
+    reference
+      "POSIX Extended Regular Expressions (ERE) Specification:
+      https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_04";
+  }
+
+  extension telemetry-on-change {
+    description
+      "The telemetry-on-change annotation is specified in the context
+      of a particular subtree (container, or list) or leaf within the
+      YANG schema. Where specified, it indicates that the value stored
+      by the nodes within the context change their value only in response
+      to an event occurring. The event may be local to the target, for
+      example - a configuration change, or external - such as the failure
+      of a link.
+
+      When a telemetry subscription allows the target to determine whether
+      to export the value of a leaf in a periodic or event-based fashion
+      (e.g., TARGET_DEFINED mode in gNMI), leaves marked as
+      telemetry-on-change should only be exported when they change,
+      i.e., event-based.";
+  }
+
+  extension telemetry-atomic {
+    description
+      "The telemetry-atomic annotation is specified in the context of
+      a subtree (containre, or list), and indicates that all nodes
+      within the subtree are always updated together within the data
+      model. For example, all elements under the subtree may be updated
+      as a result of a new alarm being raised, or the arrival of a new
+       protocol message.
+
+      Transport protocols may use the atomic specification to determine
+      optimisations for sending or storing the corresponding data.";
+  }
+
+  extension operational {
+    description
+      "The operational annotation is specified in the context of a
+      grouping, leaf, or leaf-list within a YANG module. It indicates
+      that the nodes within the context are derived state on the device.
+
+      OpenConfig data models divide nodes into the following three categories:
+
+       - intended configuration - these are leaves within a container named
+         'config', and are the writable configuration of a target.
+       - applied configuration - these are leaves within a container named
+         'state' and are the currently running value of the intended configuration.
+       - derived state - these are the values within the 'state' container which
+         are not part of the applied configuration of the device. Typically, they
+         represent state values reflecting underlying operational counters, or
+         protocol statuses.";
+  }
+
+  extension catalog-organization {
+    argument "org" {
+      yin-element false;
+    }
+    description
+      "This extension specifies the organization name that should be used within
+      the module catalogue on the device for the specified YANG module. It stores
+      a pithy string where the YANG organization statement may contain more
+      details.";
+  }
+
+  extension origin {
+    argument "origin" {
+      yin-element false;
+    }
+    description
+      "This extension specifies the name of the origin that the YANG module
+      falls within. This allows multiple overlapping schema trees to be used
+      on a single network element without requiring module based prefixing
+      of paths.";
+  }
+}
diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/openconfig-transport/openconfig-transport-types.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/openconfig-transport/openconfig-transport-types.yang
new file mode 100644
index 000000000..dc5699842
--- /dev/null
+++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/openconfig-transport/openconfig-transport-types.yang
@@ -0,0 +1,1883 @@
+module openconfig-transport-types {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/transport-types";
+
+  prefix "oc-opt-types";
+
+  import openconfig-platform-types { prefix oc-platform-types; }
+  import openconfig-extensions { prefix oc-ext; }
+  import openconfig-types { prefix oc-types; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module contains general type definitions and identities
+    for optical transport models.";
+
+  oc-ext:openconfig-version "0.24.0";
+
+  revision "2024-03-20" {
+    description
+      "FlexO support, 800G trib protocol, and OSFP
+       description update for 800G.";
+     reference "0.24.0";
+  }
+
+  revision "2024-03-12" {
+    description
+      "Add TRIBUTARY_RATE_CLASS_TYPE's up to 3200G to support
+       mating of two 1600G line rates.";
+     reference "0.23.0";
+  }
+
+  revision "2024-01-17" {
+    description
+      "Update loopback-mode types.";
+    reference "0.22.0";
+  }
+
+  revision "2024-01-16" {
+    description
+      "Added form factors QSFP28_DD and CSFP.
+       Added new PMDs: ETH_100GBASE_ER4L (MSA 100GBASE-ER4 Lite),
+       ETH_1GBASE_LX10.
+       Added References for 100GBASE-CR4 and 40GGBASE-CR4 for DACs";
+     reference "0.21.0";
+  }
+
+  revision "2023-08-03" {
+    description
+      "Add QSFP56 and QSFP56_DD form factor identities and
+      deprecated QSFP56_DD_TYPE1 and QSFP56_DD_TYPE2 form factor identities.";
+    reference "0.20.0";
+  }
+
+  revision "2023-07-24" {
+    description
+      "Add SFP_DD and DSFP form factor identities.";
+    reference "0.19.0";
+  }
+
+  revision "2023-02-08" {
+    description
+      "Add ETH_100GBASE_DR PMD type";
+    reference "0.18.1";
+  }
+
+  revision "2022-12-05" {
+    description
+      "Fix trailing whitespace";
+    reference "0.17.1";
+  }
+
+  revision "2022-10-18" {
+    description
+      "Add ETH_400GMSA_PSM4 PMD type";
+    reference "0.17.0";
+  }
+
+  revision "2022-09-26" {
+    description
+      "Add SFP28 and SFP56 form factor identities.";
+    reference "0.16.0";
+  }
+
+  revision "2021-07-29" {
+    description
+      "Add several avg-min-max-instant-stats groupings";
+    reference "0.15.0";
+  }
+
+  revision "2021-03-22" {
+    description
+      "Add client mapping mode identityref.";
+    reference "0.14.0";
+  }
+
+  revision "2021-02-26" {
+    description
+      "Additional PMD types, form factors, and protocol types.";
+    reference "0.13.0";
+  }
+
+  revision "2020-08-12" {
+    description
+      "Additional tributary rates.";
+    reference "0.12.0";
+  }
+
+  revision "2020-04-24" {
+    description
+      "Add 400G protocol and additional tributary half rates.";
+    reference "0.11.0";
+  }
+
+  revision "2020-04-22" {
+    description
+      "Add AOC and DAC connector identities.";
+    reference "0.10.0";
+  }
+
+  revision "2019-06-27" {
+    description
+      "Add FIBER_JUMPER_TYPE identityref.";
+    reference "0.9.0";
+  }
+
+  revision "2019-06-21" {
+    description
+      "Generalize and rename optical port type identity";
+    reference "0.8.0";
+  }
+
+  revision "2018-11-21" {
+    description
+      "Add OpenConfig module metadata extensions.";
+    reference "0.7.1";
+  }
+
+  revision "2018-10-23" {
+    description
+      "Added frame mapping protocols for logical channels assignments
+      and tributary slot granularity for OTN logical channels";
+    reference "0.7.0";
+  }
+
+  revision "2018-05-16" {
+    description
+      "Added interval,min,max time to interval stats.";
+    reference "0.6.0";
+  }
+
+  revision "2017-08-16" {
+    description
+      "Added ODU Cn protocol type";
+    reference "0.5.0";
+  }
+
+  revision "2016-12-22" {
+    description
+      "Fixes and additions for terminal optics model";
+    reference "0.4.0";
+  }
+
+  // OpenConfig specific extensions for module metadata.
+  oc-ext:regexp-posix;
+  oc-ext:catalog-organization "openconfig";
+  oc-ext:origin "openconfig";
+
+  // typedef statements
+
+  typedef frequency-type {
+    type uint64;
+    units "MHz";
+    description
+      "Type for optical spectrum frequency values";
+  }
+
+  typedef admin-state-type {
+    type enumeration {
+      enum ENABLED {
+        description
+        "Sets the channel admin state to enabled";
+      }
+      enum DISABLED {
+        description
+        "Sets the channel admin state to disabled";
+      }
+      enum MAINT {
+        description
+        "Sets the channel to maintenance / diagnostic mode";
+      }
+    }
+    description "Administrative state modes for
+    logical channels in the transponder model.";
+  }
+
+  typedef loopback-mode-type {
+    type enumeration {
+      enum NONE {
+        description
+          "No loopback is applied";
+      }
+      enum FACILITY {
+        description
+          "A port internal loopback at ASIC level. The loopback directs
+          traffic normally transmitted on the port back to the device as
+          if received on the same port from an external source. Note this
+          mode is used when internal loopback does NOT specify MAC or PHY.";
+      }
+      enum TERMINAL {
+        description
+          "A port external loopback at ASIC level. The loopback which
+          directs traffic received from an external source on the port
+          back out the transmit side of the same port. Note this mode is
+          used when external loopback does NOT specify MAC or PHY";
+      }
+      enum ASIC_PHY_LOCAL {
+        description
+          "A port internal loopback at PHY module. The loopback directs
+          traffic normally transmitted on the port back to the device as
+          if received on the same port from an external source.";
+      }
+      enum ASIC_PHY_REMOTE {
+        description
+          "A port external loopback at PHY module. The loopback which
+          directs traffic received from an external source on the port
+          back out the transmit side of the same port.";
+      }
+      enum ASIC_MAC_LOCAL {
+        description
+          "A port internal loopback at MAC module. The loopback directs
+          traffic normally transmitted on the port back to the device as
+          if received on the same port from an external source.";
+      }
+      enum ASIC_MAC_REMOTE {
+        description
+          "A port external loopback at MAC module. The loopback which
+          directs traffic received from an external source on the port
+          back out the transmit side of the same port.";
+      }
+    }
+    default NONE;
+    description
+      "Loopback modes for transponder logical channels";
+  }
+
+  identity FRAME_MAPPING_PROTOCOL {
+    description
+      "Base identity for frame mapping protocols that can be used
+      when mapping Ethernet, OTN or other client signals to OTN
+      logical channels.";
+  }
+
+  identity AMP {
+    base FRAME_MAPPING_PROTOCOL;
+    description "Asynchronous Mapping Procedure";
+  }
+
+  identity GMP {
+    base FRAME_MAPPING_PROTOCOL;
+    description "Generic Mapping Procedure";
+  }
+
+  identity BMP {
+    base FRAME_MAPPING_PROTOCOL;
+    description "Bit-synchronous Mapping Procedure";
+  }
+
+  identity CBR {
+    base FRAME_MAPPING_PROTOCOL;
+    description "Constant Bit Rate Mapping Procedure";
+  }
+
+  identity GFP_T {
+    base FRAME_MAPPING_PROTOCOL;
+    description "Transparent Generic Framing Protocol";
+  }
+
+  identity GFP_F {
+    base FRAME_MAPPING_PROTOCOL;
+    description "Framed-Mapped Generic Framing Protocol";
+  }
+
+  identity TRIBUTARY_SLOT_GRANULARITY {
+    description
+      "Base identity for tributary slot granularity for OTN
+      logical channels.";
+  }
+
+  identity TRIB_SLOT_1.25G {
+    base TRIBUTARY_SLOT_GRANULARITY;
+    description
+      "The tributary slot with a bandwidth of approximately 1.25 Gb/s
+      as defined in ITU-T G.709 standard.";
+  }
+
+  identity TRIB_SLOT_2.5G {
+    base TRIBUTARY_SLOT_GRANULARITY;
+    description
+      "The tributary slot with a bandwidth of approximately 2.5 Gb/s
+      as defined in ITU-T G.709 standard.";
+  }
+
+  identity TRIB_SLOT_5G {
+    base TRIBUTARY_SLOT_GRANULARITY;
+    description
+      "The tributary slot with a bandwidth of approximately 5 Gb/s
+      as defined in ITU-T G.709 standard.";
+  }
+
+  // grouping statements
+
+  grouping avg-min-max-instant-stats-precision2-ps-nm {
+    description
+      "Common grouping for recording picosecond per nanometer
+      values with 2 decimal precision. Values include the
+      instantaneous, average, minimum, and maximum statistics.
+      Statistics are computed and reported based on a moving time
+      interval (e.g., the last 30s).  If supported by the device,
+      the time interval over which the statistics are computed, and
+      the times at which the minimum and maximum values occurred,
+      are also reported.";
+
+    leaf instant {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units ps-nm;
+      description
+        "The instantaneous value of the statistic.";
+    }
+
+    leaf avg {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units ps-nm;
+      description
+        "The arithmetic mean value of the statistic over the
+        time interval.";
+    }
+
+    leaf min {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units ps-nm;
+      description
+        "The minimum value of the statistic over the time interval.";
+    }
+
+    leaf max {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units ps-nm;
+      description
+        "The maximum value of the statistic over the time interval.";
+    }
+
+    uses oc-types:stat-interval-state;
+    uses oc-types:min-max-time;
+  }
+
+  grouping avg-min-max-instant-stats-precision2-ps {
+    description
+      "Common grouping for recording picosecond values with
+      2 decimal precision. Values include the
+      instantaneous, average, minimum, and maximum statistics.
+      Statistics are computed and reported based on a moving time
+      interval (e.g., the last 30s).  If supported by the device,
+      the time interval over which the statistics are computed, and
+      the times at which the minimum and maximum values occurred,
+      are also reported.";
+
+    leaf instant {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units ps;
+      description
+        "The instantaneous value of the statistic.";
+    }
+
+    leaf avg {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units ps;
+      description
+        "The arithmetic mean value of the statistic over the
+        time interval.";
+    }
+
+    leaf min {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units ps;
+      description
+        "The minimum value of the statistic over the time interval.";
+    }
+
+    leaf max {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units ps;
+      description
+        "The maximum value of the statistic over the time interval.";
+    }
+
+    uses oc-types:stat-interval-state;
+    uses oc-types:min-max-time;
+  }
+
+  grouping avg-min-max-instant-stats-precision2-ps2 {
+    description
+      "Common grouping for recording picosecond^2 values with
+      2 decimal precision. Values include the
+      instantaneous, average, minimum, and maximum statistics.
+      Statistics are computed and reported based on a moving time
+      interval (e.g., the last 30s).  If supported by the device,
+      the time interval over which the statistics are computed, and
+      the times at which the minimum and maximum values occurred,
+      are also reported.";
+
+    leaf instant {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units ps^2;
+      description
+        "The instantaneous value of the statistic.";
+    }
+
+    leaf avg {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units ps^2;
+      description
+        "The arithmetic mean value of the statistic over the
+        time interval.";
+    }
+
+    leaf min {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units ps^2;
+      description
+        "The minimum value of the statistic over the time interval.";
+    }
+
+    leaf max {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units ps^2;
+      description
+        "The maximum value of the statistic over the time
+        interval.";
+    }
+
+    uses oc-types:stat-interval-state;
+    uses oc-types:min-max-time;
+  }
+
+  grouping avg-min-max-instant-stats-precision18-ber {
+    description
+      "Common grouping for recording bit error rate (BER) values
+      with 18 decimal precision. Note that decimal64 supports
+      values as small as i x 10^-18 where i is an integer. Values
+      smaller than this should be reported as 0 to inidicate error
+      free or near error free performance. Values include the
+      instantaneous, average, minimum, and maximum statistics.
+      Statistics are computed and reported based on a moving time
+      interval (e.g., the last 30s).  If supported by the device,
+      the time interval over which the statistics are computed, and
+      the times at which the minimum and maximum values occurred,
+      are also reported.";
+
+    leaf instant {
+      type decimal64 {
+        fraction-digits 18;
+      }
+      units bit-errors-per-second;
+      description
+        "The instantaneous value of the statistic.";
+    }
+
+    leaf avg {
+      type decimal64 {
+        fraction-digits 18;
+      }
+      units bit-errors-per-second;
+      description
+        "The arithmetic mean value of the statistic over the
+        time interval.";
+    }
+
+    leaf min {
+      type decimal64 {
+        fraction-digits 18;
+      }
+      units bit-errors-per-second;
+      description
+        "The minimum value of the statistic over the time
+        interval.";
+    }
+
+    leaf max {
+      type decimal64 {
+        fraction-digits 18;
+      }
+      units bit-errors-per-second;
+      description
+        "The maximum value of the statistic over the time
+        interval.";
+    }
+
+    uses oc-types:stat-interval-state;
+    uses oc-types:min-max-time;
+  }
+
+  grouping avg-min-max-instant-stats-precision1-mhz {
+    description
+      "Common grouping for recording frequency values in MHz with
+      1 decimal precision. Values include the instantaneous, average,
+      minimum, and maximum statistics. Statistics are computed and
+      reported based on a moving time interval (e.g., the last 30s).
+      If supported by the device, the time interval over which the
+      statistics are computed, and the times at which the minimum and
+      maximum values occurred, are also reported.";
+
+    leaf instant {
+      type decimal64 {
+        fraction-digits 1;
+      }
+      units MHz;
+      description
+        "The instantaneous value of the statistic.";
+    }
+
+    leaf avg {
+      type decimal64 {
+        fraction-digits 1;
+      }
+      units MHz;
+      description
+        "The arithmetic mean value of the statistic over the
+        time interval.";
+    }
+
+    leaf min {
+      type decimal64 {
+        fraction-digits 1;
+      }
+      units MHz;
+      description
+        "The minimum value of the statistic over the time interval.";
+    }
+
+    leaf max {
+      type decimal64 {
+        fraction-digits 1;
+      }
+      units MHz;
+      description
+        "The maximum value of the statistic over the time interval.";
+    }
+
+    uses oc-types:stat-interval-state;
+    uses oc-types:min-max-time;
+  }
+
+  grouping avg-min-max-instant-stats-precision1-krads {
+    description
+      "Common grouping for recording kiloradian per second (krad/s) values
+      with 1 decimal precision. Values include the instantaneous,
+      average, minimum, and maximum statistics. Statistics are computed
+      and reported based on a moving time interval (e.g., the last 30s).
+      If supported by the device, the time interval over which the
+      statistics are computed, and the times at which the minimum and
+      maximum values occurred, are also reported.";
+
+    leaf instant {
+      type decimal64 {
+        fraction-digits 1;
+      }
+      units "krad/s";
+      description
+        "The instantaneous value of the statistic.";
+    }
+
+    leaf avg {
+      type decimal64 {
+        fraction-digits 1;
+      }
+      units "krad/s";
+      description
+        "The arithmetic mean value of the statistic over the
+        time interval.";
+    }
+
+    leaf min {
+      type decimal64 {
+        fraction-digits 1;
+      }
+      units "krad/s";
+      description
+        "The minimum value of the statistic over the time interval.";
+    }
+
+    leaf max {
+      type decimal64 {
+        fraction-digits 1;
+      }
+      units "krad/s";
+      description
+        "The maximum value of the statistic over the time interval.";
+    }
+
+    uses oc-types:stat-interval-state;
+    uses oc-types:min-max-time;
+  }
+
+  grouping avg-min-max-instant-stats-precision2-pct {
+    description
+      "Common grouping for percentage statistics with 2 decimal precision.
+      Values include the instantaneous, average, minimum, and maximum
+      statistics. Statistics are computed and reported based on a moving
+      time interval (e.g., the last 30s). If supported by the device,
+      the time interval over which the statistics are computed, and the
+      times at which the minimum and maximum values occurred, are also
+      reported.";
+
+    leaf instant {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units percentage;
+      description
+        "The instantaneous value of the statistic.";
+    }
+
+    leaf avg {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units percentage;
+      description
+        "The arithmetic mean value of the statistic over the
+        time interval.";
+    }
+
+    leaf min {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units percentage;
+      description
+        "The minimum value of the statistic over the time interval.";
+    }
+
+    leaf max {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units percentage;
+      description
+        "The maximum value of the statistic over the time interval.";
+    }
+
+    uses oc-types:stat-interval-state;
+    uses oc-types:min-max-time;
+  }
+
+
+  // identity statements
+
+  identity TRIBUTARY_PROTOCOL_TYPE {
+    description
+      "Base identity for protocol framing used by tributary
+      signals.";
+  }
+
+  identity PROT_1GE {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "1G Ethernet protocol";
+  }
+
+  identity PROT_OC48 {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "OC48 protocol";
+  }
+
+  identity PROT_STM16 {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "STM 16 protocol";
+  }
+
+  identity PROT_10GE_LAN {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "10G Ethernet LAN protocol";
+  }
+
+  identity PROT_10GE_WAN {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "10G Ethernet WAN protocol";
+  }
+
+  identity PROT_OC192 {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "OC 192 (9.6GB) port protocol";
+  }
+
+  identity PROT_STM64 {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "STM 64 protocol";
+  }
+
+  identity PROT_OTU2 {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "OTU 2 protocol";
+  }
+
+  identity PROT_OTU2E {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "OTU 2e protocol";
+  }
+
+  identity PROT_OTU1E {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "OTU 1e protocol";
+  }
+
+  identity PROT_ODU2 {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "ODU 2 protocol";
+  }
+
+  identity PROT_ODU2E {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "ODU 2e protocol";
+  }
+
+  identity PROT_40GE {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "40G Ethernet port protocol";
+  }
+
+  identity PROT_OC768 {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "OC 768 protocol";
+  }
+
+  identity PROT_STM256 {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "STM 256 protocol";
+  }
+
+  identity PROT_OTU3 {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "OTU 3 protocol";
+  }
+
+  identity PROT_ODU3 {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "ODU 3 protocol";
+  }
+
+  identity PROT_100GE {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "100G Ethernet protocol";
+  }
+
+  identity PROT_100G_MLG {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "100G MLG protocol";
+  }
+
+  identity PROT_OTU4 {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "OTU4 signal protocol (112G) for transporting
+    100GE signal";
+  }
+
+  identity PROT_OTUCN {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "OTU Cn protocol";
+  }
+
+  identity PROT_ODUCN {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "ODU Cn protocol";
+  }
+
+  identity PROT_ODU4 {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "ODU 4 protocol";
+  }
+
+  identity PROT_400GE {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "400G Ethernet protocol";
+  }
+
+  identity PROT_800GE {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "800G Ethernet protocol";
+  }
+
+  identity PROT_OTSIG {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "Optical tributary signal group protocol";
+  }
+
+  identity PROT_ODUFLEX_CBR {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "ODU Flex with CBR protocol";
+  }
+
+  identity PROT_FLEXO {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description
+      "FlexO protocol as defined in ITU-T G.709.1 and ITU-T G.709.3";
+  }
+
+  identity PROT_ODUFLEX_GFP {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "ODU Flex with GFP protocol";
+  }
+
+  identity TRANSCEIVER_FORM_FACTOR_TYPE {
+    description
+      "Base identity for identifying the type of pluggable optic
+      transceiver (i.e,. form factor) used in a port.";
+  }
+
+  identity CFP {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "C form-factor pluggable, that can support up to a
+      100 Gb/s signal with 10x10G or 4x25G physical channels";
+  }
+
+  identity CFP2 {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "1/2 C form-factor pluggable, that can support up to a
+      200 Gb/s signal with 10x10G, 4x25G, or 8x25G physical
+      channels";
+  }
+
+  identity CFP2_ACO {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "CFP2 analog coherent optics transceiver, supporting
+      100 Gb, 200Gb, and 250 Gb/s signal.";
+  }
+
+  identity CFP4 {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "1/4 C form-factor pluggable, that can support up to a
+      100 Gb/s signal with 10x10G or 4x25G physical channels";
+  }
+
+  identity QSFP {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "OriginalQuad Small Form-factor Pluggable transceiver that can
+      support 4x1G physical channels.  Not commonly used.";
+  }
+
+  identity QSFP_PLUS {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "Quad Small Form-factor Pluggable transceiver that can support
+      up to 4x10G physical channels.";
+  }
+
+  identity QSFP28 {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "QSFP pluggable optic with support for up to 4x28G physical
+      channels";
+  }
+
+  identity QSFP28_DD {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "QSFP-DD with electrical interfaces consisting of 8 lanes that operate at up to
+      25 Gbps with NRZ modulation";
+    reference "http://qsfp-dd.com";
+  }
+
+  identity QSFP56 {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "QSFP pluggable optic with support for up to 4x56G physical
+      channels";
+  }
+
+  identity QSFP56_DD {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "QSFP-DD electrical interfaces will employ 8 lanes that operate up to
+      25 Gbps NRZ modulation or 50 Gbps PAM4 modulation, providing
+      solutions up to 200 Gbps or 400 Gbps aggregate";
+    reference "http://qsfp-dd.com";
+  }
+
+  identity QSFP56_DD_TYPE1 {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    status deprecated;
+    description
+      "QSFP DD pluggable optic with support for up to 8x56G physical
+      channels. Type 1 uses eight optical and electrical signals.";
+  }
+
+  identity QSFP56_DD_TYPE2 {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    status deprecated;
+    description
+      "QSFP DD pluggable optic with support for up to 4x112G physical
+      channels. Type 2 uses four optical and eight electrical
+      signals.";
+  }
+
+  identity CPAK {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "Cisco CPAK transceiver supporting 100 Gb/s.";
+  }
+
+  identity SFP {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "Small form-factor pluggable transceiver supporting up to
+      10 Gb/s signal";
+  }
+
+  identity SFP_PLUS {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "Enhanced small form-factor pluggable transceiver supporting
+      up to 16 Gb/s signals, including 10 GbE and OTU2";
+  }
+
+  identity CSFP {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "Compact Small form-factor pluggable transceiver. It is a version
+      of SFP with the same mechanical form factor allowing two independent
+      bidirectional channels per port.";
+  }
+
+
+
+  identity SFP28 {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "Small form-factor pluggable transceiver supporting up to
+      25 Gb/s signal";
+  }
+
+  identity SFP56 {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "Small form-factor pluggable transceiver supporting up to
+      50 Gb/s signal";
+  }
+
+  identity SFP_DD {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "SFP-DD electrical interfaces will employ 2 lanes that operate up to
+      25 Gbps NRZ modulation or 56 Gbps PAM4 modulation, providing
+      solutions up to 50 Gbps or 112 Gbps PAM4 aggregate";
+    reference "http://sfp-dd.com";
+  }
+
+  identity DSFP {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "A transceiver implementing the DSFP Transceiver specification";
+    reference "https://dsfpmsa.org/";
+  }
+
+  identity XFP {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "10 Gigabit small form factor pluggable transceiver supporting
+      10 GbE and OTU2";
+  }
+
+  identity X2 {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "10 Gigabit small form factor pluggable transceiver supporting
+      10 GbE using a XAUI inerface and 4 data channels.";
+  }
+
+  identity OSFP {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "Octal small form factor pluggable transceiver supporting
+      400 Gb/s or 800 Gb/s.";
+  }
+
+  identity NON_PLUGGABLE {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "Represents a port that does not require a pluggable optic,
+      e.g., with on-board optics like COBO";
+  }
+
+  identity OTHER {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "Represents a transceiver form factor not otherwise listed";
+  }
+
+  identity FIBER_CONNECTOR_TYPE {
+    description
+      "Type of optical fiber connector";
+  }
+
+  identity SC_CONNECTOR {
+    base FIBER_CONNECTOR_TYPE;
+    description
+      "SC type fiber connector";
+  }
+
+  identity LC_CONNECTOR {
+    base FIBER_CONNECTOR_TYPE;
+    description
+      "LC type fiber connector";
+  }
+
+  identity MPO_CONNECTOR {
+    base FIBER_CONNECTOR_TYPE;
+    description
+      "MPO (multi-fiber push-on/pull-off) type fiber connector
+      1x12 fibers";
+  }
+
+  identity AOC_CONNECTOR {
+    base FIBER_CONNECTOR_TYPE;
+    description
+      "AOC (active optical cable) type fiber connector";
+  }
+
+  identity DAC_CONNECTOR {
+    base FIBER_CONNECTOR_TYPE;
+    description
+      "DAC (direct attach copper) type fiber connector";
+  }
+
+  identity ETHERNET_PMD_TYPE {
+    description
+      "Ethernet compliance codes (PMD) supported by transceivers";
+  }
+
+  identity ETH_1000BASE_LX10 {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: ETH_1000BASE_LX10";
+    reference "802.3ah-2004(CL59)";
+  }
+
+  identity ETH_10GBASE_LRM {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 10GBASE_LRM";
+  }
+
+  identity ETH_10GBASE_LR {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 10GBASE_LR";
+  }
+
+  identity ETH_10GBASE_ZR {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 10GBASE_ZR";
+  }
+
+  identity ETH_10GBASE_ER {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 10GBASE_ER";
+  }
+
+  identity ETH_10GBASE_SR {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 10GBASE_SR";
+  }
+
+  identity ETH_40GBASE_CR4 {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 40GBASE_CR4.
+    This PMD is used in Direct Attach Cables (DAC)
+    and Active Optical Cables (AOC)";
+    reference "IEEE 802.3ba 40GBASE-CR4";
+  }
+
+  identity ETH_40GBASE_SR4 {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 40GBASE_SR4";
+  }
+
+  identity ETH_40GBASE_LR4 {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 40GBASE_LR4";
+  }
+
+  identity ETH_40GBASE_ER4 {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 40GBASE_ER4";
+  }
+
+  identity ETH_40GBASE_PSM4 {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 40GBASE_PSM4";
+  }
+
+  identity ETH_4X10GBASE_LR {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 4x10GBASE_LR";
+  }
+
+  identity ETH_4X10GBASE_SR {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 4x10GBASE_SR";
+  }
+
+  identity ETH_100G_AOC {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 100G_AOC";
+  }
+
+  identity ETH_100G_ACC {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 100G_ACC";
+  }
+
+  identity ETH_100GBASE_SR10 {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 100GBASE_SR10";
+  }
+
+  identity ETH_100GBASE_SR4 {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 100GBASE_SR4";
+  }
+
+  identity ETH_100GBASE_LR4 {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 100GBASE_LR4";
+  }
+
+  identity ETH_100GBASE_ER4L {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 100GBASE_ER4L";
+  }
+
+  identity ETH_100GBASE_ER4 {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 100GBASE_ER4";
+  }
+
+  identity ETH_100GBASE_CWDM4 {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 100GBASE_CWDM4";
+  }
+
+  identity ETH_100GBASE_CLR4 {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 100GBASE_CLR4";
+  }
+
+  identity ETH_100GBASE_PSM4 {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 100GBASE_PSM4";
+  }
+
+  identity ETH_100GBASE_CR4 {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 100GBASE_CR4.
+      This PMD is used in Direct Attach Cables (DAC)
+      and Active Optical Cables (AOC)";
+    reference "IEEE 802.3bj 100GBASE-CR4";
+  }
+
+  identity ETH_100GBASE_FR {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 100GBASE_FR";
+  }
+
+  identity ETH_100GBASE_DR {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 100GBASE_DR";
+  }
+
+  identity ETH_400GBASE_ZR {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 400GBASE_ZR";
+  }
+
+  identity ETH_400GBASE_LR4 {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 400GBASE_LR4";
+  }
+
+  identity ETH_400GBASE_FR4 {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 400GBASE_FR4";
+  }
+
+  identity ETH_400GBASE_LR8 {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 400GBASE_LR8";
+  }
+
+  identity ETH_400GBASE_DR4 {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 400GBASE_DR4";
+  }
+
+  identity ETH_400GMSA_PSM4 {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 400GMSA_PSM4";
+  }
+
+  identity ETH_UNDEFINED {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: undefined";
+  }
+
+  identity SONET_APPLICATION_CODE {
+    description
+      "Supported SONET/SDH application codes";
+  }
+
+  identity VSR2000_3R2 {
+    base SONET_APPLICATION_CODE;
+    description
+      "SONET/SDH application code: VSR2000_3R2";
+  }
+
+  identity VSR2000_3R3 {
+    base SONET_APPLICATION_CODE;
+    description
+      "SONET/SDH application code: VSR2000_3R3";
+  }
+
+  identity VSR2000_3R5 {
+    base SONET_APPLICATION_CODE;
+    description
+      "SONET/SDH application code: VSR2000_3R5";
+  }
+
+  identity SONET_UNDEFINED {
+    base SONET_APPLICATION_CODE;
+    description
+      "SONET/SDH application code: undefined";
+  }
+
+  identity OTN_APPLICATION_CODE {
+    description
+      "Supported OTN application codes";
+  }
+
+  identity P1L1_2D1 {
+    base OTN_APPLICATION_CODE;
+    description
+      "OTN application code: P1L1_2D1";
+  }
+
+  identity P1S1_2D2 {
+    base OTN_APPLICATION_CODE;
+    description
+      "OTN application code: P1S1_2D2";
+  }
+
+  identity P1L1_2D2 {
+    base OTN_APPLICATION_CODE;
+    description
+      "OTN application code: P1L1_2D2";
+  }
+
+  identity OTN_UNDEFINED {
+    base OTN_APPLICATION_CODE;
+    description
+      "OTN application code: undefined";
+  }
+
+  identity TRIBUTARY_RATE_CLASS_TYPE {
+    description
+      "Rate of tributary signal _- identities will typically reflect
+      rounded bit rate.";
+  }
+
+  identity TRIB_RATE_1G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "1G tributary signal rate";
+  }
+
+  identity TRIB_RATE_2.5G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "2.5G tributary signal rate";
+  }
+
+  identity TRIB_RATE_10G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "10G tributary signal rate";
+  }
+
+  identity TRIB_RATE_40G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "40G tributary signal rate";
+  }
+
+  identity TRIB_RATE_100G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "100G tributary signal rate";
+  }
+
+  identity TRIB_RATE_150G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "150G tributary signal rate";
+  }
+
+  identity TRIB_RATE_200G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "200G tributary signal rate";
+  }
+
+  identity TRIB_RATE_250G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "250G tributary signal rate";
+  }
+
+  identity TRIB_RATE_300G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "300G tributary signal rate";
+  }
+
+  identity TRIB_RATE_350G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "350G tributary signal rate";
+  }
+
+  identity TRIB_RATE_400G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "400G tributary signal rate";
+  }
+
+  identity TRIB_RATE_450G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "450G tributary signal rate";
+  }
+
+  identity TRIB_RATE_500G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "500G tributary signal rate";
+  }
+
+  identity TRIB_RATE_550G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "550G tributary signal rate";
+  }
+
+  identity TRIB_RATE_600G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "600G tributary signal rate";
+  }
+
+  identity TRIB_RATE_650G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "650G tributary signal rate";
+  }
+
+  identity TRIB_RATE_700G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "700G tributary signal rate";
+  }
+
+  identity TRIB_RATE_750G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "750G tributary signal rate";
+  }
+
+  identity TRIB_RATE_800G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "800G tributary signal rate";
+  }
+
+  identity TRIB_RATE_850G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "850G tributary signal rate";
+  }
+
+  identity TRIB_RATE_900G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "900G tributary signal rate";
+  }
+
+  identity TRIB_RATE_950G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "950G tributary signal rate";
+  }
+
+  identity TRIB_RATE_1000G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "1000G tributary signal rate";
+  }
+
+  identity TRIB_RATE_1050G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "1050G tributary signal rate";
+  }
+
+  identity TRIB_RATE_1100G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "1100G tributary signal rate";
+  }
+
+  identity TRIB_RATE_1150G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "1150G tributary signal rate";
+  }
+
+  identity TRIB_RATE_1200G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "1200G tributary signal rate";
+  }
+
+  identity TRIB_RATE_1250G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "1250G tributary signal rate";
+  }
+
+  identity TRIB_RATE_1300G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "1300G tributary signal rate";
+  }
+
+  identity TRIB_RATE_1350G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "1350G tributary signal rate";
+  }
+
+  identity TRIB_RATE_1400G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "1400G tributary signal rate";
+  }
+
+  identity TRIB_RATE_1450G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "1450G tributary signal rate";
+  }
+
+  identity TRIB_RATE_1500G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "1500G tributary signal rate";
+  }
+
+  identity TRIB_RATE_1550G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "1550G tributary signal rate";
+  }
+
+  identity TRIB_RATE_1600G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "1600G tributary signal rate";
+  }
+
+  identity TRIB_RATE_1650G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "1650G tributary signal rate";
+  }
+
+  identity TRIB_RATE_1700G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "1700G tributary signal rate";
+  }
+
+  identity TRIB_RATE_1750G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "1750G tributary signal rate";
+  }
+
+  identity TRIB_RATE_1800G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "1800G tributary signal rate";
+  }
+
+  identity TRIB_RATE_1850G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "1850G tributary signal rate";
+  }
+
+  identity TRIB_RATE_1900G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "1900G tributary signal rate";
+  }
+
+  identity TRIB_RATE_1950G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "1950G tributary signal rate";
+  }
+
+  identity TRIB_RATE_2000G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "2000G tributary signal rate";
+  }
+
+  identity TRIB_RATE_2050G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "2050G tributary signal rate";
+  }
+
+  identity TRIB_RATE_2100G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "2100G tributary signal rate";
+  }
+
+  identity TRIB_RATE_2150G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "2150G tributary signal rate";
+  }
+
+  identity TRIB_RATE_2200G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "2200G tributary signal rate";
+  }
+
+  identity TRIB_RATE_2250G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "2250G tributary signal rate";
+  }
+
+  identity TRIB_RATE_2300G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "2300G tributary signal rate";
+  }
+
+  identity TRIB_RATE_2350G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "2350G tributary signal rate";
+  }
+
+  identity TRIB_RATE_2400G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "2400G tributary signal rate";
+  }
+
+  identity TRIB_RATE_2450G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "2450G tributary signal rate";
+  }
+
+  identity TRIB_RATE_2500G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "2500G tributary signal rate";
+  }
+
+  identity TRIB_RATE_2550G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "2550G tributary signal rate";
+  }
+
+  identity TRIB_RATE_2600G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "2600G tributary signal rate";
+  }
+
+  identity TRIB_RATE_2650G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "2650G tributary signal rate";
+  }
+
+  identity TRIB_RATE_2700G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "2700G tributary signal rate";
+  }
+
+  identity TRIB_RATE_2750G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "2750G tributary signal rate";
+  }
+
+  identity TRIB_RATE_2800G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "2800G tributary signal rate";
+  }
+
+  identity TRIB_RATE_2850G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "2850G tributary signal rate";
+  }
+
+  identity TRIB_RATE_2900G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "2900G tributary signal rate";
+  }
+
+  identity TRIB_RATE_2950G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "2950G tributary signal rate";
+  }
+
+  identity TRIB_RATE_3000G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "3000G tributary signal rate";
+  }
+
+  identity TRIB_RATE_3050G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "3050G tributary signal rate";
+  }
+
+  identity TRIB_RATE_3100G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "3100G tributary signal rate";
+  }
+
+  identity TRIB_RATE_3150G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "3150G tributary signal rate";
+  }
+
+  identity TRIB_RATE_3200G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "3200G tributary signal rate";
+  }
+
+  identity LOGICAL_ELEMENT_PROTOCOL_TYPE {
+    description
+      "Type of protocol framing used on the logical channel or
+      tributary";
+  }
+
+  identity PROT_ETHERNET {
+    base LOGICAL_ELEMENT_PROTOCOL_TYPE;
+    description
+      "Ethernet protocol framing";
+  }
+
+  identity PROT_OTN {
+    base LOGICAL_ELEMENT_PROTOCOL_TYPE;
+    description
+      "OTN protocol framing";
+  }
+
+  identity OPTICAL_CHANNEL {
+    base oc-platform-types:OPENCONFIG_HARDWARE_COMPONENT;
+    description
+      "Optical channels act as carriers for transport traffic
+      directed over a line system.  They are represented as
+      physical components in the physical inventory model.";
+  }
+
+  identity FIBER_JUMPER_TYPE {
+    description
+      "Types of fiber jumpers used for connecting device ports";
+  }
+
+  identity FIBER_JUMPER_SIMPLEX {
+    base FIBER_JUMPER_TYPE;
+    description
+      "Simplex fiber jumper";
+  }
+
+  identity FIBER_JUMPER_MULTI_FIBER_STRAND {
+    base FIBER_JUMPER_TYPE;
+    description
+      "One strand of a fiber jumper which contains multiple fibers
+      within it, such as an MPO based fiber jumper";
+  }
+
+  identity OPTICAL_PORT_TYPE {
+    description
+      "Type definition for optical transport port types";
+  }
+
+  identity INGRESS {
+    base OPTICAL_PORT_TYPE;
+    description
+      "Ingress port, corresponding to a signal entering
+      a line system device such as an amplifier or wavelength
+      router.";
+  }
+
+  identity EGRESS {
+    base OPTICAL_PORT_TYPE;
+    description
+      "Egress port, corresponding to a signal exiting
+      a line system device such as an amplifier or wavelength
+      router.";
+  }
+
+  identity ADD {
+    base OPTICAL_PORT_TYPE;
+    description
+      "Add port, corresponding to a signal injected
+      at a wavelength router.";
+  }
+
+  identity DROP {
+    base OPTICAL_PORT_TYPE;
+    description
+      "Drop port, corresponding to a signal dropped
+      at a wavelength router.";
+  }
+
+  identity MONITOR {
+    base OPTICAL_PORT_TYPE;
+    description
+      "Monitor port, corresponding to a signal used by an optical
+      channel monitor. This is used to represent the connection
+      that a channel monitor port is connected to, typically on a
+      line system device. This  connection may be via physical cable
+      and faceplate ports or internal to the device";
+  }
+
+  identity TERMINAL_CLIENT {
+    base OPTICAL_PORT_TYPE;
+    description
+      "Client-facing port on a terminal optics device (e.g.,
+      transponder or muxponder).";
+  }
+
+  identity TERMINAL_LINE {
+    base OPTICAL_PORT_TYPE;
+    description
+      "Line-facing port on a terminal optics device (e.g.,
+      transponder or muxponder).";
+  }
+
+  identity CLIENT_MAPPING_MODE {
+    description
+      "Type definition for optical transport client mapping modes.";
+  }
+
+  identity MODE_1X100G {
+    base CLIENT_MAPPING_MODE;
+    description
+      "1 x 100G client mapping mode.";
+  }
+
+  identity MODE_1X200G {
+    base CLIENT_MAPPING_MODE;
+    description
+      "1 x 200G client mapping mode.";
+  }
+
+  identity MODE_1X400G {
+    base CLIENT_MAPPING_MODE;
+    description
+      "1 x 400G client mapping mode.";
+  }
+
+  identity MODE_2X100G {
+    base CLIENT_MAPPING_MODE;
+    description
+      "2 x 100G client mapping mode.";
+  }
+
+  identity MODE_2X200G {
+    base CLIENT_MAPPING_MODE;
+    description
+      "2 x 200G client mapping mode.";
+  }
+
+  identity MODE_3X100G {
+    base CLIENT_MAPPING_MODE;
+    description
+      "3 x 100G client mapping mode.";
+  }
+
+  identity MODE_4X100G {
+    base CLIENT_MAPPING_MODE;
+    description
+      "4 x 100G client mapping mode.";
+  }
+
+  identity TRANSCEIVER_MODULE_FUNCTIONAL_TYPE {
+    description
+      "Type definition for transceiver module functional types.";
+  }
+
+  identity TYPE_STANDARD_OPTIC {
+    base TRANSCEIVER_MODULE_FUNCTIONAL_TYPE;
+    description
+      "Standard optic using a grey wavelength (i.e. 1310, 1550, etc.)
+      and on-off-keying (OOK) modulation.";
+  }
+
+  identity TYPE_DIGITAL_COHERENT_OPTIC {
+    base TRANSCEIVER_MODULE_FUNCTIONAL_TYPE;
+    description
+      "Digital coherent module which transmits a phase / amplitude
+      modulated signal and uses a digital signal processor to receive
+      and decode the received signal.";
+  }
+}
diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/platform/openconfig-platform-common.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/platform/openconfig-platform-common.yang
new file mode 100644
index 000000000..afb533067
--- /dev/null
+++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/platform/openconfig-platform-common.yang
@@ -0,0 +1,246 @@
+submodule openconfig-platform-common {
+
+  yang-version "1";
+
+  belongs-to openconfig-platform {
+    prefix "oc-platform";
+  }
+
+  import openconfig-platform-types { prefix oc-platform-types; }
+  import openconfig-extensions { prefix oc-ext; }
+  import openconfig-types { prefix oc-types; }
+
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This modules contains common groupings that are used in multiple
+    components within the platform module.";
+
+  oc-ext:openconfig-version "0.24.0";
+
+  revision "2023-11-28" {
+    description
+      "Add model-name";
+    reference "0.24.0";
+  }
+
+  revision "2023-02-13" {
+    description
+      "Refactor resource utilization threshold config into a separate grouping.
+      Update 'utilization resource' to 'resource utilization'.";
+    reference "0.23.0";
+  }
+
+  revision "2022-12-20" {
+    description
+      "Add threshold and threshold-exceeded for resource usage.";
+    reference "0.22.0";
+  }
+
+  revision "2022-12-19" {
+    description
+      "Update last-high-watermark timestamp documentation.";
+    reference "0.21.1";
+  }
+
+  revision "2022-09-26" {
+    description
+      "Add state data for base-mac-address.";
+    reference "0.21.0";
+  }
+
+  revision "2022-08-31" {
+    description
+      "Add new state data for component CLEI code.";
+    reference "0.20.0";
+  }
+
+  revision "2022-07-28" {
+    description
+      "Add grouping for component power management";
+    reference "0.19.0";
+  }
+
+  revision "2022-07-11" {
+    description
+      "Add switchover ready";
+    reference "0.18.0";
+  }
+
+  revision "2022-06-10" {
+    description
+      "Specify units and epoch for switchover and reboot times.";
+    reference "0.17.0";
+  }
+
+  revision "2022-04-21" {
+    description
+      "Add platform utilization.";
+    reference "0.16.0";
+  }
+
+  // extension statements
+
+  // feature statements
+
+  // identity statements
+
+  // typedef statements
+
+  // grouping statements
+
+  grouping platform-resource-utilization-top {
+    description
+      "Top level grouping of platform resource utilization.";
+
+    container utilization {
+      description
+        "Resource utilization of the component.";
+
+      container resources {
+        description
+          "Enclosing container for the resources in this component.";
+
+        list resource {
+          key "name";
+          description
+            "List of resources, keyed by resource name.";
+
+          leaf name {
+            type leafref {
+              path "../config/name";
+            }
+            description
+              "References the resource name.";
+          }
+
+          container config {
+            description
+              "Configuration data for each resource.";
+
+            uses platform-resource-utilization-config;
+          }
+
+          container state {
+            config false;
+            description
+              "Operational state data for each resource.";
+
+            uses platform-resource-utilization-config;
+            uses platform-resource-utilization-state;
+          }
+        }
+      }
+    }
+  }
+
+  grouping resource-utilization-threshold-common {
+    description
+      "Common threshold configuration model for resource utilization.";
+    leaf used-threshold-upper {
+      type oc-types:percentage;
+      description
+        "The used percentage value (used / (used + free) * 100) that
+        when crossed will set utilization-threshold-exceeded to 'true'.";
+    }
+
+    leaf used-threshold-upper-clear {
+      type oc-types:percentage;
+      description
+        "The used percentage value (used / (used + free) * 100) that when
+        crossed will set utilization-threshold-exceeded to 'false'.";
+    }
+  }
+
+  grouping platform-resource-utilization-config {
+    description
+      "Configuration data for resource utilization.";
+
+    leaf name {
+      type string;
+      description
+        "Resource name within the component.";
+    }
+
+    uses resource-utilization-threshold-common;
+  }
+
+  grouping platform-resource-utilization-state {
+    description
+      "Operational state data for resource utilization.";
+
+    leaf used {
+      type uint64;
+      description
+        "Number of entries currently in use for the resource.";
+    }
+
+    leaf committed {
+      type uint64;
+      description
+        "Number of entries currently reserved for this resource. This is only
+        relevant to tables which allocate a block of resource for a given
+        feature.";
+    }
+
+    leaf free {
+      type uint64;
+      description
+        "Number of entries available to use.";
+    }
+
+    leaf max-limit {
+      type uint64;
+      description
+        "Maximum number of entries available for the resource. The value
+        is the theoretical maximum resource utilization possible.";
+    }
+
+    leaf high-watermark {
+      type uint64;
+      description
+        "A watermark of highest number of entries used for this resource.";
+    }
+
+    leaf last-high-watermark {
+      type oc-types:timeticks64;
+      description
+        "The timestamp when the high-watermark was last updated. The value
+        is the timestamp in nanoseconds relative to the Unix Epoch
+        (Jan 1, 1970 00:00:00 UTC).";
+    }
+
+    leaf used-threshold-upper-exceeded {
+      type boolean;
+      description
+        "This value is set to true when the used percentage value
+        (used / (used + free) * 100) has crossed the used-threshold-upper for this
+        resource and false when the used percentage value has crossed the configured
+        used-threshold-upper-clear value for this resource.";
+    }
+  }
+
+  grouping component-power-management {
+    description
+      "Common grouping for managing component power";
+
+    leaf power-admin-state {
+      type oc-platform-types:component-power-type;
+      default POWER_ENABLED;
+      description
+        "Enable or disable power to the component";
+    }
+  }
+
+  // data definition statements
+
+  // augment statements
+
+  // rpc statements
+
+  // notification statements
+}
diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/platform/openconfig-platform-port.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/platform/openconfig-platform-port.yang
new file mode 100644
index 000000000..effb85bb7
--- /dev/null
+++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/platform/openconfig-platform-port.yang
@@ -0,0 +1,327 @@
+module openconfig-platform-port {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/platform/port";
+
+  prefix "oc-port";
+
+  // import some basic types
+  import openconfig-platform { prefix oc-platform; }
+  import openconfig-interfaces { prefix oc-if; }
+  import openconfig-if-ethernet { prefix oc-eth; }
+  import openconfig-extensions { prefix oc-ext; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module defines data related to PORT components in the
+    openconfig-platform model";
+
+  oc-ext:openconfig-version "1.0.1";
+
+  revision "2023-03-22" {
+    description
+      "Clarify use of the interface-ref type.";
+    reference "1.0.1";
+  }
+
+  revision "2023-01-19" {
+    description
+      "Add clarification of the definition of a physical channel, and
+      example configurations.";
+    reference "1.0.0";
+  }
+
+  revision "2021-10-01" {
+    description
+      "Fix indentation for 'list group'";
+    reference "0.4.2";
+  }
+
+  revision "2021-06-16" {
+    description
+      "Remove trailing whitespace";
+    reference "0.4.1";
+  }
+
+  revision "2021-04-22" {
+    description
+      "Adding support for flexible port breakout.";
+    reference "0.4.0";
+  }
+
+  revision "2020-05-06" {
+    description
+      "Ensure that when statements in read-write contexts
+      reference only read-write leaves.";
+    reference "0.3.3";
+  }
+
+  revision "2018-11-21" {
+    description
+      "Add OpenConfig module metadata extensions.";
+    reference "0.3.2";
+  }
+
+  revision "2018-11-07" {
+    description
+      "Fixed error in when statement path";
+    reference "0.3.1";
+  }
+
+  revision "2018-01-20" {
+    description
+      "Added augmentation for interface-to-port reference";
+    reference "0.3.0";
+  }
+
+  revision "2017-11-17" {
+    description
+      "Corrected augmentation path for port data";
+    reference "0.2.0";
+  }
+
+  revision "2016-10-24" {
+    description
+      "Initial revision";
+    reference "0.1.0";
+  }
+
+  // OpenConfig specific extensions for module metadata.
+  oc-ext:regexp-posix;
+  oc-ext:catalog-organization "openconfig";
+  oc-ext:origin "openconfig";
+
+  // extension statements
+
+  // feature statements
+
+  // identity statements
+
+  // typedef statements
+
+  // grouping statements
+
+  grouping group-config {
+    description
+      "Configuration data for the breakout group.";
+
+    leaf index {
+      type uint8;
+      description
+        "Each index specifies breakouts that are identical in
+        terms of speed and the number of physical channels.";
+    }
+
+    leaf num-breakouts {
+      type uint8;
+      description
+        "Sets the number of interfaces using this breakout group.";
+    }
+
+    leaf breakout-speed {
+      type identityref {
+        base oc-eth:ETHERNET_SPEED;
+      }
+      description
+        "Speed of interfaces in this breakout group, supported
+        values are defined by the ETHERNET_SPEED identity.";
+    }
+
+    leaf num-physical-channels {
+      type uint8;
+      description
+        "Sets the number of lanes or physical channels assigned
+        to the interfaces in this breakout group. This leaf need
+        not be set if there is only one breakout group where all
+        the interfaces are of equal speed and have equal number
+        of physical channels.
+
+        The physical channels referred to by this leaf are
+        electrical channels towards the transceiver.";
+    }
+  }
+
+  grouping group-state {
+    description
+      "Operational state data for the port breakout group.";
+  }
+
+  grouping port-breakout-top {
+    description
+      "Top-level grouping for port breakout data.";
+
+    container breakout-mode {
+      description
+        "Top-level container for port breakout-mode data.";
+
+      container groups {
+        description
+          "Top level container for breakout groups data.
+
+           When a device has the capability to break a port into
+           interfaces of different speeds and different number of
+           physical channels, it can breakout a 400G OSFP port with
+           8 physical channels (with support for 25G NRZ, 50G PAM4
+           and 100G PAM4) into  mixed speed interfaces. Particularly, to
+           break out into two 100G ports with different modulation, and a 200G
+           port, a user must configure 1 interface with 2 physical channels
+          1 interface with 4 physical channels and 1 interface with
+           2 physical channels. With this configuration the interface in
+           1st breakout group would use 50G PAM4 modulation, interface
+           in 2nd breakout group would use 25G NRZ modulation and the
+           interface in 3rd breakout group would use 100G PAM4 modulation
+           This configuration would result in 3 entries in the breakout
+           groups list. The example configuration for this case is shown below:
+
+              {
+                \"groups\": {
+                  \"group\": [
+                    {
+                      \"config\": {
+                        \"breakout-speed\": \"SPEED_100GB\",
+                        \"index\": 0,
+                        \"num-breakouts\": 1,
+                        \"num-physical-channels\": 2
+                      },
+                      \"index\": 0
+                    },
+                    {
+                      \"config\": {
+                        \"breakout-speed\": \"SPEED_100GB\",
+                        \"index\": 1,
+                        \"num-breakouts\": 1,
+                        \"num-physical-channels\": 4
+                      },
+                      \"index\": 1
+                    },
+                    {
+                      \"config\": {
+                        \"breakout-speed\": \"SPEED_200GB\",
+                        \"index\": 2,
+                        \"num-breakouts\": 1,
+                        \"num-physical-channels\": 2
+                      },
+                      \"index\": 2
+                    }
+                  ]
+                }
+              }
+
+           When a device does not have the capability to break a port
+           into interfaces of different speeds and different number of
+           physical channels, in order to  breakout a 400G OSFP port with
+           8 physical channels into 50G breakout ports it would use 8 interfaces
+           with 1 physical channel each. This would result in 1 entry in the
+           breakout groups list. The example configuration for this case is
+           shown below:
+
+            {
+              \"groups\": {
+                \"group\": [
+                  {
+                    \"config\": {
+                      \"breakout-speed\": \"SPEED_50GB\",
+                      \"index\": 0,
+                      \"num-breakouts\": 8,
+                      \"num-physical-channels\": 1
+                    },
+                    \"index\": 0
+                  }
+                ]
+              }
+            }
+
+           Similarly, if a 400G-DR4 interface (8 electrical channels at 50Gbps)
+           is to be broken out into 4 100Gbps ports, the following configuration
+           is used:
+
+            {
+              \"groups\": {
+                \"group\": [
+                  {
+                    \"config\": {
+                      \"breakout-speed\": \"SPEED_100GB\",
+                      \"index\": 0,
+                      \"num-breakouts\": 4,
+                      \"num-physical-channels\": 2
+                    },
+                    \"index\": 0
+                  }
+                ]
+              }
+            }";
+
+        list group {
+          key "index";
+          description
+            "List of breakout groups.";
+
+          leaf index {
+            type leafref {
+              path "../config/index";
+            }
+            description
+              "Index of the breakout group entry in the breakout groups list.";
+          }
+
+          container config {
+            description
+              "Configuration data for breakout group.";
+            uses group-config;
+          }
+
+          container state {
+            config false;
+            description
+              "Operational state data for breakout group.";
+
+            uses group-config;
+            uses group-state;
+          }
+        }
+      }
+    }
+  }
+
+  // data definition statements
+
+  // augment statements
+
+  augment "/oc-platform:components/oc-platform:component/" +
+    "oc-platform:port" {
+    description
+      "Adding port breakout data to physical platform data. This subtree
+      is only valid when the type of the component is PORT.";
+
+    uses port-breakout-top;
+  }
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-if:state" {
+    description
+      "Adds a reference from the base interface to the corresponding
+      port component in the device inventory.";
+
+    leaf hardware-port {
+      type leafref {
+        path "/oc-platform:components/oc-platform:component/" +
+          "oc-platform:name";
+      }
+      description
+        "For non-channelized interfaces, references the hardware port
+        corresponding to the base interface.";
+    }
+  }
+
+  // rpc statements
+
+  // notification statements
+
+}
diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/platform/openconfig-platform-types.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/platform/openconfig-platform-types.yang
new file mode 100644
index 000000000..d28881f9e
--- /dev/null
+++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/platform/openconfig-platform-types.yang
@@ -0,0 +1,541 @@
+module openconfig-platform-types {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/platform-types";
+
+  prefix "oc-platform-types";
+
+  import openconfig-types { prefix oc-types; }
+  import openconfig-extensions { prefix oc-ext; }
+
+  // meta
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module defines data types (e.g., YANG identities)
+    to support the OpenConfig component inventory model.";
+
+  oc-ext:openconfig-version "1.6.0";
+
+  revision "2023-06-27" {
+    description
+      "Add WIFI_ACCESS_POINT";
+    reference "1.6.0";
+  }
+
+  revision "2022-07-28" {
+    description
+      "Add grouping for component power management";
+    reference "1.5.0";
+  }
+
+  revision "2022-03-27" {
+    description
+      "Add identity for BIOS";
+    reference "1.4.0";
+  }
+
+  revision "2022-02-02" {
+    description
+      "Add support for component reboot and switchover.";
+    reference "1.3.0";
+  }
+
+  revision "2021-07-29" {
+    description
+      "Add several avg-min-max-instant-stats groupings";
+    reference "1.2.0";
+  }
+
+  revision "2021-01-18" {
+    description
+      "Add identity for software modules";
+    reference "1.1.0";
+  }
+
+  revision "2019-06-03" {
+    description
+      "Add OpenConfig component operating system patch type.";
+    reference "1.0.0";
+  }
+
+  revision "2018-11-21" {
+    description
+      "Add OpenConfig module metadata extensions.";
+    reference "0.10.1";
+  }
+
+  revision "2018-11-16" {
+    description
+      "Added FEC_MODE_TYPE and FEC_STATUS_TYPE";
+    reference "0.10.0";
+  }
+
+  revision "2018-05-05" {
+    description
+      "Added min-max-time to
+      avg-min-max-instant-stats-precision1-celsius,
+      added new CONTROLLER_CARD identity";
+    reference "0.9.0";
+  }
+
+  revision "2018-01-16" {
+    description
+      "Added new per-component common data; add temp alarm";
+    reference "0.8.0";
+  }
+
+  revision "2017-12-14" {
+    description
+      "Added anchor containers for component data, added new
+      component types";
+    reference "0.7.0";
+  }
+
+  revision "2017-08-16" {
+    description
+      "Added power state enumerated type";
+    reference "0.6.0";
+  }
+
+  revision "2016-12-22" {
+    description
+      "Added temperature state variable to component";
+    reference "0.5.0";
+  }
+
+  // OpenConfig specific extensions for module metadata.
+  oc-ext:regexp-posix;
+  oc-ext:catalog-organization "openconfig";
+  oc-ext:origin "openconfig";
+
+  // grouping statements
+  grouping avg-min-max-instant-stats-precision1-celsius {
+    description
+      "Common grouping for recording temperature values in
+      Celsius with 1 decimal precision. Values include the
+      instantaneous, average, minimum, and maximum statistics";
+
+    leaf instant {
+      type decimal64 {
+        fraction-digits 1;
+      }
+      units celsius;
+      description
+        "The instantaneous value of the statistic.";
+    }
+
+    leaf avg {
+      type decimal64 {
+        fraction-digits 1;
+      }
+      units celsius;
+      description
+        "The arithmetic mean value of the statistic over the
+        sampling period.";
+    }
+
+    leaf min {
+      type decimal64 {
+        fraction-digits 1;
+      }
+      units celsius;
+      description
+        "The minimum value of the statistic over the sampling
+        period";
+    }
+
+    leaf max {
+      type decimal64 {
+        fraction-digits 1;
+      }
+      units celsius;
+      description
+        "The maximum value of the statistic over the sampling
+        period";
+    }
+
+    uses oc-types:stat-interval-state;
+    uses oc-types:min-max-time;
+  }
+
+  grouping avg-min-max-instant-stats-precision2-volts {
+    description
+      "Common grouping for recording voltage values in
+      volts with 2 decimal precision. Values include the
+      instantaneous, average, minimum, and maximum statistics.
+      If supported by the device, the time interval over which
+      the statistics are computed, and the times at which the
+      minimum and maximum values occurred, are also reported.";
+
+    leaf instant {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units volts;
+      description
+        "The instantaneous value of the statistic.";
+    }
+
+    leaf avg {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units volts;
+      description
+        "The arithmetic mean value of the statistic over the
+        sampling period.";
+    }
+
+    leaf min {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units volts;
+      description
+        "The minimum value of the statistic over the sampling
+        period";
+    }
+
+    leaf max {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units volts;
+      description
+        "The maximum value of the statistic over the sampling
+        period";
+    }
+
+    uses oc-types:stat-interval-state;
+    uses oc-types:min-max-time;
+  }
+
+  grouping component-redundant-role-switchover-reason {
+    description
+      "Common grouping for recording the reason of a component's
+      redundant role switchover. For example two supervisors in
+      a device, one as primary the other as secondary, switchover
+      can happen in different scenarios, e.g. user requested,
+      system error, priority contention, etc.";
+
+    leaf trigger {
+      type component-redundant-role-switchover-reason-trigger;
+      description
+        "Records the generic triggers, e.g. user or system
+        initiated the switchover.";
+    }
+
+    leaf details {
+      type string;
+      description
+        "Records detailed description of why the switchover happens.
+        For example, when system initiated the switchover, this leaf
+        can be used to record the specific reason, e.g. due to critical
+        errors of the routing daemon in the primary role.";
+    }
+  }
+
+  // identity statements
+  identity OPENCONFIG_HARDWARE_COMPONENT {
+    description
+      "Base identity for hardware related components in a managed
+      device.  Derived identities are partially based on contents
+      of the IANA Entity MIB.";
+    reference
+      "IANA Entity MIB and RFC 6933";
+  }
+
+  identity OPENCONFIG_SOFTWARE_COMPONENT {
+    description
+      "Base identity for software-related components in a managed
+      device";
+  }
+
+  // hardware types
+  identity CHASSIS {
+    base OPENCONFIG_HARDWARE_COMPONENT;
+    description
+      "Chassis component, typically with multiple slots / shelves";
+  }
+
+  identity BACKPLANE {
+    base OPENCONFIG_HARDWARE_COMPONENT;
+    description
+      "Backplane component for aggregating traffic, typically
+      contained in a chassis component";
+  }
+
+  identity FABRIC {
+    base OPENCONFIG_HARDWARE_COMPONENT;
+    description
+      "Interconnect between ingress and egress ports on the
+      device (e.g., a crossbar switch).";
+  }
+
+  identity POWER_SUPPLY {
+    base OPENCONFIG_HARDWARE_COMPONENT;
+    description
+      "Component that is supplying power to the device";
+  }
+
+  identity FAN {
+    base OPENCONFIG_HARDWARE_COMPONENT;
+    description
+      "Cooling fan, or could be some other heat-reduction component";
+  }
+
+  identity SENSOR {
+    base OPENCONFIG_HARDWARE_COMPONENT;
+    description
+      "Physical sensor, e.g., a temperature sensor in a chassis";
+  }
+
+  identity FRU {
+    base OPENCONFIG_HARDWARE_COMPONENT;
+    description
+      "Replaceable hardware component that does not have a more
+      specific defined schema.";
+  }
+
+  identity LINECARD {
+    base OPENCONFIG_HARDWARE_COMPONENT;
+    description
+      "Linecard component, typically inserted into a chassis slot";
+  }
+
+  identity CONTROLLER_CARD {
+    base OPENCONFIG_HARDWARE_COMPONENT;
+    description
+      "A type of linecard whose primary role is management or control
+      rather than data forwarding.";
+  }
+
+  identity PORT {
+    base OPENCONFIG_HARDWARE_COMPONENT;
+    description
+      "Physical port, e.g., for attaching pluggables and networking
+      cables";
+  }
+
+  identity TRANSCEIVER {
+    base OPENCONFIG_HARDWARE_COMPONENT;
+    description
+      "Pluggable module present in a port";
+  }
+
+  identity CPU {
+    base OPENCONFIG_HARDWARE_COMPONENT;
+    description
+      "Processing unit, e.g., a management processor";
+  }
+
+  identity STORAGE {
+    base OPENCONFIG_HARDWARE_COMPONENT;
+    description
+      "A storage subsystem on the device (disk, SSD, etc.)";
+  }
+
+  identity INTEGRATED_CIRCUIT {
+    base OPENCONFIG_HARDWARE_COMPONENT;
+    description
+      "A special purpose processing unit, typically for traffic
+      switching/forwarding (e.g., switching ASIC, NPU, forwarding
+      chip, etc.)";
+  }
+
+  identity WIFI_ACCESS_POINT {
+    base OPENCONFIG_HARDWARE_COMPONENT;
+    description
+      "A device that attaches to a an Ethernet network and creates a wireless
+       local area network";
+  }
+
+  identity OPERATING_SYSTEM {
+    base OPENCONFIG_SOFTWARE_COMPONENT;
+    description
+      "Operating system running on a component";
+  }
+
+  identity OPERATING_SYSTEM_UPDATE {
+    base OPENCONFIG_SOFTWARE_COMPONENT;
+    description
+      "An operating system update - which should be a subcomponent
+      of the `OPERATING_SYSTEM` running on a component. An update is
+      defined to be a set of software changes that are atomically
+      installed (and uninstalled) together. Multiple updates may be
+      present for the Operating System. A system should not list all
+      installed software packages using this type -- but rather
+      updates that are bundled together as a single installable
+      item";
+  }
+
+  identity BIOS {
+    base OPENCONFIG_SOFTWARE_COMPONENT;
+    description
+      "Legacy BIOS or UEFI firmware interface responsible for
+      initializing hardware components and first stage boot loader.";
+  }
+
+  identity BOOT_LOADER {
+    base OPENCONFIG_SOFTWARE_COMPONENT;
+    description
+      "Software layer responsible for loading and booting the
+      device OS or network OS.";
+  }
+
+  identity SOFTWARE_MODULE {
+    base OPENCONFIG_SOFTWARE_COMPONENT;
+    description
+      "A base identity for software modules installed and/or
+      running on the device.  Modules include user-space programs
+      and kernel modules that provide specific functionality.
+      A component with type SOFTWARE_MODULE should also have a
+      module type that indicates the specific type of software module";
+  }
+
+  identity COMPONENT_OPER_STATUS {
+    description
+      "Current operational status of a platform component";
+  }
+
+  identity ACTIVE {
+    base COMPONENT_OPER_STATUS;
+    description
+      "Component is enabled and active (i.e., up)";
+  }
+
+  identity INACTIVE {
+    base COMPONENT_OPER_STATUS;
+    description
+      "Component is enabled but inactive (i.e., down)";
+  }
+
+  identity DISABLED {
+    base COMPONENT_OPER_STATUS;
+    description
+      "Component is administratively disabled.";
+  }
+
+  identity FEC_MODE_TYPE {
+    description
+      "Base identity for FEC operational modes.";
+  }
+
+  identity FEC_ENABLED {
+    base FEC_MODE_TYPE;
+    description
+      "FEC is administratively enabled.";
+  }
+
+  identity FEC_DISABLED {
+    base FEC_MODE_TYPE;
+    description
+      "FEC is administratively disabled.";
+  }
+
+  identity FEC_AUTO {
+    base FEC_MODE_TYPE;
+    description
+      "System will determine whether to enable or disable
+      FEC on a transceiver.";
+  }
+
+  identity FEC_STATUS_TYPE {
+    description
+      "Base identity for FEC operational statuses.";
+  }
+
+  identity FEC_STATUS_LOCKED {
+    base FEC_STATUS_TYPE;
+    description
+      "FEC is operationally locked.";
+  }
+
+  identity FEC_STATUS_UNLOCKED {
+    base FEC_STATUS_TYPE;
+    description
+      "FEC is operationally unlocked.";
+  }
+
+  // typedef statements
+  typedef component-power-type {
+    type enumeration {
+      enum POWER_ENABLED {
+        description
+          "Enable power on the component";
+      }
+      enum POWER_DISABLED {
+        description
+          "Disable power on the component";
+      }
+    }
+    description
+      "A generic type reflecting whether a hardware component
+      is powered on or off";
+  }
+
+  identity COMPONENT_REBOOT_REASON {
+    description
+      "Base entity for component reboot reasons.";
+  }
+
+  identity REBOOT_USER_INITIATED {
+    base COMPONENT_REBOOT_REASON;
+    description
+      "User initiated the reboot of the componenent.";
+  }
+
+  identity REBOOT_POWER_FAILURE {
+    base COMPONENT_REBOOT_REASON;
+    description
+      "The component reboots due to power failure.";
+  }
+
+  identity REBOOT_CRITICAL_ERROR {
+    base COMPONENT_REBOOT_REASON;
+    description
+      "The component reboots due to critical errors.";
+  }
+
+  typedef component-redundant-role {
+    type enumeration {
+      enum PRIMARY {
+        description
+          "Component is acting the primary role.";
+      }
+      enum SECONDARY {
+        description
+          "Component is acting the secondary role.";
+      }
+    }
+    description
+      "A generic type reflecting the component's redundanty role.
+      For example, a device might have dual supervisors components
+      for redundant purpose, with one being the primary and the
+      other secondary.";
+  }
+
+  typedef component-redundant-role-switchover-reason-trigger {
+    type enumeration {
+      enum USER_INITIATED {
+        description
+          "User initiated the switchover, e.g. via command line.";
+      }
+      enum SYSTEM_INITIATED {
+        description
+          "The system initiated the switchover, e.g. due to
+          critical errors in the component of the primar role.";
+      }
+    }
+    description
+      "Records how the role switchover is triggered.";
+  }
+}
diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/platform/openconfig-platform.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/platform/openconfig-platform.yang
new file mode 100644
index 000000000..bbcf931a6
--- /dev/null
+++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/platform/openconfig-platform.yang
@@ -0,0 +1,1221 @@
+module openconfig-platform {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/platform";
+
+  prefix "oc-platform";
+
+  import openconfig-platform-types { prefix oc-platform-types; }
+  import openconfig-extensions { prefix oc-ext; }
+  import openconfig-alarm-types { prefix oc-alarm-types; }
+  import openconfig-yang-types { prefix oc-yang; }
+  import openconfig-types { prefix oc-types; }
+
+  include openconfig-platform-common;
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module defines a data model for representing a system
+    component inventory, which can include hardware or software
+    elements arranged in an arbitrary structure. The primary
+    relationship supported by the model is containment, e.g.,
+    components containing subcomponents.
+
+    It is expected that this model reflects every field replacable
+    unit on the device at a minimum (i.e., additional information
+    may be supplied about non-replacable components).
+
+    Every element in the inventory is termed a 'component' with each
+    component expected to have a unique name and type, and optionally
+    a unique system-assigned identifier and FRU number.  The
+    uniqueness is guaranteed by the system within the device.
+
+    Components may have properties defined by the system that are
+    modeled as a list of key-value pairs. These may or may not be
+    user-configurable.  The model provides a flag for the system
+    to optionally indicate which properties are user configurable.
+
+    Each component also has a list of 'subcomponents' which are
+    references to other components. Appearance in a list of
+    subcomponents indicates a containment relationship as described
+    above.  For example, a linecard component may have a list of
+    references to port components that reside on the linecard.
+
+    This schema is generic to allow devices to express their own
+    platform-specific structure.  It may be augmented by additional
+    component type-specific schemas that provide a common structure
+    for well-known component types.  In these cases, the system is
+    expected to populate the common component schema, and may
+    optionally also represent the component and its properties in the
+    generic structure.
+
+    The properties for each component may include dynamic values,
+    e.g., in the 'state' part of the schema.  For example, a CPU
+    component may report its utilization, temperature, or other
+    physical properties.  The intent is to capture all platform-
+    specific physical data in one location, including inventory
+    (presence or absence of a component) and state (physical
+    attributes or status).";
+
+  oc-ext:openconfig-version "0.24.0";
+
+  revision "2023-11-28" {
+    description
+      "Add model-name";
+    reference "0.24.0";
+  }
+
+  revision "2023-02-13" {
+    description
+      "Refactor resource utilization threshold config into a separate grouping.
+      Update 'utilization resource' to 'resource utilization'.";
+    reference "0.23.0";
+  }
+
+  revision "2022-12-20" {
+     description
+        "Add threshold and threshold-exceeded for resource usage.";
+      reference "0.22.0";
+   }
+
+  revision "2022-12-19" {
+    description
+      "Update last-high-watermark timestamp documentation.";
+    reference "0.21.1";
+  }
+
+  revision "2022-09-26" {
+    description
+      "Add state data for base-mac-address.";
+    reference "0.21.0";
+  }
+
+  revision "2022-08-31" {
+    description
+      "Add new state data for component CLEI code.";
+    reference "0.20.0";
+  }
+
+  revision "2022-07-28" {
+    description
+      "Add container for controller card component";
+    reference "0.19.0";
+  }
+
+  revision "2022-07-11" {
+    description
+      "Add switchover ready";
+    reference "0.18.0";
+  }
+
+  revision "2022-06-10" {
+    description
+      "Specify units and epoch for switchover and reboot times.";
+    reference "0.17.0";
+  }
+
+  revision "2022-04-21" {
+    description
+      "Add platform utilization.";
+    reference "0.16.0";
+  }
+
+  revision "2022-02-02" {
+    description
+      "Add new state data for component reboot and
+      switchover.";
+    reference "0.15.0";
+  }
+
+  revision "2021-08-13" {
+    description
+      "Add container for PCIe error statistics";
+    reference "0.14.0";
+  }
+
+  revision "2021-01-18" {
+    description
+      "Add container for software module component";
+    reference "0.13.0";
+  }
+
+  revision "2019-04-16" {
+    description
+      "Fix bug in parent path reference";
+    reference "0.12.2";
+  }
+
+  revision "2018-11-21" {
+    description
+      "Add OpenConfig module metadata extensions.";
+    reference "0.12.1";
+  }
+
+  revision "2018-06-29" {
+    description
+      "Added location description for components";
+    reference "0.12.0";
+  }
+
+  revision "2018-06-03" {
+    description
+      "Added parent reference, empty flag and preconfiguration
+      for components";
+    reference "0.11.0";
+  }
+
+  revision "2018-04-20" {
+    description
+      "Added new per-component state data: mfg-date and removable";
+    reference "0.10.0";
+  }
+
+  revision "2018-01-30" {
+    description
+      "Amended approach for modelling CPU - rather than having
+      a local CPU utilisation state variable, a component with
+      a CPU should create a subcomponent of type CPU to report
+      statistics.";
+    reference "0.9.0";
+  }
+
+  revision "2018-01-16" {
+    description
+      "Added new per-component common data; add temp alarm;
+      moved hardware-port reference to port model";
+    reference "0.8.0";
+  }
+
+  revision "2017-12-14" {
+    description
+      "Added anchor containers for component data, added new
+      component types";
+    reference "0.7.0";
+  }
+
+  revision "2017-08-16" {
+    description
+      "Added power state enumerated type";
+    reference "0.6.0";
+  }
+
+  revision "2016-12-22" {
+    description
+      "Added temperature state variable to component";
+    reference "0.5.0";
+  }
+
+  // OpenConfig specific extensions for module metadata.
+  oc-ext:regexp-posix;
+  oc-ext:catalog-organization "openconfig";
+  oc-ext:origin "openconfig";
+
+  // grouping statements
+
+
+  grouping platform-component-properties-config {
+    description
+      "System-defined configuration data for component properties";
+
+    leaf name {
+      type string;
+      description
+        "System-supplied name of the property -- this is typically
+        non-configurable";
+    }
+
+    leaf value {
+      type union {
+        type string;
+        type boolean;
+        type int64;
+        type uint64;
+        type decimal64 {
+          fraction-digits 2;
+        }
+      }
+      description
+        "Property values can take on a variety of types.  Signed and
+        unsigned integer types may be provided in smaller sizes,
+        e.g., int8, uint16, etc.";
+    }
+  }
+
+  grouping platform-component-properties-state {
+    description
+      "Operational state data for component properties";
+
+    leaf configurable {
+      type boolean;
+      description
+        "Indication whether the property is user-configurable";
+    }
+  }
+
+  grouping platform-component-properties-top {
+    description
+      "Top-level grouping ";
+
+    container properties {
+      description
+        "Enclosing container ";
+
+      list property {
+        key "name";
+        description
+          "List of system properties for the component";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description
+            "Reference to the property name.";
+        }
+
+        container config {
+          description
+            "Configuration data for each property";
+
+          uses platform-component-properties-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for each property";
+
+          uses platform-component-properties-config;
+          uses platform-component-properties-state;
+        }
+      }
+    }
+  }
+
+  grouping platform-subcomponent-ref-config {
+    description
+      "Configuration data for subcomponent references";
+
+    leaf name {
+      type leafref {
+        path "../../../../../component/config/name";
+      }
+      description
+        "Reference to the name of the subcomponent";
+    }
+  }
+
+  grouping platform-subcomponent-ref-state {
+    description
+      "Operational state data for subcomponent references";
+
+  }
+
+  grouping platform-subcomponent-ref-top {
+    description
+      "Top-level grouping for list of subcomponent references";
+
+    container subcomponents {
+      description
+        "Enclosing container for subcomponent references";
+
+      list subcomponent {
+        key "name";
+        description
+          "List of subcomponent references";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description
+            "Reference to the name list key";
+        }
+
+        container config {
+          description
+            "Configuration data for the subcomponent";
+
+          uses platform-subcomponent-ref-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for the subcomponent";
+
+          uses platform-subcomponent-ref-config;
+          uses platform-subcomponent-ref-state;
+        }
+      }
+    }
+  }
+
+  grouping platform-component-config {
+    description
+      "Configuration data for components";
+
+    leaf name {
+      type string;
+      description
+        "Device name for the component -- this may not be a
+        configurable parameter on many implementations.  Where
+        component preconfiguration is supported, for example,
+        the component name may be configurable.";
+    }
+  }
+
+  grouping platform-component-state {
+    description
+      "Operational state data for device components.";
+
+    leaf type {
+      type union {
+        type identityref {
+          base oc-platform-types:OPENCONFIG_HARDWARE_COMPONENT;
+        }
+        type identityref {
+          base oc-platform-types:OPENCONFIG_SOFTWARE_COMPONENT;
+        }
+      }
+      description
+        "Type of component as identified by the system";
+    }
+
+    leaf id {
+      type string;
+      description
+        "Unique identifier assigned by the system for the
+        component";
+    }
+
+    leaf location {
+      type string;
+      description
+        "System-supplied description of the location of the
+        component within the system. This could be a bay position,
+        slot number, socket location, etc. For component types that
+        have an explicit slot-id attribute, such as linecards, the
+        system should populate the more specific slot-id.";
+    }
+
+    leaf description {
+      type string;
+      description
+        "System-supplied description of the component";
+    }
+
+    leaf mfg-name {
+      type string;
+      description
+        "System-supplied identifier for the manufacturer of the
+        component.  This data is particularly useful when a
+        component manufacturer is different than the overall
+        device vendor.";
+    }
+
+    leaf mfg-date {
+      type oc-yang:date;
+      description
+        "System-supplied representation of the component's
+        manufacturing date.";
+    }
+
+    leaf hardware-version {
+      type string;
+      description
+        "For hardware components, this is the hardware revision of
+        the component.";
+    }
+
+    leaf firmware-version {
+      type string;
+      description
+        "For hardware components, this is the version of associated
+        firmware that is running on the component, if applicable.";
+    }
+
+    leaf software-version {
+      type string;
+      description
+        "For software components such as operating system or other
+        software module, this is the version of the currently
+        running software.";
+    }
+
+    leaf serial-no {
+      type string;
+      description
+        "System-assigned serial number of the component.";
+    }
+
+    leaf part-no {
+      type string;
+      description
+        "System-assigned part number for the component.  This should
+        be present in particular if the component is also an FRU
+        (field replaceable unit)";
+    }
+
+    leaf model-name {
+      type string;
+      description
+        "A human readable string describing the model of a component.
+        This string is optional and should only be populated if part-no
+        is also populated.";
+    }
+
+    leaf clei-code {
+      type string;
+      description
+        "Common Language Equipment Identifier (CLEI) code of the
+        component.  This should be present in particular if the
+        component is also an FRU (field replaceable unit)";
+    }
+
+    leaf removable {
+      type boolean;
+      description
+        "If true, this component is removable or is a field
+        replaceable unit";
+    }
+
+    leaf oper-status {
+      type identityref {
+        base oc-platform-types:COMPONENT_OPER_STATUS;
+      }
+      description
+        "If applicable, this reports the current operational status
+        of the component.";
+    }
+
+    leaf empty {
+      type boolean;
+      default false;
+      description
+        "The empty leaf may be used by the device to indicate that a
+        component position exists but is not populated.  Using this
+        flag, it is possible for the management system to learn how
+        many positions are available (e.g., occupied vs. empty
+        linecard slots in a chassis).";
+    }
+
+    leaf parent {
+      type leafref {
+        path "../../../component/config/name";
+      }
+      description
+        "Reference to the name of the parent component.  Note that
+        this reference must be kept synchronized with the
+        corresponding subcomponent reference from the parent
+        component.";
+    }
+
+    leaf redundant-role {
+      type oc-platform-types:component-redundant-role;
+      description
+        "For components that have redundant roles (e.g. two
+        supervisors in a device, one as primary the other as secondary),
+        this reports the role of the component.";
+    }
+
+    container last-switchover-reason {
+      description
+        "For components that have redundant roles (e.g. two
+        supervisors in a device, one as primary the other as secondary),
+        this reports the reason of the last change of the
+        component's role.";
+
+      uses oc-platform-types:component-redundant-role-switchover-reason;
+    }
+
+    leaf last-switchover-time {
+      type oc-types:timeticks64;
+      units "nanoseconds";
+      description
+        "For components that have redundant roles (e.g. two
+        supervisors in a device, one as primary the other as
+        secondary), this reports the time of the last change of
+        the component's role. The value is the timestamp in
+        nanoseconds relative to the Unix Epoch (Jan 1, 1970 00:00:00 UTC).";
+
+    }
+
+    leaf last-reboot-reason {
+      type identityref {
+        base oc-platform-types:COMPONENT_REBOOT_REASON;
+      }
+      description
+        "This reports the reason of the last reboot of the component.";
+    }
+
+    leaf last-reboot-time {
+      type oc-types:timeticks64;
+      units "nanoseconds";
+      description
+        "This reports the time of the last reboot of the component. The
+        value is the timestamp in nanoseconds relative to the Unix Epoch
+        (Jan 1, 1970 00:00:00 UTC).";
+    }
+
+    leaf switchover-ready {
+      type boolean;
+      description
+        "For components that have redundant roles, this reports a value
+        that indicates if the component is ready to support failover.
+
+        The components with a redundant-role should reflect the overall
+        system's switchover status.  For example, two supervisors in a
+        device, one as primary and the other as secondary, should both
+        report the same value.";
+    }
+
+    leaf base-mac-address {
+      type oc-yang:mac-address;
+      description
+        "This is a MAC address representing the root or primary MAC
+        address for a component.  Components such as CHASSIS and
+        CONTROLLER_CARD are expected to provide a base-mac-address.  The
+        base mac-address for CHASSIS and a PRIMARY CONTROLLER_CARD may
+        contain the same value.";
+    }
+
+  }
+
+  grouping platform-component-temp-alarm-state {
+    description
+      "Temperature alarm data for platform components";
+
+    // TODO(aashaikh): consider if these leaves could be in a
+    // reusable grouping (not temperature-specific); threshold
+    // may always need to be units specific.
+
+    leaf alarm-status {
+      type boolean;
+      description
+        "A value of true indicates the alarm has been raised or
+        asserted.  The value should be false when the alarm is
+        cleared.";
+    }
+
+    leaf alarm-threshold {
+      type uint32;
+      description
+        "The threshold value that was crossed for this alarm.";
+    }
+
+    leaf alarm-severity {
+      type identityref {
+        base oc-alarm-types:OPENCONFIG_ALARM_SEVERITY;
+      }
+      description
+        "The severity of the current alarm.";
+    }
+  }
+
+  grouping platform-component-power-state {
+    description
+      "Power-related operational state for device components.";
+
+    leaf allocated-power {
+      type uint32;
+      units watts;
+      description
+        "Power allocated by the system for the component.";
+    }
+
+    leaf used-power {
+      type uint32;
+      units watts;
+      description
+        "Actual power used by the component.";
+    }
+  }
+
+  grouping platform-component-temp-state {
+    description
+      "Temperature state data for device components";
+
+    container temperature {
+      description
+        "Temperature in degrees Celsius of the component. Values include
+        the instantaneous, average, minimum, and maximum statistics. If
+        avg/min/max statistics are not supported, the target is expected
+        to just supply the instant value";
+
+      uses oc-platform-types:avg-min-max-instant-stats-precision1-celsius;
+      uses platform-component-temp-alarm-state;
+    }
+  }
+
+  grouping platform-component-memory-state {
+    description
+      "Per-component memory statistics";
+
+    container memory {
+      description
+        "For components that have associated memory, these values
+        report information about available and utilized memory.";
+
+      leaf available {
+        type uint64;
+        units bytes;
+        description
+          "The available memory physically installed, or logically
+          allocated to the component.";
+      }
+
+      // TODO(aashaikh): consider if this needs to be a
+      // min/max/avg statistic
+      leaf utilized {
+        type uint64;
+        units bytes;
+        description
+          "The memory currently in use by processes running on
+          the component, not considering reserved memory that is
+          not available for use.";
+      }
+    }
+  }
+
+  grouping pcie-uncorrectable-errors {
+    description
+      "PCIe uncorrectable error statistics.";
+
+    leaf total-errors {
+      type oc-yang:counter64;
+      description
+        "Total number of uncorrectable errors detected by PCIe device
+        since the system booted, according to PCIe AER driver.";
+    }
+
+    leaf undefined-errors {
+      type oc-yang:counter64;
+      description
+        "Number of undefined errors detected by PCIe device since the
+        system booted, according to PCIe AER driver.";
+    }
+
+    leaf data-link-errors {
+      type oc-yang:counter64;
+      description
+        "Number of data-link errors detected by PCIe device since the
+        system booted, according to PCIe AER driver.";
+    }
+
+    leaf surprise-down-errors {
+      type oc-yang:counter64;
+      description
+        "Number of unexpected link down errors detected by PCIe device
+        since the system booted, according to PCIe AER driver.";
+    }
+
+    leaf poisoned-tlp-errors {
+      type oc-yang:counter64;
+      description
+        "Number of poisoned TLP errors detected by PCIe device since the
+        system booted, according to PCIe AER driver.";
+    }
+
+    leaf flow-control-protocol-errors {
+      type oc-yang:counter64;
+      description
+        "Number of flow control protocol errors detected by PCIe device
+        since the system booted, according to PCIe AER driver.";
+    }
+
+    leaf completion-timeout-errors {
+      type oc-yang:counter64;
+      description
+        "Number of completion timeout errors detected by PCIe device
+        since the system booted, according to PCIe AER driver.";
+    }
+
+    leaf completion-abort-errors {
+      type oc-yang:counter64;
+      description
+        "Number of completion abort errors detected by PCIe device
+        since the system booted, according to PCIe AER driver.";
+    }
+
+    leaf unexpected-completion-errors {
+      type oc-yang:counter64;
+      description
+        "Number of unexpected completion errors detected by PCIe device
+        since the system booted, according to PCIe AER driver.";
+    }
+
+    leaf receiver-overflow-errors  {
+      type oc-yang:counter64;
+      description
+        "Number of receiver overflow errors detected by PCIe device
+        since the system booted, according to PCIe AER driver.";
+    }
+
+    leaf malformed-tlp-errors  {
+      type oc-yang:counter64;
+      description
+        "Number of malformed TLP errors detected by PCIe device since the
+        system booted, according to PCIe AER driver.";
+    }
+
+    leaf ecrc-errors  {
+      type oc-yang:counter64;
+      description
+        "Number of ECRC errors detected by PCIe device since the system
+        booted, according to PCIe AER driver.";
+    }
+
+    leaf unsupported-request-errors {
+      type oc-yang:counter64;
+      description
+        "Number of unsupported request errors detected by PCIe device
+        since the system booted, according to PCIe AER driver.";
+    }
+
+    leaf acs-violation-errors {
+      type oc-yang:counter64;
+      description
+        "Number of access control errors detected by PCIe device since
+        the system booted, according to PCIe AER driver.";
+    }
+
+    leaf internal-errors {
+      type oc-yang:counter64;
+      description
+        "Number of internal errors detected by PCIe device since the
+        system booted, according to PCIe AER driver.";
+    }
+
+    leaf blocked-tlp-errors {
+      type oc-yang:counter64;
+      description
+        "Number of blocked TLP errors detected by PCIe device since
+        the system booted, according to PCIe AER driver.";
+    }
+
+    leaf atomic-op-blocked-errors {
+      type oc-yang:counter64;
+      description
+        "Number of atomic operation blocked errors detected by PCIe
+        device since the system booted, according to PCIe AER driver.";
+    }
+
+    leaf tlp-prefix-blocked-errors {
+      type oc-yang:counter64;
+      description
+        "Number of TLP prefix blocked errors detected by PCIe device
+        since the system booted, according to PCIe AER driver.";
+    }
+  }
+
+  grouping pcie-correctable-errors {
+    description
+      "PCIe correctable error statistics.";
+
+    leaf total-errors {
+      type oc-yang:counter64;
+      description
+        "Total number of correctable errors detected by PCIe device
+        since the system booted, according to PCIe AER driver.";
+    }
+
+    leaf receiver-errors {
+      type oc-yang:counter64;
+      description
+        "Number of receiver errors detected by PCIe device since the
+        system booted, according to PCIe AER driver.";
+    }
+
+    leaf bad-tlp-errors {
+      type oc-yang:counter64;
+      description
+        "Number of TLPs with bad LCRC detected by PCIe device since the
+        system booted, according to PCIe AER driver.";
+    }
+
+    leaf bad-dllp-errors {
+      type oc-yang:counter64;
+      description
+        "Number of DLLPs with bad LCRC detected by PCIe device since the
+        system booted, according to PCIe AER driver.";
+    }
+
+    leaf relay-rollover-errors {
+      type oc-yang:counter64;
+      description
+        "Number of relay rollover errors detected by PCIe device since the
+        system booted, according to PCIe AER driver.";
+    }
+
+    leaf replay-timeout-errors {
+      type oc-yang:counter64;
+      description
+        "Number of replay timeout errors detected by PCIe device since the
+        system booted, according to PCIe AER driver.";
+    }
+
+    leaf advisory-non-fatal-errors {
+      type oc-yang:counter64;
+      description
+        "Number of advisory non fatal errors detected by PCIe device since
+        the system booted, according to PCIe AER driver.";
+    }
+
+    leaf internal-errors {
+      type oc-yang:counter64;
+      description
+        "Number of internal errors detected by PCIe device since the system
+        booted, according to PCIe AER driver.";
+    }
+
+    leaf hdr-log-overflow-errors {
+      type oc-yang:counter64;
+      description
+        "Number of header log overflow errors detected by PCIe device since
+        the system booted, according to PCIe AER driver.";
+    }
+  }
+
+  grouping platform-component-pcie-state {
+    description
+      "Per-component PCIe error statistics";
+
+    container pcie {
+      description
+        "Components that are connected to the system over the Peripheral
+        Component Interconnect Express (PCIe), report the fatal, non-fatal
+        and correctable PCIe error counts.";
+
+      container fatal-errors {
+        description
+          "The count of the fatal PCIe errors.";
+        uses pcie-uncorrectable-errors;
+      }
+
+      container non-fatal-errors {
+        description
+          "The count of the non-fatal PCIe errors.";
+        uses pcie-uncorrectable-errors;
+      }
+
+      container correctable-errors {
+        description
+          "The count of the correctable PCIe errors.";
+        uses pcie-correctable-errors;
+      }
+    }
+  }
+
+  grouping platform-anchors-top {
+    description
+      "This grouping is used to add containers for components that
+      are common across systems, but do not have a defined schema
+      within the openconfig-platform module.  Containers should be
+      added to this grouping for components that are expected to
+      exist in multiple systems, with corresponding modules
+      augmenting the config/state containers directly.";
+
+    container chassis {
+      description
+        "Data for chassis components";
+
+      container config {
+        description
+          "Configuration data for chassis components";
+      }
+
+      container state {
+        config false;
+        description
+          "Operational state data for chassis components";
+      }
+
+      uses platform-resource-utilization-top;
+    }
+
+// TODO(aashaikh): linecard container is already defined in
+// openconfig-platform-linecard; will move to this module
+// in future.
+  /*
+    container linecard {
+      description
+        "Data for linecard components";
+
+      container config {
+        description
+          "Configuration data for linecard components";
+      }
+
+      container state {
+        config false;
+        description
+          "Operational state data for linecard components";
+      }
+    }
+  */
+
+    container port {
+      description
+        "Data for physical port components";
+
+      container config {
+        description
+          "Configuration data for physical port components";
+      }
+
+      container state {
+        config false;
+        description
+          "Operational state data for physical port components";
+      }
+    }
+
+// TODO(aashaikh): transceiver container is already defined in
+// openconfig-platform-transceiver; will move to this module
+// in future.
+  /*
+    container transceiver {
+      description
+        "Data for transceiver components";
+
+      container config {
+        description
+          "Configuration data for transceiver components";
+      }
+
+      container state {
+        config false;
+        description
+          "Operational state data for transceiver components";
+      }
+    }
+  */
+
+    container power-supply {
+      description
+        "Data for power supply components";
+
+      container config {
+        description
+          "Configuration data for power supply components";
+      }
+
+      container state {
+        config false;
+        description
+          "Operational state data for power supply components";
+      }
+    }
+
+    container fan {
+      description
+        "Data for fan components";
+
+      container config {
+        description
+          "Configuration data for fan components";
+      }
+
+      container state {
+        config false;
+        description
+          "Operational state data for fan components";
+      }
+    }
+
+    container fabric {
+      description
+        "Data for fabric components";
+
+      container config {
+        description
+          "Configuration data for fabric components";
+      }
+
+      container state {
+        config false;
+        description
+          "Operational state data for fabric components";
+      }
+    }
+
+    container storage {
+      description
+        "Data for storage components";
+
+      container config {
+        description
+          "Configuration data for storage components";
+      }
+
+      container state {
+        config false;
+        description
+          "Operational state data for storage components";
+      }
+    }
+
+    container cpu {
+      description
+        "Data for cpu components";
+
+      container config {
+        description
+          "Configuration data for cpu components";
+      }
+
+      container state {
+        config false;
+        description
+          "Operational state data for cpu components";
+      }
+    }
+
+    container integrated-circuit {
+      description
+        "Data for chip components, such as ASIC, NPUs, etc.";
+
+      container config {
+        description
+          "Configuration data for chip components";
+      }
+
+      container state {
+        config false;
+        description
+          "Operational state data for chip components";
+      }
+
+      uses platform-resource-utilization-top;
+    }
+
+    container backplane {
+      description
+        "Data for backplane components";
+
+      container config {
+        description
+          "Configuration data for backplane components";
+      }
+
+      container state {
+        config false;
+        description
+          "Operational state data for backplane components";
+      }
+    }
+
+    container software-module {
+      description
+        "Data for software module components, i.e., for components
+        with type=SOFTWARE_MODULE";
+
+      container config {
+        description
+          "Configuration data for software module components";
+      }
+
+      container state {
+        config false;
+        description
+          "Operational state data for software module components";
+      }
+    }
+
+    container controller-card {
+      description
+        "Data for controller card components, i.e., for components
+        with type=CONTROLLER_CARD";
+
+      container config {
+        description
+          "Configuration data for controller card components. Note that disabling
+          power to the primary supervisor should be rejected, and the operator is
+          required to perform a switchover first.";
+      }
+
+      container state {
+        config false;
+        description
+          "Operational state data for controller card components";
+      }
+    }
+  }
+
+  grouping platform-component-top {
+    description
+      "Top-level grouping for components in the device inventory";
+
+    container components {
+      description
+        "Enclosing container for the components in the system.";
+
+      list component {
+        key "name";
+        description
+          "List of components, keyed by component name.";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description
+            "References the component name";
+        }
+
+        container config {
+          description
+            "Configuration data for each component";
+
+          uses platform-component-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for each component";
+
+          uses platform-component-config;
+          uses platform-component-state;
+          uses platform-component-temp-state;
+          uses platform-component-memory-state;
+          uses platform-component-power-state;
+          uses platform-component-pcie-state {
+            when "./type = 'oc-platform-types:STORAGE' or " +
+              "'oc-platform-types:INTEGRATED_CIRCUIT' or " +
+              "'oc-platform-types:FRU'";
+          }
+        }
+
+        uses platform-component-properties-top;
+        uses platform-subcomponent-ref-top;
+        uses platform-anchors-top;
+      }
+    }
+  }
+
+
+  // data definition statements
+
+  uses platform-component-top;
+
+
+  // augments
+
+
+}
diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/system/openconfig-alarm-types.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/system/openconfig-alarm-types.yang
new file mode 100644
index 000000000..c4617b5e6
--- /dev/null
+++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/system/openconfig-alarm-types.yang
@@ -0,0 +1,150 @@
+module openconfig-alarm-types {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/alarms/types";
+
+  prefix "oc-alarm-types";
+
+  // import some basic types
+  import openconfig-extensions { prefix oc-ext; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module defines operational state data related to alarms
+    that the device is reporting.
+
+    This model reuses some data items defined in the draft IETF
+    YANG Alarm Module:
+    https://tools.ietf.org/html/draft-vallin-netmod-alarm-module-02
+
+    Portions of this code were derived from the draft IETF YANG Alarm
+    Module. Please reproduce this note if possible.
+
+    IETF code is subject to the following copyright and license:
+    Copyright (c) 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).";
+
+  oc-ext:openconfig-version "0.2.1";
+
+  revision "2018-11-21" {
+    description
+      "Add OpenConfig module metadata extensions.";
+    reference "0.2.1";
+  }
+
+  revision "2018-01-16" {
+    description
+      "Moved alarm identities into separate types module";
+    reference "0.2.0";
+  }
+
+  // OpenConfig specific extensions for module metadata.
+  oc-ext:regexp-posix;
+  oc-ext:catalog-organization "openconfig";
+  oc-ext:origin "openconfig";
+
+  // identity statements
+  identity OPENCONFIG_ALARM_TYPE_ID {
+    description
+      "Base identity for alarm type ID profiles";
+  }
+
+  identity AIS {
+    base OPENCONFIG_ALARM_TYPE_ID;
+    description
+      "Defines an alarm indication signal type of alarm";
+  }
+
+  identity EQPT {
+    base OPENCONFIG_ALARM_TYPE_ID;
+    description
+      "Defines an equipment related type of alarm that is specific
+       to the physical hardware";
+  }
+
+  identity LOS {
+    base OPENCONFIG_ALARM_TYPE_ID;
+    description
+      "Defines a loss of signal type of alarm";
+  }
+
+  identity OTS {
+    base OPENCONFIG_ALARM_TYPE_ID;
+    description
+      "Defines a optical transport signal type of alarm";
+  }
+
+  identity OPENCONFIG_ALARM_SEVERITY {
+    description
+      "Base identity for alarm severity profiles. Derived
+      identities are based on contents of the draft
+      IETF YANG Alarm Module";
+    reference
+      "IETF YANG Alarm Module: Draft - typedef severity
+      https://tools.ietf.org/html/draft-vallin-netmod-alarm-module-02";
+
+  }
+
+  identity UNKNOWN {
+    base OPENCONFIG_ALARM_SEVERITY;
+    description
+      "Indicates that the severity level could not be determined.
+      This level SHOULD be avoided.";
+  }
+
+  identity MINOR {
+    base OPENCONFIG_ALARM_SEVERITY;
+    description
+      "Indicates the existence of a non-service affecting fault
+      condition and that corrective action should be taken in
+      order to prevent a more serious (for example, service
+      affecting) fault. Such a severity can be reported, for
+      example, when the detected alarm condition is not currently
+      degrading the capacity of the resource";
+  }
+
+  identity WARNING {
+    base OPENCONFIG_ALARM_SEVERITY;
+    description
+      "Indicates the detection of a potential or impending service
+      affecting fault, before any significant effects have been felt.
+      Action should be taken to further diagnose (if necessary) and
+      correct the problem in order to prevent it from becoming a more
+      serious service affecting fault.";
+  }
+
+  identity MAJOR {
+    base OPENCONFIG_ALARM_SEVERITY;
+    description
+      "Indicates that a service affecting condition has developed
+      and an urgent corrective action is required. Such a severity
+      can be reported, for example, when there is a severe
+      degradation in the capability of the resource and its full
+      capability must be restored.";
+  }
+
+  identity CRITICAL {
+    base OPENCONFIG_ALARM_SEVERITY;
+    description
+      "Indicates that a service affecting condition has occurred
+      and an immediate corrective action is required. Such a
+      severity can be reported, for example, when a resource becomes
+      totally out of service and its capability must be restored.";
+  }
+
+}
\ No newline at end of file
diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/types/openconfig-inet-types.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/types/openconfig-inet-types.yang
new file mode 100644
index 000000000..ff74c4287
--- /dev/null
+++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/types/openconfig-inet-types.yang
@@ -0,0 +1,485 @@
+module openconfig-inet-types {
+
+  yang-version "1";
+  namespace "http://openconfig.net/yang/types/inet";
+  prefix "oc-inet";
+
+  import openconfig-extensions { prefix "oc-ext"; }
+
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module contains a set of Internet address related
+    types for use in OpenConfig modules.
+
+    Portions of this code were derived from IETF RFC 6021.
+    Please reproduce this note if possible.
+
+    IETF code is subject to the following copyright and license:
+    Copyright (c) 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).";
+
+  oc-ext:openconfig-version "0.7.0";
+
+  revision "2024-01-05" {
+    description
+      "Change ipv6-address-zoned typedef to conform to W3C standard
+      regex pattern.";
+    reference "0.7.0";
+  }
+
+  revision "2023-02-06" {
+    description
+      "Add ipv6-link-local and ipv6-address-type";
+    reference "0.6.0";
+  }
+
+  revision "2021-08-17" {
+    description
+      "Add ip-address-zoned typedef as a union between ipv4-address-zoned
+      and ipv6-address-zoned types.";
+    reference "0.5.0";
+  }
+
+  revision "2021-07-14" {
+    description
+      "Use auto-generated regex for ipv4 pattern statements:
+      - ipv4-address
+      - ipv4-address-zoned
+      - ipv4-prefix";
+    reference "0.4.1";
+  }
+
+  revision "2021-01-07" {
+    description
+      "Remove module extension oc-ext:regexp-posix by making pattern regexes
+      conform to RFC7950.
+
+      Types impacted:
+      - ipv4-address
+      - ipv4-address-zoned
+      - ipv6-address
+      - domain-name";
+    reference "0.4.0";
+  }
+
+  revision "2020-10-12" {
+    description
+      "Fix anchors for domain-name pattern.";
+    reference "0.3.5";
+  }
+
+  revision "2020-06-30" {
+    description
+      "Add OpenConfig POSIX pattern extensions and add anchors for domain-name
+      pattern.";
+    reference "0.3.4";
+  }
+
+  revision "2019-04-25" {
+    description
+      "Fix regex bug for ipv6-prefix type";
+    reference "0.3.3";
+  }
+
+  revision "2018-11-21" {
+    description
+      "Add OpenConfig module metadata extensions.";
+    reference "0.3.2";
+  }
+
+  revision 2017-08-24 {
+    description
+      "Minor formatting fixes.";
+    reference "0.3.1";
+  }
+
+  revision 2017-07-06 {
+    description
+      "Add domain-name and host typedefs";
+    reference "0.3.0";
+  }
+
+  revision 2017-04-03 {
+    description
+      "Add ip-version typedef.";
+    reference "0.2.0";
+  }
+
+  revision 2017-04-03 {
+    description
+      "Update copyright notice.";
+    reference "0.1.1";
+  }
+
+  revision 2017-01-26 {
+    description
+      "Initial module for inet types";
+    reference "0.1.0";
+  }
+
+  // OpenConfig specific extensions for module metadata.
+  oc-ext:catalog-organization "openconfig";
+  oc-ext:origin "openconfig";
+
+  // IPv4 and IPv6 types.
+
+  typedef ipv4-address {
+    type string {
+      pattern
+        '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\.([0-9]|'
+        + '[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}';
+      oc-ext:posix-pattern
+        '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\.([0-9]|'
+        + '[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3})$';
+    }
+    description
+      "An IPv4 address in dotted quad notation using the default
+      zone.";
+  }
+
+  typedef ipv4-address-zoned {
+    type string {
+      pattern
+        '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\.([0-9]|'
+        + '[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}(%[a-zA-Z0-9_]+)';
+      oc-ext:posix-pattern
+        '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\.([0-9]|'
+        + '[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}(%[a-zA-Z0-9_]+))$';
+    }
+    description
+      "An IPv4 address in dotted quad notation.  This type allows
+      specification of a zone index to disambiguate identical
+      address values.  For link-local addresses, the index is
+      typically the interface index or interface name.";
+  }
+
+  typedef ipv6-address {
+    type string {
+        pattern
+          // Must support compression through different lengths
+          // therefore this regexp is complex.
+          '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|'         +
+          '([0-9a-fA-F]{1,4}:){1,7}:|'                        +
+          '([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|'        +
+          '([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|' +
+          '([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|' +
+          '([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|' +
+          '([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|' +
+          '[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|'      +
+          ':((:[0-9a-fA-F]{1,4}){1,7}|:)'                     +
+          ')';
+        oc-ext:posix-pattern
+          // Must support compression through different lengths
+          // therefore this regexp is complex.
+          '^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|'         +
+          '([0-9a-fA-F]{1,4}:){1,7}:|'                        +
+          '([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|'        +
+          '([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|' +
+          '([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|' +
+          '([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|' +
+          '([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|' +
+          '[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|'      +
+          ':((:[0-9a-fA-F]{1,4}){1,7}|:)'                     +
+          ')$';
+    }
+    description
+      "An IPv6 address represented as either a full address; shortened
+      or mixed-shortened formats, using the default zone.";
+  }
+
+  typedef ipv6-address-zoned {
+    type string {
+        pattern
+          // Must support compression through different lengths
+          // therefore this regexp is complex.
+          '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|'          +
+          '([0-9a-fA-F]{1,4}:){1,7}:|'                        +
+          '([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|'        +
+          '([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|' +
+          '([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|' +
+          '([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|' +
+          '([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|' +
+          '[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|'      +
+          ':((:[0-9a-fA-F]{1,4}){1,7}|:)'                     +
+          ')(%[a-zA-Z0-9_]+)';
+        oc-ext:posix-pattern
+          // Must support compression through different lengths
+          // therefore this regexp is complex.
+          '^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|'         +
+          '([0-9a-fA-F]{1,4}:){1,7}:|'                        +
+          '([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|'        +
+          '([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|' +
+          '([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|' +
+          '([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|' +
+          '([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|' +
+          '[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|'      +
+          ':((:[0-9a-fA-F]{1,4}){1,7}|:)'                     +
+          ')(%[a-zA-Z0-9_]+)$';
+    }
+    description
+      "An IPv6 address represented as either a full address; shortened
+      or mixed-shortened formats.  This type allows specification of
+      a zone index to disambiguate identical address values.  For
+      link-local addresses, the index is typically the interface
+      index or interface name.";
+  }
+
+  typedef ipv4-prefix {
+    type string {
+      pattern
+        '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\.([0-9]|'
+        + '[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}/([0-9]|[12][0-9]|'
+        + '3[0-2])';
+      oc-ext:posix-pattern
+        '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\.([0-9]|'
+        + '[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}/([0-9]|[12][0-9]|'
+        + '3[0-2]))$';
+    }
+    description
+      "An IPv4 prefix represented in dotted quad notation followed by
+      a slash and a CIDR mask (0 <= mask <= 32).";
+  }
+
+  typedef ipv6-prefix {
+    type string {
+        pattern
+          '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|'         +
+          '([0-9a-fA-F]{1,4}:){1,7}:|'                        +
+          '([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|'         +
+          '([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|' +
+          '([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|' +
+          '([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|' +
+          '([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|' +
+          '[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|'      +
+          ':((:[0-9a-fA-F]{1,4}){1,7}|:)'                     +
+          ')/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9])';
+        oc-ext:posix-pattern
+          '^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|'         +
+          '([0-9a-fA-F]{1,4}:){1,7}:|'                        +
+          '([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|'         +
+          '([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|' +
+          '([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|' +
+          '([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|' +
+          '([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|' +
+          '[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|'      +
+          ':((:[0-9a-fA-F]{1,4}){1,7}|:)'                     +
+          ')/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9])$';
+    }
+    description
+      "An IPv6 prefix represented in full, shortened, or mixed
+      shortened format followed by a slash and CIDR mask
+      (0 <= mask <= 128).";
+  }
+
+  typedef ip-address {
+    type union {
+      type ipv4-address;
+      type ipv6-address;
+    }
+    description
+      "An IPv4 or IPv6 address with no prefix specified.";
+  }
+
+  typedef ip-address-zoned {
+    type union {
+      type ipv4-address-zoned;
+      type ipv6-address-zoned;
+    }
+    description
+      "An IPv4 or IPv6 address with no prefix specified and an optional
+      zone index.";
+  }
+
+  typedef ip-prefix {
+    type union {
+      type ipv4-prefix;
+      type ipv6-prefix;
+    }
+    description
+      "An IPv4 or IPv6 prefix.";
+  }
+
+  typedef ip-version {
+    type enumeration {
+      enum UNKNOWN {
+        value 0;
+        description
+         "An unknown or unspecified version of the Internet
+          protocol.";
+      }
+      enum IPV4 {
+        value 4;
+        description
+         "The IPv4 protocol as defined in RFC 791.";
+      }
+      enum IPV6 {
+        value 6;
+        description
+         "The IPv6 protocol as defined in RFC 2460.";
+      }
+    }
+    description
+     "This value represents the version of the IP protocol.
+      Note that integer representation of the enumerated values
+      are not specified, and are not required to follow the
+      InetVersion textual convention in SMIv2.";
+    reference
+     "RFC  791: Internet Protocol
+      RFC 2460: Internet Protocol, Version 6 (IPv6) Specification
+      RFC 4001: Textual Conventions for Internet Network Addresses";
+  }
+
+  typedef ipv6-address-type {
+    type enumeration {
+      enum GLOBAL_UNICAST {
+        description
+          "The IPv6 address is a global unicast address type and must be in
+          the format defined in RFC 4291 section 2.4.";
+      }
+      enum LINK_LOCAL_UNICAST {
+        description
+          "The IPv6 address is a Link-Local unicast address type and must be
+          in the format defined in RFC 4291 section 2.4.";
+      }
+    }
+    description
+      "The value represents the type of IPv6 address";
+    reference
+      "RFC 4291: IP Version 6 Addressing Architecture
+      section 2.5";
+  }
+
+  typedef domain-name {
+    type string {
+      length "1..253";
+      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]\.?)'    +
+        '|\.)';
+      oc-ext:posix-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]\.?)'    +
+        '|\.)$';
+    }
+    description
+      "The domain-name type represents a DNS domain name.
+      Fully quallified left to the models which utilize this type.
+
+      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.
+
+      Domain-name values use the US-ASCII encoding.  Their canonical
+      format uses lowercase US-ASCII characters.  Internationalized
+      domain names MUST be encoded in punycode as described in RFC
+      3492";
+  }
+
+  typedef host {
+    type union {
+      type ip-address;
+      type domain-name;
+    }
+    description
+      "The host type represents either an unzoned IP address or a DNS
+      domain name.";
+  }
+
+  typedef as-number {
+    type uint32;
+    description
+      "A numeric identifier for an autonomous system (AS). An AS is a
+      single domain, under common administrative control, which forms
+      a unit of routing policy. Autonomous systems can be assigned a
+      2-byte identifier, or a 4-byte identifier which may have public
+      or private scope. Private ASNs are assigned from dedicated
+      ranges. Public ASNs are assigned from ranges allocated by IANA
+      to the regional internet registries (RIRs).";
+    reference
+      "RFC 1930 Guidelines for creation, selection, and registration
+                of an Autonomous System (AS)
+       RFC 4271 A Border Gateway Protocol 4 (BGP-4)";
+  }
+
+  typedef dscp {
+    type uint8 {
+      range "0..63";
+    }
+    description
+      "A differentiated services code point (DSCP) marking within the
+      IP header.";
+    reference
+      "RFC 2474 Definition of the Differentiated Services Field
+                 (DS Field) in the IPv4 and IPv6 Headers";
+  }
+
+  typedef ipv6-flow-label {
+    type uint32 {
+      range "0..1048575";
+    }
+    description
+      "The IPv6 flow-label is a 20-bit value within the IPv6 header
+      which is optionally used by the source of the IPv6 packet to
+      label sets of packets for which special handling may be
+      required.";
+    reference
+      "RFC 2460 Internet Protocol, Version 6 (IPv6) Specification";
+  }
+
+  typedef port-number {
+    type uint16;
+    description
+      "A 16-bit port number used by a transport protocol such as TCP
+      or UDP.";
+    reference
+      "RFC 768 User Datagram Protocol
+       RFC 793 Transmission Control Protocol";
+  }
+
+  typedef uri {
+    type string;
+    description
+      "An ASCII-encoded Uniform Resource Identifier (URI) as defined
+      in RFC 3986.";
+    reference
+      "RFC 3986 Uniform Resource Identifier (URI): Generic Syntax";
+  }
+
+  typedef url {
+    type string;
+    description
+      "An ASCII-encoded Uniform Resource Locator (URL) as defined
+      in RFC 3986, section 1.1.3";
+    reference
+      "RFC 3986, paragraph 1.1.3";
+  }
+
+}
diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/types/openconfig-types.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/types/openconfig-types.yang
new file mode 100644
index 000000000..a146b9b76
--- /dev/null
+++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/types/openconfig-types.yang
@@ -0,0 +1,485 @@
+module openconfig-types {
+  yang-version "1";
+
+  namespace "http://openconfig.net/yang/openconfig-types";
+
+  prefix "oc-types";
+
+  // import statements
+  import openconfig-extensions { prefix oc-ext; }
+
+  // meta
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "This module contains a set of general type definitions that
+    are used across OpenConfig models. It can be imported by modules
+    that make use of these types.";
+
+  oc-ext:openconfig-version "1.0.0";
+
+  revision "2024-01-31" {
+    description
+      "Add posix-eregexp type and promote model to version 1.0.0.";
+    reference "1.0.0";
+  }
+
+  revision "2019-04-16" {
+    description
+      "Clarify definition of timeticks64.";
+    reference "0.6.0";
+  }
+
+  revision "2018-11-21" {
+    description
+      "Add OpenConfig module metadata extensions.";
+    reference "0.5.1";
+  }
+
+  revision "2018-05-05" {
+    description
+      "Add grouping of min-max-time and
+       included them to all stats with min/max/avg";
+    reference "0.5.0";
+  }
+
+  revision "2018-01-16" {
+    description
+      "Add interval to min/max/avg stats; add percentage stat";
+    reference "0.4.0";
+  }
+
+  revision "2017-08-16" {
+    description
+      "Apply fix for ieetfloat32 length parameter";
+    reference "0.3.3";
+  }
+
+  revision "2017-01-13" {
+    description
+      "Add ADDRESS_FAMILY identity";
+    reference "0.3.2";
+  }
+
+  revision "2016-11-14" {
+    description
+      "Correct length of ieeefloat32";
+    reference "0.3.1";
+  }
+
+  revision "2016-11-11" {
+    description
+      "Additional types - ieeefloat32 and routing-password";
+    reference "0.3.0";
+  }
+
+  revision "2016-05-31" {
+    description
+      "OpenConfig public release";
+    reference "0.2.0";
+  }
+
+  // OpenConfig specific extensions for module metadata.
+  oc-ext:regexp-posix;
+  oc-ext:catalog-organization "openconfig";
+  oc-ext:origin "openconfig";
+
+  typedef percentage {
+    type uint8 {
+      range "0..100";
+    }
+    description
+      "Integer indicating a percentage value";
+  }
+
+  typedef std-regexp {
+    type string;
+    description
+      "This type definition is a placeholder for a standard
+      definition of a regular expression that can be utilised in
+      OpenConfig models. Further discussion is required to
+      consider the type of regular expressions that are to be
+      supported. An initial proposal is POSIX compatible.";
+  }
+
+  typedef posix-eregexp {
+    type string;
+    description
+      "This is a string which represents an extended POSIX
+      regular expression.";
+    reference "IEEE Std 1003.1-2017";
+  }
+
+  typedef timeticks64 {
+    type uint64;
+    units "nanoseconds";
+    description
+     "The timeticks64 represents the time, modulo 2^64 in
+     nanoseconds between two epochs. The leaf using this
+     type must define the epochs that tests are relative to.";
+  }
+
+  typedef ieeefloat32 {
+    type binary {
+      length "4";
+    }
+    description
+      "An IEEE 32-bit floating point number. The format of this number
+      is of the form:
+        1-bit  sign
+        8-bit  exponent
+        23-bit fraction
+      The floating point value is calculated using:
+        (-1)**S * 2**(Exponent-127) * (1+Fraction)";
+  }
+
+  typedef routing-password {
+    type string;
+    description
+      "This type is indicative of a password that is used within
+      a routing protocol which can be returned in plain text to the
+      NMS by the local system. Such passwords are typically stored
+      as encrypted strings. Since the encryption used is generally
+      well known, it is possible to extract the original value from
+      the string - and hence this format is not considered secure.
+      Leaves specified with this type should not be modified by
+      the system, and should be returned to the end-user in plain
+      text. This type exists to differentiate passwords, which
+      may be sensitive, from other string leaves. It could, for
+      example, be used by the NMS to censor this data when
+      viewed by particular users.";
+  }
+
+  typedef stat-interval {
+    type uint64;
+    units nanoseconds;
+    description
+      "A time interval over which a set of statistics is computed.
+      A common usage is to report the interval over which
+      avg/min/max stats are computed and reported.";
+  }
+
+  grouping stat-interval-state {
+    description
+      "Reusable leaf definition for stats computation interval";
+
+    leaf interval {
+      type oc-types:stat-interval;
+      description
+        "If supported by the system, this reports the time interval
+        over which the min/max/average statistics are computed by
+        the system.";
+    }
+  }
+
+  grouping min-max-time {
+    description
+      "Common grouping for recording the absolute time at which
+      the minimum and maximum values occurred in the statistics";
+
+    leaf min-time {
+      type oc-types:timeticks64;
+      description
+        "The absolute time at which the minimum value occurred.
+         The value is the timestamp in nanoseconds relative to
+          the Unix Epoch (Jan 1, 1970 00:00:00 UTC).";
+    }
+
+    leaf max-time {
+      type oc-types:timeticks64;
+      description
+        "The absolute time at which the maximum value occurred.
+         The value is the timestamp in nanoseconds relative to
+          the Unix Epoch (Jan 1, 1970 00:00:00 UTC).";
+    }
+  }
+
+  grouping avg-min-max-stats-precision1 {
+    description
+      "Common nodes for recording average, minimum, and
+      maximum values for a statistic.  These values all have
+      fraction-digits set to 1.  Statistics are computed
+      and reported based on a moving time interval (e.g., the last
+      30s).  If supported by the device, the time interval over which
+      the statistics are computed is also reported.";
+
+    leaf avg {
+      type decimal64 {
+        fraction-digits 1;
+      }
+      description
+        "The arithmetic mean value of the statistic over the
+        time interval.";
+    }
+
+    leaf min {
+      type decimal64 {
+        fraction-digits 1;
+      }
+      description
+        "The minimum value of the statistic over the time
+        interval.";
+    }
+
+    leaf max {
+      type decimal64 {
+        fraction-digits 1;
+      }
+      description
+        "The maximum value of the statitic over the time
+        interval.";
+    }
+
+    uses stat-interval-state;
+    uses min-max-time;
+  }
+
+  grouping avg-min-max-instant-stats-precision1 {
+    description
+      "Common grouping for recording an instantaneous statistic value
+      in addition to avg-min-max stats";
+
+    leaf instant {
+      type decimal64 {
+        fraction-digits 1;
+      }
+      description
+        "The instantaneous value of the statistic.";
+    }
+
+    uses avg-min-max-stats-precision1;
+  }
+
+  grouping avg-min-max-instant-stats-precision2-dB {
+    description
+      "Common grouping for recording dB values with 2 decimal
+      precision. Values include the instantaneous, average,
+      minimum, and maximum statistics.  Statistics are computed
+      and reported based on a moving time interval (e.g., the last
+      30s).  If supported by the device, the time interval over which
+      the statistics are computed, and the times at which the minimum
+      and maximum values occurred, are also reported.";
+
+    leaf instant {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dB;
+      description
+        "The instantaneous value of the statistic.";
+    }
+
+    leaf avg {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dB;
+      description
+        "The arithmetic mean value of the statistic over the
+        time interval.";
+    }
+
+    leaf min {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dB;
+      description
+        "The minimum value of the statistic over the time interval.";
+    }
+
+    leaf max {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dB;
+      description
+        "The maximum value of the statistic over the time
+        interval.";
+    }
+
+    uses stat-interval-state;
+    uses min-max-time;
+  }
+
+  grouping avg-min-max-instant-stats-precision2-dBm {
+    description
+      "Common grouping for recording dBm values with 2 decimal
+      precision. Values include the instantaneous, average,
+      minimum, and maximum statistics.  Statistics are computed
+      and reported based on a moving time interval (e.g., the last
+      30s).  If supported by the device, the time interval over which
+      the statistics are computed, and the times at which the minimum
+      and maximum values occurred, are also reported.";
+
+    leaf instant {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dBm;
+      description
+        "The instantaneous value of the statistic.";
+    }
+
+    leaf avg {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dBm;
+      description
+        "The arithmetic mean value of the statistic over the
+        time interval.";
+    }
+
+    leaf min {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dBm;
+      description
+        "The minimum value of the statistic over the time
+        interval.";
+    }
+
+    leaf max {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dBm;
+      description
+        "The maximum value of the statistic over the time interval.";
+    }
+
+    uses stat-interval-state;
+    uses min-max-time;
+  }
+
+  grouping avg-min-max-instant-stats-precision2-mA {
+    description
+      "Common grouping for recording mA values with 2 decimal
+      precision. Values include the instantaneous, average,
+      minimum, and maximum statistics.  Statistics are computed
+      and reported based on a moving time interval (e.g., the last
+      30s).  If supported by the device, the time interval over which
+      the statistics are computed, and the times at which the minimum
+      and maximum values occurred, are also reported.";
+
+    leaf instant {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units mA;
+      description
+        "The instantaneous value of the statistic.";
+    }
+
+    leaf avg {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units mA;
+      description
+        "The arithmetic mean value of the statistic over the
+        time interval.";
+    }
+
+    leaf min {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units mA;
+      description
+        "The minimum value of the statistic over the time
+        interval.";
+    }
+
+    leaf max {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units mA;
+      description
+        "The maximum value of the statistic over the time
+        interval.";
+    }
+
+    uses stat-interval-state;
+    uses min-max-time;
+  }
+
+  grouping avg-min-max-instant-stats-pct {
+    description
+      "Common grouping for percentage statistics.
+      Values include the instantaneous, average,
+      minimum, and maximum statistics.  Statistics are computed
+      and reported based on a moving time interval (e.g., the last
+      30s).  If supported by the device, the time interval over which
+      the statistics are computed, and the times at which the minimum
+      and maximum values occurred, are also reported.";
+
+    leaf instant {
+      type oc-types:percentage;
+      description
+        "The instantaneous percentage value.";
+    }
+
+    leaf avg {
+      type oc-types:percentage;
+      description
+        "The arithmetic mean value of the percentage measure of the
+        statistic over the time interval.";
+    }
+
+    leaf min {
+      type oc-types:percentage;
+      description
+        "The minimum value of the percentage measure of the
+        statistic over the time interval.";
+    }
+
+    leaf max {
+      type oc-types:percentage;
+      description
+        "The maximum value of the percentage measure of the
+        statistic over the time interval.";
+    }
+
+    uses stat-interval-state;
+    uses min-max-time;
+  }
+
+  identity ADDRESS_FAMILY {
+    description
+      "A base identity for all address families";
+  }
+
+  identity IPV4 {
+    base ADDRESS_FAMILY;
+    description
+      "The IPv4 address family";
+  }
+
+  identity IPV6 {
+    base ADDRESS_FAMILY;
+    description
+      "The IPv6 address family";
+  }
+
+  identity MPLS {
+    base ADDRESS_FAMILY;
+    description
+      "The MPLS address family";
+  }
+
+  identity L2_ETHERNET {
+    base ADDRESS_FAMILY;
+    description
+      "The 802.3 Ethernet address family";
+  }
+
+}
diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/types/openconfig-yang-types.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/types/openconfig-yang-types.yang
new file mode 100644
index 000000000..c978cd049
--- /dev/null
+++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/types/openconfig-yang-types.yang
@@ -0,0 +1,230 @@
+module openconfig-yang-types {
+
+  yang-version "1";
+  namespace "http://openconfig.net/yang/types/yang";
+  prefix "oc-yang";
+
+  import openconfig-extensions { prefix "oc-ext"; }
+
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module contains a set of extension types to the
+    YANG builtin types that are used across multiple
+    OpenConfig models.
+
+    Portions of this code were derived from IETF RFC 6021.
+    Please reproduce this note if possible.
+
+    IETF code is subject to the following copyright and license:
+    Copyright (c) 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).";
+
+  oc-ext:openconfig-version "0.3.1";
+
+  revision "2021-07-14" {
+    description
+      "Use auto-generated regex for certain pattern statements:
+      - dotted-quad
+      - date-and-time
+      - date
+
+      For date-and-time, allow lowercase z and t in the pattern.";
+    reference "0.3.1";
+  }
+
+  revision "2021-03-02" {
+    description
+      "Fix date-and-time and date's pattern statement, and remove the
+      regexp-posix extension, which makes pattern statements conform to the
+      YANG standard.";
+    reference "0.3.0";
+  }
+
+  revision "2020-06-30" {
+    description
+      "Add OpenConfig POSIX pattern extensions.";
+    reference "0.2.2";
+  }
+
+  revision "2018-11-21" {
+    description
+      "Add OpenConfig module metadata extensions.";
+    reference "0.2.1";
+  }
+
+  revision 2018-04-24 {
+    description
+      "Add date typedef";
+    reference "0.2.0";
+  }
+
+  revision 2017-07-30 {
+    description
+      "Fixed unprintable character";
+    reference "0.1.2";
+  }
+
+  revision 2017-04-03 {
+    description
+      "Update copyright notice.";
+    reference "0.1.1";
+  }
+
+  revision 2017-01-26 {
+    description
+      "Initial module for inet types";
+    reference "0.1.0";
+  }
+
+  // OpenConfig specific extensions for module metadata.
+  oc-ext:catalog-organization "openconfig";
+  oc-ext:origin "openconfig";
+
+  typedef dotted-quad {
+    type string {
+      pattern
+        '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\.([0-9]|'
+        + '[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}';
+      oc-ext:posix-pattern
+        '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\.([0-9]|'
+        + '[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3})$';
+    }
+    description
+      "An unsigned 32-bit integer expressed as a dotted quad. The
+      format is four octets written as decimal numbers separated
+      with a period character.";
+  }
+
+  typedef hex-string {
+    type string {
+      pattern '[0-9a-fA-F]*';
+      oc-ext:posix-pattern '^[0-9a-fA-F]*$';
+    }
+    description
+      "A string consisting of a hexadecimal characters.";
+  }
+
+  typedef counter32 {
+    type uint32;
+    description
+
+      "A 32-bit counter. A counter value is a monotonically increasing
+      value which is used to express a count of a number of
+      occurrences of a particular event or entity. When the counter
+      reaches its maximum value, in this case 2^32-1, it wraps to 0.
+
+      Discontinuities in the counter are generally triggered only when
+      the counter is reset to zero.";
+  }
+
+  typedef counter64 {
+    type uint64;
+    description
+      "A 64-bit counter. A counter value is a monotonically increasing
+      value which is used to express a count of a number of
+      occurrences of a particular event or entity. When a counter64
+      reaches its maximum value, 2^64-1, it loops to zero.
+      Discontinuities in a counter are generally triggered only when
+      the counter is reset to zero, through operator or system
+      intervention.";
+  }
+
+  typedef date-and-time {
+    type string {
+      pattern
+        '[0-9]{4}\-(0[1-9]|1[0-2])\-(0[1-9]|[12][0-9]|3[01])[Tt](0[0-9]|'
+        + '1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9]|'
+        + '60)(\.[0-9]+)?([Zz]|([+-](0[0-9]|1[0-9]|2[0-3]):(0[0-9]|'
+        + '[1-5][0-9])))';
+      oc-ext:posix-pattern
+        '^([0-9]{4}\-(0[1-9]|1[0-2])\-(0[1-9]|[12][0-9]|3[01])[Tt](0[0-9]|'
+        + '1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9]|'
+        + '60)(\.[0-9]+)?([Zz]|([+-](0[0-9]|1[0-9]|2[0-3]):(0[0-9]|'
+        + '[1-5][0-9]))))$';
+    }
+    description
+      "A date and time, expressed in the format described in RFC3339.
+      That is to say:
+
+      YYYY-MM-DDTHH:MM:SSZ+-hh:mm
+
+      where YYYY is the year, MM is the month expressed as a two-digit
+      month (zero padding if required), DD is the day of the month,
+      expressed as a two digit value. T is the literal character 'T',
+      HH is the hour of the day expressed as a two digit number, using
+      the 24-hour clock, MM is the minute of the hour expressed as a
+      two digit number. Z is the literal character 'Z', followed by a
+      timezone offset expressed in hours (hh) and minutes (mm), both
+      expressed as two digit numbers. The time offset is specified as
+      a positive or negative offset to UTC using the '+' or '-'
+      character preceding the offset.
+
+      Optionally, fractional seconds can be expressed after the minute
+      of the hour as a decimal number of unspecified precision
+      reflecting fractions of a second.";
+    reference
+      "RFC3339 - Date and Time on the Internet: Timestamps";
+  }
+
+  typedef date {
+    type string {
+      pattern
+        '[0-9]{4}\-(0[1-9]|1[0-2])\-(0[1-9]|[12][0-9]|3[01])';
+      oc-ext:posix-pattern
+        '^([0-9]{4}\-(0[1-9]|1[0-2])\-(0[1-9]|[12][0-9]|3[01]))$';
+    }
+    description
+      "A full UTC date, expressed in the format described in RFC3339.
+      That is to say:
+
+      YYYY-MM-DD
+
+      where YYYY is the year, MM is the month expressed as a two-digit
+      month (zero padding if required), DD is the day of the month,
+      expressed as a two digit value.";
+
+    reference
+      "RFC3339 - Date and Time on the Internet: full-date";
+  }
+
+  typedef gauge64 {
+    type uint64;
+    description
+      "A gauge value may increase or decrease - and reflects a value
+      at a particular point in time. If the value of the variable
+      being modeled using the gauge exceeds its maximum - 2^64-1 in
+      this case - the gauge is set to its maximum value.";
+  }
+
+  typedef phys-address {
+    type string {
+      pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?';
+      oc-ext:posix-pattern '^([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?$';
+    }
+    description
+      "A physical layer address, expressed as a series of pairs of
+      hexadecimal digits.";
+  }
+
+  typedef mac-address {
+    type string {
+      pattern '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}';
+      oc-ext:posix-pattern '^[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}$';
+    }
+    description
+      "An IEEE 802 MAC address";
+  }
+}
diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/vlan/openconfig-vlan-types.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/vlan/openconfig-vlan-types.yang
new file mode 100644
index 000000000..09af39887
--- /dev/null
+++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/vlan/openconfig-vlan-types.yang
@@ -0,0 +1,283 @@
+module openconfig-vlan-types {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/vlan-types";
+
+  prefix "oc-vlan-types";
+
+  // import some basic types
+  import openconfig-extensions { prefix oc-ext; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "This module defines configuration and state variables for VLANs,
+    in addition to VLAN parameters associated with interfaces";
+
+  oc-ext:openconfig-version "3.2.0";
+
+  revision "2022-05-24" {
+    description
+      "Remove module extension oc-ext:regexp-posix by making pattern regexes
+      conform to RFC6020/7950.
+
+      Types impacted:
+      - vlan-range
+      - qinq-id
+      - qinq-id-range";
+    reference "3.2.0";
+  }
+
+  revision "2020-06-30" {
+    description
+      "Add OpenConfig POSIX pattern extensions.";
+    reference "3.1.1";
+  }
+
+  revision "2019-01-31" {
+    description
+      "Add TPID_ANY wildcard match and a QinQ list type.";
+    reference "3.1.0";
+  }
+
+  revision "2018-11-21" {
+    description
+      "Add OpenConfig module metadata extensions.";
+    reference "3.0.1";
+  }
+
+  revision "2018-02-14" {
+    description
+      "Fix bug with name of 802.1ad identity.";
+    reference "3.0.0";
+  }
+
+  revision "2017-07-14" {
+    description
+      "Move top-level vlan data to network-instance; Update
+      identities to comply to style guide; fixed pattern
+      quoting; corrected trunk vlan types; added TPID config to
+      base interface.";
+    reference "2.0.0";
+  }
+
+  revision "2016-05-26" {
+    description
+      "OpenConfig public release";
+    reference "1.0.2";
+  }
+
+  // OpenConfig specific extensions for module metadata.
+  oc-ext:catalog-organization "openconfig";
+  oc-ext:origin "openconfig";
+
+  // extension statements
+
+  // feature statements
+
+  // identity statements
+
+  identity TPID_TYPES {
+    description
+      "Base identity for TPID values that can be matched or that override
+       the VLAN ethertype value";
+  }
+
+  identity TPID_0X8100 {
+    base TPID_TYPES;
+    description
+      "Default TPID value for 802.1q single-tagged VLANs.";
+  }
+
+  identity TPID_0X88A8 {
+    base TPID_TYPES;
+    description
+      "TPID value for 802.1ad provider bridging, QinQ or
+       stacked VLANs.";
+  }
+
+  identity TPID_0X9100 {
+    base TPID_TYPES;
+    description
+      "Alternate TPID value.";
+  }
+
+  identity TPID_0X9200 {
+    base TPID_TYPES;
+    description
+      "Alternate TPID value.";
+  }
+
+  identity TPID_ANY {
+    base TPID_TYPES;
+    description
+      "A wildcard that matches any of the generally used TPID values
+       for singly- or multiply-tagged VLANs. Equivalent to matching
+       any of TPID_0X8100, TPID_0X88A8, TPID_0X9100 and TPID_0x9200.
+       This value is only applicable where the TPID of a packet is
+       being matched.";
+  }
+
+  // typedef statements
+
+  // TODO: typedefs should be defined in a vlan-types.yang file.
+  typedef vlan-id {
+    type uint16 {
+      range 1..4094;
+    }
+    description
+      "Type definition representing a single-tagged VLAN";
+  }
+
+  typedef vlan-range {
+    type string {
+      // range specified as [lower]..[upper]
+      pattern '(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|'       +
+              '[1-9][0-9]{1,2}|[1-9])\.\.(409[0-4]|'       +
+              '40[0-8][0-9]|[1-3][0-9]{3}|[1-9][0-9]{1,2}|' +
+              '[1-9])';
+      oc-ext:posix-pattern '^(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|'       +
+              '[1-9][0-9]{1,2}|[1-9])\.\.(409[0-4]|'       +
+              '40[0-8][0-9]|[1-3][0-9]{3}|[1-9][0-9]{1,2}|' +
+              '[1-9])$';
+    }
+    description
+      "Type definition representing a range of single-tagged
+      VLANs. A range is specified as x..y where x and y are
+      valid VLAN IDs (1 <= vlan-id <= 4094). The range is
+      assumed to be inclusive, such that any VLAN-ID matching
+      x <= VLAN-ID <= y falls within the range.";
+  }
+
+  typedef qinq-id {
+    type string {
+      pattern
+        '(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|'       +
+        '[1-9][0-9]{1,2}|[1-9])\.'                    +
+        '((409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|'      +
+        '[1-9][0-9]{1,2}|[1-9])|\*)';
+      oc-ext:posix-pattern
+        '^(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|'       +
+        '[1-9][0-9]{1,2}|[1-9])\.'                    +
+        '((409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|'      +
+        '[1-9][0-9]{1,2}|[1-9])|\*)$';
+    }
+    description
+      "Type definition representing a single double-tagged/QinQ VLAN
+      identifier. The format of a QinQ VLAN-ID is x.y where X is the
+      'outer' VLAN identifier, and y is the 'inner' VLAN identifier.
+      Both x and y must be valid VLAN IDs (1 <= vlan-id <= 4094)
+      with the exception that y may be equal to a wildcard (*). In
+      cases where y is set to the wildcard, this represents all inner
+      VLAN identifiers where the outer VLAN identifier is equal to
+      x.";
+  }
+
+  typedef qinq-id-range {
+    type union {
+      type string {
+        // match cases where the range is specified as x..y.z
+        pattern
+          '(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|'    +
+          '[1-9][0-9]{1,2}|[1-9])\.\.'               +
+          '(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|'    +
+          '[1-9][0-9]{1,2}|[1-9])\.'                 +
+          '((409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|'   +
+          '[1-9][0-9]{1,2}|[1-9])|\*)';
+        oc-ext:posix-pattern
+          '^(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|'    +
+          '[1-9][0-9]{1,2}|[1-9])\.\.'               +
+          '(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|'    +
+          '[1-9][0-9]{1,2}|[1-9])\.'                 +
+          '((409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|'   +
+          '[1-9][0-9]{1,2}|[1-9])|\*)$';
+      }
+      type string {
+        // match cases where the range is specified as x.y..z
+        pattern
+          '(\*|(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|'    +
+          '[1-9][0-9]{1,2}|[1-9]))\.'                 +
+          '(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|'    +
+          '[1-9][0-9]{1,2}|[1-9])\.\.'               +
+          '(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|'    +
+          '[1-9][0-9]{1,2}|[1-9])';
+        oc-ext:posix-pattern
+          '^(\*|(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|'    +
+          '[1-9][0-9]{1,2}|[1-9]))\.'                 +
+          '(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|'    +
+          '[1-9][0-9]{1,2}|[1-9])\.\.'               +
+          '(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|'    +
+          '[1-9][0-9]{1,2}|[1-9])$';
+      }
+    }
+    description
+      "A type definition representing a range of double-tagged/QinQ
+      VLAN identifiers. The format of a QinQ VLAN-ID range can be
+      specified in two formats. Where the range is outer VLAN IDs
+      the range is specified as x..y.z. In this case outer VLAN
+      identifiers meeting the criteria x <= outer-vlan-id <= y are
+      accepted if and only if the inner VLAN-ID is equal to y - or
+      any inner-tag if the wildcard is specified. Alternatively the
+      ange can be specified as x.y..z. In this case only VLANs with an
+      outer-vlan-id qual to x are accepted (x may again be the
+      wildcard). Inner VLANs are accepted if they meet the inequality
+      y <= inner-vlan-id <= z.";
+  }
+
+  typedef vlan-mode-type {
+    type enumeration {
+      enum ACCESS {
+        description "Access mode VLAN interface (No 802.1q header)";
+      }
+      enum TRUNK {
+        description "Trunk mode VLAN interface";
+      }
+    }
+    description
+      "VLAN interface mode (trunk or access)";
+  }
+
+  typedef vlan-ref {
+    type union {
+      type vlan-id;
+      type string;
+      // TODO: string should be changed to leafref to reference
+      // an existing VLAN.  this is not allowed in YANG 1.0 but
+      // is expected to be in YANG 1.1.
+      // type leafref {
+      //  path "vlan:vlans/vlan:vlan/vlan:config/vlan:name";
+      // }
+    }
+    description
+      "Reference to a VLAN by name or id";
+  }
+
+  typedef vlan-stack-action {
+    type enumeration {
+      enum PUSH {
+        description
+          "Push a VLAN onto the VLAN stack.";
+      }
+      enum POP {
+        description
+          "Pop a VLAN from the VLAN stack.";
+      }
+      enum SWAP {
+        description
+          "Swap the VLAN at the top of the VLAN stack.";
+      }
+      // TODO: add push-push, pop-pop, push-swap etc
+    }
+    description
+      "Operations that can be performed on a VLAN stack.";
+  }
+
+
+}
diff --git a/src/tests/tools/firewall_agent/docs/yang/openconfig/vlan/openconfig-vlan.yang b/src/tests/tools/firewall_agent/docs/yang/openconfig/vlan/openconfig-vlan.yang
new file mode 100644
index 000000000..905d48150
--- /dev/null
+++ b/src/tests/tools/firewall_agent/docs/yang/openconfig/vlan/openconfig-vlan.yang
@@ -0,0 +1,1001 @@
+module openconfig-vlan {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/vlan";
+
+  prefix "oc-vlan";
+
+  // import some basic types
+  import openconfig-vlan-types { prefix oc-vlan-types; }
+  import openconfig-interfaces { prefix oc-if; }
+  import openconfig-if-ethernet { prefix oc-eth; }
+  import openconfig-if-aggregate { prefix oc-lag; }
+  import iana-if-type { prefix ianaift; }
+  import openconfig-extensions { prefix oc-ext; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "This module defines configuration and state variables for VLANs,
+    in addition to VLAN parameters associated with interfaces";
+
+  oc-ext:openconfig-version "3.2.2";
+
+  revision "2023-02-07" {
+    description
+      "Remove prefix from enums in when statements";
+    reference "3.2.2";
+  }
+
+  revision "2021-07-28" {
+    description
+      "Add prefix to qualify when statements";
+    reference "3.2.1";
+  }
+
+  revision "2019-04-16" {
+    description
+      "Update import prefix for iana-if-type module";
+    reference "3.2.0";
+  }
+
+  revision "2019-01-31" {
+    description
+      "Revise QinQ matching and add input/output VLAN stack operations.";
+    reference "3.1.0";
+  }
+
+  revision "2018-11-21" {
+    description
+      "Add OpenConfig module metadata extensions.";
+    reference "3.0.2";
+  }
+
+  revision "2018-06-05" {
+    description
+      "Fix bugs in when statements.";
+    reference "3.0.1";
+  }
+
+  revision "2018-02-14" {
+    description
+      "Fix bug with name of 802.1ad identity.";
+    reference "3.0.0";
+  }
+
+  revision "2017-07-14" {
+    description
+      "Move top-level vlan data to network-instance; Update
+      identities to comply to style guide; fixed pattern
+      quoting; corrected trunk vlan types; added TPID config to
+      base interface.";
+    reference "2.0.0";
+  }
+
+  revision "2016-05-26" {
+    description
+      "OpenConfig public release";
+    reference "1.0.2";
+  }
+
+  // OpenConfig specific extensions for module metadata.
+  oc-ext:regexp-posix;
+  oc-ext:catalog-organization "openconfig";
+  oc-ext:origin "openconfig";
+
+  // grouping statements
+
+  grouping vlan-config {
+    description "VLAN configuration container.";
+
+    leaf vlan-id {
+      type oc-vlan-types:vlan-id;
+      description "Interface VLAN id.";
+    }
+
+    leaf name {
+      type string;
+      description "Interface VLAN name.";
+    }
+
+    leaf status {
+      type enumeration {
+        enum ACTIVE {
+          description "VLAN is active";
+        }
+        enum SUSPENDED {
+          description "VLAN is inactive / suspended";
+        }
+      }
+      default ACTIVE;
+      description "Admin state of the VLAN";
+    }
+
+  }
+
+  grouping vlan-state {
+    description "State variables for VLANs";
+
+    // placeholder
+
+  }
+
+  grouping vlan-tpid-config {
+    description
+      "TPID configuration for dot1q-enabled interfaces";
+
+    leaf tpid {
+      type identityref {
+        base oc-vlan-types:TPID_TYPES;
+      }
+      default oc-vlan-types:TPID_0X8100;
+      description
+        "Optionally set the tag protocol identifier field (TPID) that
+        is accepted on the VLAN";
+    }
+  }
+
+  grouping vlan-tpid-state {
+    description
+      "TPID opstate for dot1q-enabled interfaces";
+
+    // placeholder
+
+  }
+
+  grouping vlan-members-state {
+    description
+      "List of interfaces / subinterfaces belonging to the VLAN.";
+
+    container members {
+      description
+        "Enclosing container for list of member interfaces";
+
+      list member {
+        config false;
+        description
+          "List of references to interfaces / subinterfaces
+          associated with the VLAN.";
+
+        uses oc-if:base-interface-ref-state;
+      }
+    }
+  }
+
+  grouping vlan-switched-config {
+    description
+      "VLAN related configuration that is part of the physical
+      Ethernet interface.";
+
+    leaf interface-mode {
+      type oc-vlan-types:vlan-mode-type;
+      description
+        "Set the interface to access or trunk mode for
+        VLANs";
+    }
+
+    leaf native-vlan {
+      when "../interface-mode = 'TRUNK'" {
+        description
+          "Native VLAN is valid for trunk mode interfaces";
+      }
+      type oc-vlan-types:vlan-id;
+      description
+        "Set the native VLAN id for untagged frames arriving on
+        a trunk interface.  Tagged frames sent on an interface
+        configured with a native VLAN should have their tags
+        stripped prior to transmission. This configuration is only
+        valid on a trunk interface.";
+    }
+
+    leaf access-vlan {
+      when "../interface-mode = 'ACCESS'" {
+        description
+          "Access VLAN assigned to the interfaces";
+      }
+      type oc-vlan-types:vlan-id;
+      description
+        "Assign the access vlan to the access port.";
+    }
+
+    leaf-list trunk-vlans {
+      when "../interface-mode = 'TRUNK'" {
+        description
+          "Allowed VLANs may be specified for trunk mode
+          interfaces.";
+      }
+      type union {
+        type oc-vlan-types:vlan-id;
+        type oc-vlan-types:vlan-range;
+      }
+      description
+        "Specify VLANs, or ranges thereof, that the interface may
+        carry when in trunk mode.  If not specified, all VLANs are
+        allowed on the interface. Ranges are specified in the form
+        x..y, where x 0: continue
+                chains_to_remove.add(chain_name)
+            for chain_name in chains_to_remove:
+                table.chains.pop(chain_name)
+            if len(nft.tables) > 0: continue
+            tables_to_remove.add(table_key)
+        for table_key in tables_to_remove:
+            nft.tables.pop(table_key)
+        return nft.to_openconfig(), 200
+
+    def delete(self, name : str):
+        nft = NFTables()
+        nft.load(FamilyEnum.IPV4, TableEnum.FILTER)
+        tables_to_remove : Set[Tuple[FamilyEnum, TableEnum]] = set()
+        for table_key, table in nft.tables.items():
+            chains_to_remove : Set[str] = set()
+            for chain_name, chain in table.chains.items():
+                for rule in reversed(chain.rules):
+                    if rule.comment == name: continue
+                    chain.rules.remove(rule) # not a rule of interest
+                if len(chain.rules) > 0: continue
+                chains_to_remove.add(chain_name)
+            for chain_name in chains_to_remove:
+                table.chains.pop(chain_name)
+            if len(nft.tables) > 0: continue
+            tables_to_remove.add(table_key)
+        for table_key in tables_to_remove:
+            nft.tables.pop(table_key)
+        nft.execute(removal=True, verbose=True)
+        return {}, 204
+
+
+def register_restconf_openconfig_acls(api : Api):
+    api.add_resource(ACLs, BASE_URL_ROOT)
+    api.add_resource(ACL, BASE_URL_ITEM)
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/Components.py b/src/tests/tools/firewall_agent/firewall_agent/resources/Components.py
new file mode 100644
index 000000000..a00f6d54e
--- /dev/null
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/Components.py
@@ -0,0 +1,40 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 netifaces
+from flask_restful import Api, Resource
+
+BASE_URL = '/restconf/data/openconfig-platform:components'
+
+class Components(Resource):
+    def get(self):
+        # Build components list from interface names, reporting only PORT type
+        comps = list()
+        if_names = netifaces.interfaces()
+        for if_name in if_names:
+            comp = {
+                'name': if_name,
+                'config': {'name': if_name},
+                'state': {
+                    'name': if_name,
+                    'type': 'openconfig-platform-types:PORT',
+                    'empty': False
+                },
+            }
+            comps.append(comp)
+        return {'openconfig-platform:components': {'component': comps}}, 200
+
+def register_restconf_openconfig_components(api : Api):
+    api.add_resource(Components, BASE_URL)
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/HostMeta.py b/src/tests/tools/firewall_agent/firewall_agent/resources/HostMeta.py
new file mode 100644
index 000000000..1ef52084b
--- /dev/null
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/HostMeta.py
@@ -0,0 +1,25 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 Api, Resource
+
+BASE_URL = '/.well-known/host-meta'
+
+class HostMeta(Resource):
+    def get(self):
+        return {'links': [{'rel': 'restconf', 'href': '/restconf/data'}]}, 200
+
+def register_host_meta(api : Api):
+    api.add_resource(HostMeta, BASE_URL)
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/Interfaces.py b/src/tests/tools/firewall_agent/firewall_agent/resources/Interfaces.py
new file mode 100644
index 000000000..6a33f70b9
--- /dev/null
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/Interfaces.py
@@ -0,0 +1,88 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 copy, ipaddress, netifaces
+from flask_restful import Api, Resource
+
+BASE_URL = '/restconf/data/openconfig-interfaces:interfaces'
+
+class Interfaces(Resource):
+    def get(self):
+        if_list = list()
+        for if_name in netifaces.interfaces():
+            if if_name.startswith('lo'):
+                if_type = 'iana-if-type:softwareLoopback'
+            else:
+                if_type = 'iana-if-type:ethernetCsmacd'
+
+            if_config = {'name': if_name, 'type': if_type, 'enabled': True}
+            if_state = copy.deepcopy(if_config)
+            if_state.update({'admin-status': 'UP', 'oper-status': 'UP'})
+            if_data = {'name': if_name, 'config': if_config, 'state': if_state}
+
+            sif_index = 1
+            sif_config = {'index': sif_index, 'enabled': True}
+            sif_state = copy.deepcopy(sif_config)
+            sif_state.update({'admin-status': 'UP', 'oper-status': 'UP'})
+            sif_data = {'index': sif_index, 'config': sif_config, 'state': sif_state}
+            sifs = {'subinterface': [sif_data]}
+            if_data['subinterfaces'] = sifs
+
+            if_addresses = netifaces.ifaddresses(if_name)
+
+            # MAC
+            link_addresses = if_addresses.get(netifaces.AF_LINK, list())
+            if not if_name.startswith('lo') and len(link_addresses) > 0:
+                mac_address = link_addresses[0].get('addr')
+                eth_config = {'mac-address': mac_address}
+                eth_state = copy.deepcopy(eth_config)
+                eth_state.update({'hw-mac-address': mac_address})
+                eth_data = {'config': eth_config, 'state': eth_state}
+                if_data['openconfig-if-ethernet:ethernet'] = eth_data
+
+            # IPv4
+            ipv4_addresses = if_addresses.get(netifaces.AF_INET, list())
+            oc_addrs = list()
+            for ipv4_address in ipv4_addresses:
+                address = ipv4_address['addr']
+                netmask = ipv4_address['netmask']
+                ipv4n = ipaddress.ip_network(f'{address}/{netmask}', strict=False)
+                prefix_len = ipv4n.prefixlen
+                addr_config = {'ip': address, 'prefix-length': prefix_len}
+                addr_state = copy.deepcopy(addr_config)
+                ipv4_addr_data = {'ip': address, 'config': addr_config, 'state': addr_state}
+                oc_addrs.append(ipv4_addr_data)
+            if len(oc_addrs) > 0:
+                sif_data['openconfig-if-ip:ipv4'] = {'addresses': {'address': oc_addrs}}
+
+            # IPv6
+            ipv6_addresses = if_addresses.get(netifaces.AF_INET6, list())
+            oc_addrs = list()
+            for ipv6_address in ipv6_addresses:
+                address = ipv6_address['addr']
+                netmask = ipv6_address['netmask']
+                ipv6n = ipaddress.ip_network(netmask, strict=False)
+                prefix_len = ipv6n.prefixlen
+                addr_config = {'ip': address, 'prefix-length': prefix_len}
+                addr_state = copy.deepcopy(addr_config)
+                ipv6_addr_data = {'ip': address, 'config': addr_config, 'state': addr_state}
+                oc_addrs.append(ipv6_addr_data)
+            if len(oc_addrs) > 0:
+                sif_data['openconfig-if-ip:ipv6'] = {'addresses': {'address': oc_addrs}}
+
+        return {'openconfig-interfaces:interfaces': {'interface': if_list}}, 200
+
+def register_restconf_openconfig_interfaces(api : Api):
+    api.add_resource(Interfaces, BASE_URL)
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/Root.py b/src/tests/tools/firewall_agent/firewall_agent/resources/Root.py
new file mode 100644
index 000000000..951a3c888
--- /dev/null
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/Root.py
@@ -0,0 +1,25 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 Api, Resource
+
+BASE_URL = '/restconf/data'
+
+class Root(Resource):
+    def get(self):
+        return {'restconf': {'data': {}}}, 200
+
+def register_restconf_root(api : Api):
+    api.add_resource(Root, BASE_URL)
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/__init__.py b/src/tests/tools/firewall_agent/firewall_agent/resources/__init__.py
new file mode 100644
index 000000000..3ccc21c7d
--- /dev/null
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/__init__.py
@@ -0,0 +1,14 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/tests/tools/firewall_agent/firewall_agent/resources/nft_model/ActionEnum.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/ActionEnum.py
new file mode 100644
index 000000000..6db7d15e0
--- /dev/null
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/ActionEnum.py
@@ -0,0 +1,24 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 enum
+
+class ActionEnum(enum.Enum):
+    ACCEPT = 'accept'
+    DROP   = 'drop'
+    REJECT = 'reject'
+
+def get_action_from_str(action : str) -> ActionEnum:
+    return ActionEnum._value2member_map_[action]
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py
new file mode 100644
index 000000000..53db9463f
--- /dev/null
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py
@@ -0,0 +1,94 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 dataclasses import dataclass, field
+from typing import Dict, List, Optional, Set, Tuple
+from .DirectionEnum import DirectionEnum
+from .FamilyEnum import FamilyEnum
+from .TableEnum import TableEnum
+from .Rule import Rule
+
+
+@dataclass
+class Chain:
+    family : FamilyEnum
+    table  : TableEnum
+    chain  : str
+    handle : Optional[int] = None
+    rules  : List[Rule] = field(default_factory=list)
+
+    def add_rule(self, entry : Dict) -> None:
+        self.rules.append(Rule.from_nft_entry(self.family, self.table, self.chain, entry))
+
+    def to_openconfig(self) -> Tuple[Optional[Dict], Dict]:
+        acl_set_name = f'{self.family.value}-{self.table.value}-{self.chain}'
+        acl_set_type = {
+            FamilyEnum.IPV4 : 'ACL_IPV4',
+            FamilyEnum.IPV6 : 'ACL_IPV6',
+        }.get(self.family)
+
+        acl_set_entries : List[Dict] = list()
+        interfaces : Dict[str, Dict[DirectionEnum, Set[int]]] = dict()
+
+        for sequence_id, rule in enumerate(self.rules, start=1):
+            acl_entry, rule_interfaces = rule.to_openconfig(sequence_id)
+            acl_set_entries.append(acl_entry)
+
+            for if_name, direction_sequence_ids in rule_interfaces.items():
+                interface : Dict = interfaces.setdefault(if_name, dict())
+                for direction, sequence_ids in direction_sequence_ids.items():
+                    if_dir_sequence_ids : Set = interface.setdefault(direction, set())
+                    if_dir_sequence_ids.update(sequence_ids)
+
+
+        if len(acl_set_entries) > 0:
+            acl_set = {
+                'name': acl_set_name,
+                'type': acl_set_type,
+                'config': {'name': acl_set_name, 'type': acl_set_type},
+                'state': {'name': acl_set_name, 'type': acl_set_type},
+                'acl-entries': {'acl-entry': acl_set_entries}
+            }
+        else:
+            acl_set = None
+        return acl_set, interfaces
+
+    def dump(self) -> List[Dict]:
+        chain = {'family': self.family.value, 'table': self.table.value, 'name': self.chain}
+        if self.handle is not None: chain['handle'] = self.handle
+
+        entries : List[str] = list()
+        entries.append({'chain': chain})
+        for rule in self.rules: entries.extend(rule.dump())
+        return entries
+
+    def get_commands(self, removal : bool = False) -> List[str]:
+        commands : List[Dict] = list()
+        if removal:
+            # NOTE: For now, do not remove chains. We do not process all kinds of
+            # chains and their removal might cause side effects on NFTables.
+            pass
+        else:
+            parts = [
+                'add', 'chain', self.family.value, self.table.value, self.chain,
+                '{',
+                'type', self.table.value, 'hook', self.chain, 'priority', self.table.value, ';',
+                'policy', 'accept', ';',
+                '}'
+            ]
+            commands.append(' '.join(parts))
+        for rule in self.rules:
+            commands.append(rule.get_command(removal=removal))
+        return commands
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/DirectionEnum.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/DirectionEnum.py
new file mode 100644
index 000000000..dec3813dc
--- /dev/null
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/DirectionEnum.py
@@ -0,0 +1,23 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 enum
+
+class DirectionEnum(enum.Enum):
+    INGRESS = 'ingress'
+    EGRESS  = 'egress'
+
+def get_direction_from_str(direction : str) -> DirectionEnum:
+    return DirectionEnum._value2member_map_[direction]
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Exceptions.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Exceptions.py
new file mode 100644
index 000000000..0ac157de9
--- /dev/null
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Exceptions.py
@@ -0,0 +1,89 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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, Optional
+from .FamilyEnum import FamilyEnum
+from .TableEnum import TableEnum
+
+
+class InvalidArgumentException(Exception):
+    def __init__(
+        self, family : Optional[FamilyEnum] = None, table : Optional[TableEnum] = None,
+        chain : Optional[str] = None
+    ) -> None:
+        super().__init__(
+            f'Invalid combination of parameters: '
+            f'family={str(family)} table={str(table)} chain={str(chain)}'
+        )
+
+class RuntimeException(Exception):
+    def __init__(self, rc : int, output : str, error : str) -> None:
+        super().__init__(
+            f'nft command failed: '
+            f'rc={str(rc)} output={str(output)} error={str(error)}'
+        )
+
+class MalformedOutputException(Exception):
+    def __init__(self, reason : str, command : str, output : str) -> None:
+        super().__init__(
+            f'nft command malformed output: '
+            f'reason={str(reason)} command={str(command)} output={str(output)}'
+        )
+
+class UnsupportedElementException(Exception):
+    def __init__(self, element_type : str, value : str) -> None:
+        super().__init__(
+            f'Unsupported: element_type={str(element_type)} value={str(value)}'
+        )
+
+class MissingFieldException(Exception):
+    def __init__(self, field_name : str, objekt : Dict) -> None:
+        super().__init__(
+            f'Missing Field: name={str(field_name)} object={str(objekt)}'
+        )
+
+class AlreadyExistsTableException(Exception):
+    def __init__(
+        self, family : Optional[FamilyEnum] = None, table : Optional[TableEnum] = None
+    ) -> None:
+        super().__init__(
+            f'Already Exists Table: family={str(family)} table={str(table)}'
+        )
+
+class MissingTableException(Exception):
+    def __init__(
+        self, family : Optional[FamilyEnum] = None, table : Optional[TableEnum] = None
+    ) -> None:
+        super().__init__(
+            f'Missing Table: family={str(family)} table={str(table)}'
+        )
+
+class AlreadyExistsChainException(Exception):
+    def __init__(
+        self, family : Optional[FamilyEnum] = None, table : Optional[TableEnum] = None,
+        chain : Optional[str] = None
+    ) -> None:
+        super().__init__(
+            f'Already Exists Chain: family={str(family)} table={str(table)} chain={str(chain)}'
+        )
+
+class MissingChainException(Exception):
+    def __init__(
+        self, family : Optional[FamilyEnum] = None, table : Optional[TableEnum] = None,
+        chain : Optional[str] = None
+    ) -> None:
+        super().__init__(
+            f'Missing Chain: family={str(family)} table={str(table)} chain={str(chain)}'
+        )
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/FamilyEnum.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/FamilyEnum.py
new file mode 100644
index 000000000..f0e2a933a
--- /dev/null
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/FamilyEnum.py
@@ -0,0 +1,27 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 enum
+
+class FamilyEnum(enum.Enum):
+    IPV4   = 'ip'     # IPv4 address family.
+    IPV6   = 'ip6'    # IPv6 address family.
+    INET   = 'inet'   # Internet (IPv4/IPv6) address family.
+    ARP    = 'arp'    # ARP address family, handling IPv4 ARP packets.
+    BRIDGE = 'bridge' # Bridge address family, handling packets which traverse a bridge device.
+    NETDEV = 'netdev' # Netdev address family, handling packets on ingress and egress.
+
+def get_family_from_str(family : str) -> FamilyEnum:
+    return FamilyEnum._value2member_map_[family]
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTables.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTables.py
new file mode 100644
index 000000000..a1c0b6d90
--- /dev/null
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTables.py
@@ -0,0 +1,153 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 dataclasses import dataclass, field
+from typing import Dict, List, Optional, Set, Tuple
+from .DirectionEnum import DirectionEnum
+from .Exceptions import UnsupportedElementException
+from .FamilyEnum import FamilyEnum, get_family_from_str
+from .NFTablesCommand import NFTablesCommand
+from .Table import Table
+from .TableEnum import TableEnum, get_table_from_str
+
+
+LOGGER = logging.getLogger(__name__)
+
+
+@dataclass
+class NFTables:
+    tables : Dict[Tuple[FamilyEnum, TableEnum], Table] = field(default_factory=dict)
+
+    def load(
+        self, family : Optional[FamilyEnum] = None, table : Optional[TableEnum] = None,
+        chain : Optional[str] = None
+    ) -> None:
+        entries = NFTablesCommand.list(family=family, table=table, chain=chain)
+        for entry in entries: self.parse_entry(entry)
+
+    def execute(self, removal : bool = False, verbose : bool = True) -> None:
+        commands = self.get_commands(removal=removal)
+        NFTablesCommand.execute(commands, verbose=verbose)
+
+    def get_or_create_table(self, family : FamilyEnum, table : TableEnum) -> Table:
+        return self.tables.setdefault((family, table), Table(family, table))
+
+    def parse_entry(self, entry : Dict) -> None:
+        entry_fields = set(entry.keys())
+        if len(entry_fields) != 1: raise UnsupportedElementException('entry', entry)
+        entry_type = entry_fields.pop()
+        if entry_type in {'metainfo'}:
+            return # skipping unneeded entry
+        elif entry_type in {'table'}:
+            self.parse_entry_table(entry['table'])
+        elif entry_type in {'chain'}:
+            self.parse_entry_chain(entry['chain'])
+        elif entry_type in {'rule'}:
+            self.parse_entry_rule(entry['rule'])
+        else:
+            raise UnsupportedElementException('entry', entry)
+
+    def parse_entry_table(self, entry : Dict) -> None:
+        family = get_family_from_str(entry['family'])
+        if family not in {FamilyEnum.IPV4, FamilyEnum.IPV6}: return
+        table = get_table_from_str(entry['name'])
+        if table not in {TableEnum.FILTER}: return
+        table_obj = self.get_or_create_table(family, table)
+        table_obj.handle = entry['handle']
+
+    def parse_entry_chain(self, entry : Dict) -> None:
+        family = get_family_from_str(entry.pop('family'))
+        if family not in {FamilyEnum.IPV4, FamilyEnum.IPV6}: return
+        table = get_table_from_str(entry.pop('table'))
+        if table not in {TableEnum.FILTER}: return
+        self.get_or_create_table(family, table).add_chain_by_entry(entry)
+
+    def parse_entry_rule(self, entry : Dict) -> None:
+        family = get_family_from_str(entry.pop('family'))
+        if family not in {FamilyEnum.IPV4, FamilyEnum.IPV6}: return
+        table = get_table_from_str(entry.pop('table'))
+        if table not in {TableEnum.FILTER}: return
+        self.get_or_create_table(family, table).add_rule_by_entry(entry)
+
+    def to_openconfig(self) -> List[Dict]:
+        acl_sets : List[Dict] = list()
+        interfaces_struct : Dict[str, Dict[DirectionEnum, Dict[str, Set[int]]]] = dict()
+        acl_set_name_to_type : Dict[str, str] = dict()
+
+        for table in self.tables.values():
+            table_acl_sets, table_interfaces = table.to_openconfig()
+            acl_sets.extend(table_acl_sets)
+
+            for table_acl_set in table_acl_sets:
+                acl_set_name = table_acl_set['name']
+                acl_set_type = table_acl_set['type']
+                acl_set_name_to_type[acl_set_name] = acl_set_type
+
+            for if_name, dir_aclname_seqids in table_interfaces.items():
+                interface : Dict = interfaces_struct.setdefault(if_name, dict())
+                for direction, aclname_seqids in dir_aclname_seqids.items():
+                    if_direction : Dict = interface.setdefault(direction, dict())
+                    for acl_name, sequence_ids in aclname_seqids.items():
+                        if_dir_aclname : Set[int] = if_direction.setdefault(acl_name, set())
+                        if_dir_aclname.update(sequence_ids)
+
+        interfaces = list()
+        for if_name, dir_aclname_seqids in interfaces_struct.items():
+            if_data = {
+                'id': if_name,
+                'config': {'id': if_name},
+                'state': {'id': if_name},
+                'interface-ref': {
+                    'config': {'interface': if_name, 'subinterface': 1},
+                    'state': {'interface': if_name, 'subinterface': 1},
+                }
+            }
+
+            for direction, aclname_seqids in dir_aclname_seqids.items():
+                if_dir_obj : Dict = if_data.setdefault(f'{direction.value}-acl-sets', dict())
+                if_dir_list : List = if_dir_obj.setdefault(f'{direction.value}-acl-set', list())
+
+                for acl_set_name, sequence_ids in aclname_seqids.items():
+                    acl_set_type = acl_set_name_to_type[acl_set_name]
+                    if_dir_acl_set = {
+                        'set-name': acl_set_name,
+                        'type': acl_set_type,
+                        'config': {'set-name': acl_set_name, 'type': acl_set_type},
+                        'state': {'set-name': acl_set_name, 'type': acl_set_type},
+                    }
+                    if_dir_acl_set['acl-entries'] = {'acl-entry': [
+                        {'sequence-id': sequence_id, 'state': {'sequence-id': sequence_id}}
+                        for sequence_id in sequence_ids
+                    ]}
+                    if_dir_list.append(if_dir_acl_set)
+
+            interfaces.append(if_data)
+
+        acl_data = dict()
+        if len(acl_sets) > 0: acl_data.update({'acl-sets': {'acl-set': acl_sets}})
+        if len(interfaces) > 0: acl_data.update({'interfaces': {'interface': interfaces}})
+        return {'openconfig-acl:acl': acl_data}
+
+    def dump(self) -> List[Dict]:
+        entries : List[Dict] = list()
+        for table in self.tables.values(): entries.extend(table.dump())
+        return entries
+
+    def get_commands(self, removal : bool = False) -> List[str]:
+        commands : List[Dict] = list()
+        for table in self.tables.values():
+            commands.extend(table.get_commands(removal=removal))
+        return commands
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesCommand.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesCommand.py
new file mode 100644
index 000000000..0b3170aee
--- /dev/null
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesCommand.py
@@ -0,0 +1,79 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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, nftables
+from typing import Dict, List, Optional
+from .Exceptions import (
+    InvalidArgumentException, MalformedOutputException, RuntimeException
+)
+from .FamilyEnum import FamilyEnum
+from .TableEnum import TableEnum
+
+
+LOGGER = logging.getLogger(__name__)
+
+
+class NFTablesCommand:
+    @staticmethod
+    def get_command_list(
+        family : Optional[FamilyEnum] = None, table : Optional[TableEnum] = None,
+        chain : Optional[str] = None
+    ) -> str:
+        if chain is None:
+            if table is None:
+                if family is None:
+                    return 'list ruleset'
+                else:
+                    return f'list ruleset {family.value}'
+            else:
+                if family is not None:
+                    return f'list table {family.value} {table.value}'
+        else:
+            if table is not None:
+                if family is not None:
+                    return f'list chain {family.value} {table.value} {chain}'
+
+        raise InvalidArgumentException(family, table, chain)
+
+    @staticmethod
+    def list(
+        family : Optional[FamilyEnum] = None, table : Optional[TableEnum] = None,
+        chain : Optional[str] = None
+    ) -> List[Dict]:
+        nft = nftables.Nftables()
+        nft.set_json_output(True)
+        str_cmd = NFTablesCommand.get_command_list(
+            family=family, table=table, chain=chain
+        )
+        rc, output, error = nft.cmd(str_cmd)
+        if rc != 0: raise RuntimeException(rc, output, error)
+        json_nftables = json.loads(output)
+        if 'nftables' not in json_nftables:
+            raise MalformedOutputException(
+                'Missing field "nftables"', str_cmd, output
+            )
+        return json_nftables['nftables']
+
+    @staticmethod
+    def execute(commands : List[str], verbose : bool = True) -> None:
+        nft = nftables.Nftables()
+        nft.set_json_output(True)
+        for command in commands:
+            if verbose:
+                LOGGER.info(f'Executing: {command}')
+            rc, output, error = nft.cmd(command)
+            if verbose:
+                LOGGER.info(f'rc={str(rc)} output={str(output)} error={str(error)}')
+            if rc != 0: raise RuntimeException(rc, output, error)
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesParserTools.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesParserTools.py
new file mode 100644
index 000000000..8d3476c67
--- /dev/null
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesParserTools.py
@@ -0,0 +1,77 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 ipaddress
+from typing import TYPE_CHECKING, Dict, Union
+from .Exceptions import MissingFieldException, UnsupportedElementException
+from .ProtocolEnum import get_protocol_from_str
+
+if TYPE_CHECKING:
+    from .Rule import Rule
+
+
+def parse_nft_ip_addr(right : Union[str, Dict]) -> ipaddress.IPv4Interface:
+    if isinstance(right, str):
+        address = right
+        prefix_len = 32
+    elif isinstance(right, Dict):
+        if 'prefix' not in right: raise MissingFieldException('match[ip].right.prefix', right)
+        prefix = right['prefix']
+        if 'addr' not in prefix: raise MissingFieldException('match[ip].right.prefix.addr', prefix)
+        if 'len' not in prefix: raise MissingFieldException('match[ip].right.prefix.len', prefix)
+        address = prefix['addr']
+        prefix_len = prefix['len']
+    else:
+        raise UnsupportedElementException('match[ip].right', right)
+    return ipaddress.IPv4Interface(f'{address}/{str(prefix_len)}')
+
+
+def parse_nft_match(rule : 'Rule', match : Dict) -> None:
+    if 'op' not in match: raise MissingFieldException('rule.expr.match.op', match)
+    if 'left' not in match: raise MissingFieldException('rule.expr.match.left', match)
+    if 'right' not in match: raise MissingFieldException('rule.expr.match.right', match)
+    if match['op'] != '==': raise UnsupportedElementException('rule.expr.match.op', match)
+
+    match_left = match['left']
+    match_right = match['right']
+    if 'meta' in match_left and 'key' in match_left['meta']:
+        meta_key = match_left['meta']['key']
+        if 'iifname' in meta_key:
+            rule.input_if_name = match_right
+        elif 'oifname' in meta_key:
+            rule.output_if_name = match_right
+        else:
+            raise UnsupportedElementException('rule.expr.match', match)
+    elif 'payload' in match_left:
+        payload = match_left['payload']
+        if 'protocol' in payload and 'field' in payload:
+            protocol = payload['protocol']
+            field_name = payload['field']
+            if protocol == 'ip' and field_name == 'saddr':
+                rule.src_ip_addr = parse_nft_ip_addr(match_right)
+            elif protocol == 'ip' and field_name == 'daddr':
+                rule.dst_ip_addr = parse_nft_ip_addr(match_right)
+            elif protocol in {'tcp', 'udp'} and field_name == 'sport':
+                rule.ip_protocol = get_protocol_from_str(protocol)
+                rule.src_port = match_right
+            elif protocol in {'tcp', 'udp'} and field_name == 'dport':
+                rule.ip_protocol = get_protocol_from_str(protocol)
+                rule.dst_port = match_right
+            else:
+                raise UnsupportedElementException('rule.expr.match', match)
+        else:
+            raise UnsupportedElementException('rule.expr.match', match)
+    else:
+        raise UnsupportedElementException('rule.expr.match', match)
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/ProtocolEnum.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/ProtocolEnum.py
new file mode 100644
index 000000000..c54ed6365
--- /dev/null
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/ProtocolEnum.py
@@ -0,0 +1,24 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 enum
+
+class ProtocolEnum(enum.Enum):
+    TCP  = 'tcp'
+    UDP  = 'udp'
+    ICMP = 'icmp'
+
+def get_protocol_from_str(protocol : str) -> ProtocolEnum:
+    return ProtocolEnum._value2member_map_[protocol]
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py
new file mode 100644
index 000000000..301dc1346
--- /dev/null
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py
@@ -0,0 +1,201 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 copy, ipaddress, logging
+from dataclasses import asdict, dataclass
+from typing import Dict, List, Optional, Set, Tuple
+from .ActionEnum import ActionEnum, get_action_from_str
+from .DirectionEnum import DirectionEnum
+from .Exceptions import MissingFieldException, UnsupportedElementException
+from .FamilyEnum import FamilyEnum
+from .NFTablesParserTools import parse_nft_match
+from .ProtocolEnum import ProtocolEnum
+from .TableEnum import TableEnum
+
+
+LOGGER = logging.getLogger(__name__)
+
+
+@dataclass
+class Rule:
+    family         : FamilyEnum
+    table          : TableEnum
+    chain          : str
+    handle         : Optional[int] = None
+
+    input_if_name  : Optional[str] = None
+    output_if_name : Optional[str] = None
+    src_ip_addr    : Optional[ipaddress.IPv4Interface] = None
+    dst_ip_addr    : Optional[ipaddress.IPv4Interface] = None
+    ip_protocol    : Optional[ProtocolEnum] = None
+    src_port       : Optional[int] = None
+    dst_port       : Optional[int] = None
+
+    action         : Optional[ActionEnum] = None
+
+    comment        : Optional[str] = None
+
+    @classmethod
+    def from_nft_entry(
+        cls, family : FamilyEnum, table : TableEnum, chain : str, entry : Dict
+    ) -> 'Rule':
+        print(entry)
+        rule : 'Rule' = cls(family, table, chain)
+
+        if 'expr' not in entry: raise MissingFieldException('rule.expr', entry)
+        expr_list : List[Dict] = entry.pop('expr')
+        for expr_entry in expr_list:
+            expr_entry_fields = set(expr_entry.keys())
+            expr_entry_type = expr_entry_fields.pop()
+            if expr_entry_type == 'match':
+                match = expr_entry['match']
+                parse_nft_match(rule, match)
+            elif expr_entry_type in {'accept', 'drop', 'reject'}:
+                rule.action = get_action_from_str(expr_entry_type)
+            else:
+                raise UnsupportedElementException('expr_entry', expr_entry)
+
+        rule.comment = entry.pop('comment', None)
+        rule.handle = entry['handle']
+        return rule
+
+    def to_openconfig(self, sequence_id : int) -> Tuple[Dict, Dict]:
+        acl_entry_config = {'sequence-id': sequence_id}
+        if self.comment is not None: acl_entry_config['description'] = self.comment
+
+        acl_entry = {
+            'sequence-id': sequence_id,
+            'config': acl_entry_config,
+            'state': copy.deepcopy(acl_entry_config),
+        }
+
+        ip_version = {
+            FamilyEnum.IPV4: 'ipv4',
+            FamilyEnum.IPV6: 'ipv6',
+        }.get(self.family)
+
+        ip_protocol = {
+            ProtocolEnum.TCP  : 'IP_TCP',
+            ProtocolEnum.UDP  : 'IP_UDP',
+            ProtocolEnum.ICMP : 'IP_ICMP',
+        }.get(self.ip_protocol, None)
+
+        if self.src_ip_addr is not None:
+            acl_entry_ipvx = acl_entry.setdefault(ip_version, dict())
+            acl_entry_ipvx_config = acl_entry_ipvx.setdefault('config', dict())
+            acl_entry_ipvx_config['source-address'] = str(self.src_ip_addr.network)
+            acl_entry_ipvx_state = acl_entry_ipvx.setdefault('state', dict())
+            acl_entry_ipvx_state['source-address'] = str(self.src_ip_addr.network)
+
+        if self.dst_ip_addr is not None:
+            acl_entry_ipvx = acl_entry.setdefault(ip_version, dict())
+            acl_entry_ipvx_config = acl_entry_ipvx.setdefault('config', dict())
+            acl_entry_ipvx_config['destination-address'] = str(self.dst_ip_addr.network)
+            acl_entry_ipvx_state = acl_entry_ipvx.setdefault('state', dict())
+            acl_entry_ipvx_state['destination-address'] = str(self.dst_ip_addr.network)
+
+        if ip_protocol is not None:
+            acl_entry_ipvx = acl_entry.setdefault(ip_version, dict())
+            acl_entry_ipvx_config = acl_entry_ipvx.setdefault('config', dict())
+            acl_entry_ipvx_config['protocol'] = ip_protocol
+            acl_entry_ipvx_state = acl_entry_ipvx.setdefault('state', dict())
+            acl_entry_ipvx_state['protocol'] = ip_protocol
+
+        if self.src_port is not None:
+            acl_entry_trans = acl_entry.setdefault('transport', dict())
+            acl_entry_trans_config = acl_entry_trans.setdefault('config', dict())
+            acl_entry_trans_config['source-port'] = self.src_port
+            acl_entry_trans_state = acl_entry_trans.setdefault('state', dict())
+            acl_entry_trans_state['source-port'] = self.src_port
+
+        if self.dst_port is not None:
+            acl_entry_trans = acl_entry.setdefault('transport', dict())
+            acl_entry_trans_config = acl_entry_trans.setdefault('config', dict())
+            acl_entry_trans_config['destination-port'] = self.dst_port
+            acl_entry_trans_state = acl_entry_trans.setdefault('state', dict())
+            acl_entry_trans_state['destination-port'] = self.dst_port
+
+        if self.action is not None:
+            acl_forwarding_action = {
+                ActionEnum.ACCEPT : 'ACCEPT',
+                ActionEnum.DROP   : 'DROP',
+                ActionEnum.REJECT : 'REJECT',
+            }.get(self.action)
+            acl_action = {'forwarding-action': acl_forwarding_action}
+            acl_entry['actions'] = {'config': acl_action, 'state': acl_action}
+
+        interfaces : Dict[str, Dict[DirectionEnum, Set[int]]] = dict()
+
+        if self.input_if_name is not None:
+            interface : Dict = interfaces.setdefault(self.input_if_name, dict())
+            direction : Set = interface.setdefault(DirectionEnum.INGRESS, set())
+            direction.add(sequence_id)
+
+        if self.output_if_name is not None:
+            interface : Dict = interfaces.setdefault(self.output_if_name, dict())
+            direction : Set = interface.setdefault(DirectionEnum.EGRESS, set())
+            direction.add(sequence_id)
+
+        return acl_entry, interfaces
+
+
+    def dump(self) -> List[Dict]:
+        rule = {'family': self.family.value, 'table': self.table.value, 'chain': self.chain}
+        expr = list()
+        if self.input_if_name is not None:
+            match_left = {'meta': {'key': 'iifname'}}
+            expr.append({'match': {'op': '==', 'left': match_left, 'right': self.input_if_name}})
+        if self.output_if_name is not None:
+            match_left = {'meta': {'key': 'oifname'}}
+            expr.append({'match': {'op': '==', 'left': match_left, 'right': self.output_if_name}})
+        if self.src_ip_addr is not None:
+            match_left = {'payload': {'protocol': 'ip', 'field': 'saddr'}}
+            match_right = {'prefix': {'addr': str(self.src_ip_addr.ip), 'len': self.src_ip_addr.network.prefixlen}}
+            expr.append({'match': {'op': '==', 'left': match_left, 'right': match_right}})
+        if self.dst_ip_addr is not None:
+            match_left = {'payload': {'protocol': 'ip', 'field': 'daddr'}}
+            match_right = {'prefix': {'addr': str(self.dst_ip_addr.ip), 'len': self.dst_ip_addr.network.prefixlen}}
+            expr.append({'match': {'op': '==', 'left': match_left, 'right': match_right}})
+        if self.src_port is not None:
+            match_left = {'payload': {'protocol': self.ip_protocol.value, 'field': 'sport'}}
+            expr.append({'match': {'op': '==', 'left': match_left, 'right': self.src_port}})
+        if self.dst_port is not None:
+            match_left = {'payload': {'protocol': self.ip_protocol.value, 'field': 'dport'}}
+            expr.append({'match': {'op': '==', 'left': match_left, 'right': self.dst_port}})
+        if self.action is not None: expr.append({self.action.value : None})
+        if len(expr) > 0: rule['expr'] = expr
+        if self.comment is not None: rule['comment'] = self.comment
+        if self.handle is not None: rule['handle'] = self.handle
+        return [{'rule': rule}]
+
+    def get_command(self, removal : bool = False) -> str:
+        if removal:
+            if self.handle is None: raise MissingFieldException('handle', asdict(self))
+            parts = [
+                'delete', 'rule',  # Ideally destroy (fail silently if not exist), but seems not supported.
+                self.family.value, self.table.value, self.chain,
+                'handle', str(self.handle)
+            ]
+        else:
+            parts = ['add', 'rule', self.family.value, self.table.value, self.chain]
+            if self.input_if_name is not None: parts.extend(['iifname', self.input_if_name])
+            if self.output_if_name is not None: parts.extend(['oifname', self.output_if_name])
+            if self.src_ip_addr is not None: parts.extend(['ip', 'saddr', str(self.src_ip_addr)])
+            if self.dst_ip_addr is not None: parts.extend(['ip', 'daddr', str(self.dst_ip_addr)])
+            if self.src_port is not None: parts.extend([self.ip_protocol.value, 'sport', str(self.src_port)])
+            if self.dst_port is not None: parts.extend([self.ip_protocol.value, 'dport', str(self.dst_port)])
+            if self.action is not None: parts.append(self.action.value)
+            if self.comment is not None: parts.extend(['comment', f'"{self.comment}"'])
+        return ' '.join(parts)
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py
new file mode 100644
index 000000000..2d2b07884
--- /dev/null
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py
@@ -0,0 +1,86 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 dataclasses import dataclass, field
+from typing import Dict, List, Optional, Set, Tuple
+from .Chain import Chain
+from .DirectionEnum import DirectionEnum
+from .FamilyEnum import FamilyEnum
+from .TableEnum import TableEnum
+
+
+@dataclass
+class Table:
+    family : FamilyEnum
+    table  : TableEnum
+    handle : Optional[int] = None
+    chains : Dict[str, Chain] = field(default_factory=dict)
+
+    def get_or_create_chain(self, name : str) -> Chain:
+        return self.chains.setdefault(name, Chain(self.family, self.table, name))
+
+    def add_chain_by_entry(self, entry : Dict) -> Chain:
+        name : str = entry.pop('name')
+        if name.lower() not in {'input', 'output'}: return None
+        chain_obj = self.get_or_create_chain(name)
+        chain_obj.handle = entry['handle']
+        return chain_obj
+
+    def add_rule_by_entry(self, entry : Dict) -> None:
+        chain : str = entry.pop('chain')
+        if chain.lower() not in {'input', 'output'}: return
+        self.get_or_create_chain(chain).add_rule(entry)
+
+    def to_openconfig(self) -> Tuple[List[Dict], Dict]:
+        acl_sets : List[Dict] = list()
+        interfaces : Dict[str, Dict[DirectionEnum, Dict[str, Set[int]]]] = dict()
+
+        for chain in self.chains.values():
+            chain_acl_set, chain_interfaces = chain.to_openconfig()
+            if chain_acl_set is None: continue
+
+            acl_sets.append(chain_acl_set)
+
+            acl_set_name = chain_acl_set['name']
+            for if_name, direction_sequence_ids in chain_interfaces.items():
+                interface : Dict = interfaces.setdefault(if_name, dict())
+                for direction, sequence_ids in direction_sequence_ids.items():
+                    if_direction : Dict = interface.setdefault(direction, dict())
+                    if_dir_aclname : Set[int] = if_direction.setdefault(acl_set_name, set())
+                    if_dir_aclname.update(sequence_ids)
+
+        return acl_sets, interfaces
+
+    def dump(self) -> List[Dict]:
+        table = {'family': self.family.value, 'name': self.table.value}
+        if self.handle is not None: table['handle'] = self.handle
+
+        entries : List[str] = list()
+        entries.append({'table': table})
+        for chain in self.chains.values(): entries.extend(chain.dump())
+        return entries
+
+    def get_commands(self, removal : bool = False) -> List[str]:
+        commands : List[Dict] = list()
+        if removal:
+            # NOTE: For now, do not remove tables. We do not process all kinds of
+            # tables and their removal might cause side effects on NFTables.
+            pass
+        else:
+            parts = ['add', 'table', self.family.value, self.table.value]
+            commands.append(' '.join(parts))
+        for chain in self.chains.values():
+            commands.extend(chain.get_commands(removal=removal))
+        return commands
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/TableEnum.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/TableEnum.py
new file mode 100644
index 000000000..fa8658d24
--- /dev/null
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/TableEnum.py
@@ -0,0 +1,24 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 enum
+
+class TableEnum(enum.Enum):
+    FILTER = 'filter'
+    NAT    = 'nat'
+    ROUTE  = 'route'
+
+def get_table_from_str(table : str) -> TableEnum:
+    return TableEnum._value2member_map_[table]
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/__init__.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/__init__.py
new file mode 100644
index 000000000..3ccc21c7d
--- /dev/null
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/__init__.py
@@ -0,0 +1,14 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/tests/tools/firewall_agent/firewall_agent/resources/nft_model/__main__.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/__main__.py
new file mode 100644
index 000000000..dc838bd26
--- /dev/null
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/__main__.py
@@ -0,0 +1,31 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 .FamilyEnum import FamilyEnum
+from .NFTables import NFTables
+from .TableEnum import TableEnum
+
+def main():
+    nft = NFTables()
+    nft.load(FamilyEnum.IPV4, TableEnum.FILTER)
+
+    entries = nft.dump()
+    for entry in entries:
+        print(entry)
+    
+    print(nft.to_openconfig())
+
+if __name__ == '__main__':
+    main()
diff --git a/src/tests/tools/firewall_agent/redeploy.sh b/src/tests/tools/firewall_agent/redeploy.sh
new file mode 100755
index 000000000..62dada77b
--- /dev/null
+++ b/src/tests/tools/firewall_agent/redeploy.sh
@@ -0,0 +1,25 @@
+#!/usr/bin/env bash
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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.
+
+
+set -euo pipefail
+
+docker stop firewall-agent || true
+docker rm firewall-agent || true
+
+docker build --tag "firewall-agent:dev" .
+docker run --detach --name firewall-agent --cap-add=NET_ADMIN --network host --publish 8888:8888 firewall-agent:dev
+
+docker logs --follow firewall-agent
diff --git a/src/tests/tools/firewall_agent/requirements.txt b/src/tests/tools/firewall_agent/requirements.txt
new file mode 100644
index 000000000..af4fe3e7c
--- /dev/null
+++ b/src/tests/tools/firewall_agent/requirements.txt
@@ -0,0 +1,21 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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.
+
+
+flask-restful>=0.3.9
+Flask>=2.0
+netifaces>=0.11
+pip-nftables==1.0.2.post1
+pytest>=7.0
+requests>=2.0
diff --git a/src/tests/tools/firewall_agent/scripts/data/oc_acl_block_8001.json b/src/tests/tools/firewall_agent/scripts/data/oc_acl_block_8001.json
new file mode 100644
index 000000000..70efb0d4b
--- /dev/null
+++ b/src/tests/tools/firewall_agent/scripts/data/oc_acl_block_8001.json
@@ -0,0 +1,27 @@
+{"openconfig-acl:acl": {
+    "acl-sets": {"acl-set": [{
+        "name": "ip-filter-input", "type": "ACL_IPV4",
+        "config": {"name": "ip-filter-input", "type": "ACL_IPV4"},
+        "acl-entries": {"acl-entry": [
+            {
+                "sequence-id": 1,
+                "config": {"sequence-id": 1, "description": "drop-8001-host"},
+                "ipv4": {"config": {"source-address": "127.0.0.1/32", "protocol": "IP_TCP"}},
+                "transport": {"config": {"destination-port": 8001}},
+                "actions": {"config": {"forwarding-action": "DROP"}}
+            }
+        ]}
+    }]},
+    "interfaces": {"interface": [{
+        "id": "lo",
+        "config": {"id": "lo"},
+        "interface-ref": {"config": {"interface": "lo", "subinterface": 1}},
+        "ingress-acl-sets": {"ingress-acl-set": [
+            {
+                "set-name": "ip-filter-input", "type": "ACL_IPV4",
+                "config": {"set-name": "ip-filter-input", "type": "ACL_IPV4"},
+                "acl-entries": {"acl-entry": [{"sequence-id": 1}]}
+            }
+        ]}
+    }]}
+}}
diff --git a/src/tests/tools/firewall_agent/scripts/data/oc_acl_block_8002.json b/src/tests/tools/firewall_agent/scripts/data/oc_acl_block_8002.json
new file mode 100644
index 000000000..2d20df7b2
--- /dev/null
+++ b/src/tests/tools/firewall_agent/scripts/data/oc_acl_block_8002.json
@@ -0,0 +1,27 @@
+{"openconfig-acl:acl": {
+    "acl-sets": {"acl-set": [{
+        "name": "ip-filter-input", "type": "ACL_IPV4",
+        "config": {"name": "ip-filter-input", "type": "ACL_IPV4"},
+        "acl-entries": {"acl-entry": [
+            {
+                "sequence-id": 1,
+                "config": {"sequence-id": 1, "description": "drop-8002-ext"},
+                "ipv4": {"config": {"source-address": "10.0.2.1/32", "protocol": "IP_TCP"}},
+                "transport": {"config": {"destination-port": 8002}},
+                "actions": {"config": {"forwarding-action": "DROP"}}
+            }
+        ]}
+    }]},
+    "interfaces": {"interface": [{
+        "id": "enp0s3",
+        "config": {"id": "enp0s3"},
+        "interface-ref": {"config": {"interface": "enp0s3", "subinterface": 1}},
+        "ingress-acl-sets": {"ingress-acl-set": [
+            {
+                "set-name": "ip-filter-input", "type": "ACL_IPV4",
+                "config": {"set-name": "ip-filter-input", "type": "ACL_IPV4"},
+                "acl-entries": {"acl-entry": [{"sequence-id": 1}]}
+            }
+        ]}
+    }]}
+}}
diff --git a/src/tests/tools/firewall_agent/scripts/data/oc_acl_multi_rule.json b/src/tests/tools/firewall_agent/scripts/data/oc_acl_multi_rule.json
new file mode 100644
index 000000000..55f41c033
--- /dev/null
+++ b/src/tests/tools/firewall_agent/scripts/data/oc_acl_multi_rule.json
@@ -0,0 +1,39 @@
+{"openconfig-acl:acl": {
+    "acl-sets": {"acl-set": [{
+        "name": "ip-filter-input", "type": "ACL_IPV4",
+        "config": {"name": "ip-filter-input", "type": "ACL_IPV4"},
+        "acl-entries": {"acl-entry": [
+            {
+                "sequence-id": 1,
+                "config": {"sequence-id": 1, "description": "drop-8001-host"},
+                "ipv4": {"config": {"source-address": "10.0.2.10/32", "protocol": "IP_TCP"}},
+                "transport": {"config": {"destination-port": 8001}},
+                "actions": {"config": {"forwarding-action": "DROP"}}
+            },
+            {
+                "sequence-id": 2,
+                "config": {"sequence-id": 2, "description": "drop-8002-ext"},
+                "ipv4": {"config": {"source-address": "10.0.2.1/32", "protocol": "IP_TCP"}},
+                "transport": {"config": {"destination-port": 8002}},
+                "actions": {"config": {"forwarding-action": "DROP"}}
+            }
+        ]}
+    }]},
+    "interfaces": {"interface": [{
+        "id": "enp0s3",
+        "config": {"id": "enp0s3"},
+        "interface-ref": {"config": {"interface": "enp0s3", "subinterface": 1}},
+        "ingress-acl-sets": {"ingress-acl-set": [
+            {
+                "set-name": "ip-filter-input", "type": "ACL_IPV4",
+                "config": {"set-name": "ip-filter-input", "type": "ACL_IPV4"},
+                "acl-entries": {"acl-entry": [{"sequence-id": 1}]}
+            },
+            {
+                "set-name": "ip-filter-input", "type": "ACL_IPV4",
+                "config": {"set-name": "ip-filter-input", "type": "ACL_IPV4"},
+                "acl-entries": {"acl-entry": [{"sequence-id": 2}]}
+            }
+        ]}
+    }]}
+}}
diff --git a/src/tests/tools/firewall_agent/scripts/run_nft_model.sh b/src/tests/tools/firewall_agent/scripts/run_nft_model.sh
new file mode 100755
index 000000000..d57ad29f9
--- /dev/null
+++ b/src/tests/tools/firewall_agent/scripts/run_nft_model.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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.
+
+
+sudo true
+sudo -E "$(which python)" -m firewall_agent.nft_model
diff --git a/src/tests/tools/firewall_agent/scripts/test_commands.sh b/src/tests/tools/firewall_agent/scripts/test_commands.sh
new file mode 100755
index 000000000..25438b2d5
--- /dev/null
+++ b/src/tests/tools/firewall_agent/scripts/test_commands.sh
@@ -0,0 +1,32 @@
+#!/bin/bash
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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.
+
+
+curl http://172.17.0.1:8888/restconf/data/openconfig-platform:components
+curl http://172.17.0.1:8888/restconf/data/openconfig-interfaces:interfaces
+curl http://172.17.0.1:8888/restconf/data/openconfig-acl:acl
+
+wget -q -O- http://localhost:8001
+wget -q -O- http://localhost:8002
+
+curl -X POST -d @scripts/data/oc_acl_block_8001.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl
+curl -X POST -d @scripts/data/oc_acl_block_8002.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl
+curl -X POST -d @scripts/data/oc_acl_multi_rule.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl
+
+wget -q -O- http://localhost:8001
+wget -q -O- http://localhost:8002
+
+curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=drop-8001-host
+curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=drop-8002-ext
-- 
GitLab


From 332d0fb3733db4176d367c7b243391397311e9fa Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 4 Nov 2025 14:57:40 +0000
Subject: [PATCH 044/111] Pre-merge code cleanup

---
 src/pluggables/Dockerfile                     | 10 +--
 .../tests/PreparePluggablesTestScenario.py    | 35 +++++------
 ...{test_Pluggables.py => test_pluggables.py} | 63 ++++++++++---------
 .../tests/test_pluggables_with_SBI.py         |  1 -
 4 files changed, 54 insertions(+), 55 deletions(-)
 rename src/pluggables/tests/{test_Pluggables.py => test_pluggables.py} (81%)

diff --git a/src/pluggables/Dockerfile b/src/pluggables/Dockerfile
index 22c1c92ae..264562a43 100644
--- a/src/pluggables/Dockerfile
+++ b/src/pluggables/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/dscm
-WORKDIR /var/teraflow/dscm
-COPY src/dscm/requirements.in requirements.in
+RUN mkdir -p /var/teraflow/pluggables
+WORKDIR /var/teraflow/pluggables
+COPY src/pluggables/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/dscm/. dscm/
+COPY src/pluggables/. pluggables/
 
 # # Start the service
-ENTRYPOINT [ "python", "-m", "dscm.service" ]
+ENTRYPOINT [ "python", "-m", "pluggables.service" ]
diff --git a/src/pluggables/tests/PreparePluggablesTestScenario.py b/src/pluggables/tests/PreparePluggablesTestScenario.py
index c6fdd62fd..e70b2975a 100644
--- a/src/pluggables/tests/PreparePluggablesTestScenario.py
+++ b/src/pluggables/tests/PreparePluggablesTestScenario.py
@@ -12,14 +12,14 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import copy, logging, os, pytest
+import logging, os, pytest
 from typing import Union
 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
 )
-from common.proto.context_pb2 import Device, DeviceId, Topology, Context
+from common.proto.context_pb2 import DeviceId, Topology, Context
 from common.tools.service.GenericGrpcService import GenericGrpcService
 from common.tests.MockServicerImpl_Context import MockServicerImpl_Context
 from common.proto.context_pb2_grpc import add_ContextServiceServicer_to_server
@@ -37,7 +37,7 @@ from pluggables.tests.CommonObjects import (
     CONTEXT_ID, CONTEXT, TOPOLOGY_ID, TOPOLOGY,
     get_device_hub_with_connect_rules, get_device_leaf_with_connect_rules
 )
-from common.tools.object_factory.Topology import json_topology
+
 
 LOGGER = logging.getLogger(__name__)
 
@@ -47,22 +47,22 @@ MOCKSERVICE_PORT = 10000
 # Configure service endpoints
 CONTEXT_SERVICE_PORT = MOCKSERVICE_PORT + get_service_port_grpc(ServiceNameEnum.CONTEXT)
 DEVICE_SERVICE_PORT = MOCKSERVICE_PORT + get_service_port_grpc(ServiceNameEnum.DEVICE)
-DSCMPLUGGABLE_SERVICE_PORT = get_service_port_grpc(ServiceNameEnum.PLUGGABLES)
+PLUGGABLE_SERVICE_PORT = get_service_port_grpc(ServiceNameEnum.PLUGGABLES)
 
-os.environ[get_env_var_name(ServiceNameEnum.CONTEXT, ENVVAR_SUFIX_SERVICE_HOST)]            = str(LOCAL_HOST)
-os.environ[get_env_var_name(ServiceNameEnum.CONTEXT, ENVVAR_SUFIX_SERVICE_PORT_GRPC)]       = str(CONTEXT_SERVICE_PORT)
-os.environ[get_env_var_name(ServiceNameEnum.DEVICE, ENVVAR_SUFIX_SERVICE_HOST)]             = str(LOCAL_HOST)
-os.environ[get_env_var_name(ServiceNameEnum.DEVICE, ENVVAR_SUFIX_SERVICE_PORT_GRPC)]        = str(DEVICE_SERVICE_PORT)
+os.environ[get_env_var_name(ServiceNameEnum.CONTEXT, ENVVAR_SUFIX_SERVICE_HOST)]         = str(LOCAL_HOST)
+os.environ[get_env_var_name(ServiceNameEnum.CONTEXT, ENVVAR_SUFIX_SERVICE_PORT_GRPC)]    = str(CONTEXT_SERVICE_PORT)
+os.environ[get_env_var_name(ServiceNameEnum.DEVICE, ENVVAR_SUFIX_SERVICE_HOST)]          = str(LOCAL_HOST)
+os.environ[get_env_var_name(ServiceNameEnum.DEVICE, ENVVAR_SUFIX_SERVICE_PORT_GRPC)]     = str(DEVICE_SERVICE_PORT)
 os.environ[get_env_var_name(ServiceNameEnum.PLUGGABLES, ENVVAR_SUFIX_SERVICE_HOST)]      = str(LOCAL_HOST)
-os.environ[get_env_var_name(ServiceNameEnum.PLUGGABLES, ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(DSCMPLUGGABLE_SERVICE_PORT)
+os.environ[get_env_var_name(ServiceNameEnum.PLUGGABLES, ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(PLUGGABLE_SERVICE_PORT)
 
 
 class MockContextService(GenericGrpcService):
     """Mock Context Service for testing"""
-    
+
     def __init__(self, bind_port: Union[str, int]) -> None:
         super().__init__(bind_port, LOCAL_HOST, enable_health_servicer=False, cls_name='MockContextService')
-    
+
     def install_servicers(self):
         self.context_servicer = MockServicerImpl_Context()
         add_ContextServiceServicer_to_server(self.context_servicer, self.server)
@@ -139,32 +139,31 @@ def test_prepare_environment(
     pluggables_client: PluggablesClient, 
     device_service: DeviceService ):  # pylint: disable=redefined-outer-name
     """Prepare test environment by adding devices to Context"""
-    
+
     LOGGER.info('Preparing test environment...')
 
-    
+
     context_client.SetContext(Context(**CONTEXT))
     context_client.SetTopology(Topology(**TOPOLOGY))
     LOGGER.info('Created admin Context and Topology')
-    
+
     # Add Hub device with connect rules
     hub_device = get_device_hub_with_connect_rules()
     context_client.SetDevice(hub_device)
     LOGGER.info(f'Added Hub device: {DEVICE_HUB_UUID}')
-    
+
     # Add Leaf device with connect rules
     leaf_device = get_device_leaf_with_connect_rules()
     context_client.SetDevice(leaf_device)
     LOGGER.info(f'Added Leaf device: {DEVICE_LEAF_UUID}')
-    
+
     # Verify devices were added
     hub_device_retrieved = context_client.GetDevice(DeviceId(**DEVICE_HUB_ID))
     assert hub_device_retrieved is not None
     assert hub_device_retrieved.device_id.device_uuid.uuid == DEVICE_HUB_UUID
     LOGGER.info(f'Verified Hub device: {hub_device_retrieved.name}')
-    
+
     leaf_device_retrieved = context_client.GetDevice(DeviceId(**DEVICE_LEAF_ID))
     assert leaf_device_retrieved is not None
     assert leaf_device_retrieved.device_id.device_uuid.uuid == DEVICE_LEAF_UUID
     LOGGER.info(f'Verified Leaf device: {leaf_device_retrieved.name}')
-
diff --git a/src/pluggables/tests/test_Pluggables.py b/src/pluggables/tests/test_pluggables.py
similarity index 81%
rename from src/pluggables/tests/test_Pluggables.py
rename to src/pluggables/tests/test_pluggables.py
index 8528c4330..9bce8c92c 100644
--- a/src/pluggables/tests/test_Pluggables.py
+++ b/src/pluggables/tests/test_pluggables.py
@@ -25,16 +25,17 @@ from common.Settings import (
     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.pluggables_pb2 import (PluggableId, Pluggable, 
-    CreatePluggableRequest, ListPluggablesRequest, ListPluggablesResponse, View)
+from common.proto.pluggables_pb2 import (
+    PluggableId, Pluggable, ListPluggablesResponse, View
+)
 from common.tools.service.GenericGrpcService import GenericGrpcService
-
 from pluggables.client.PluggablesClient import PluggablesClient
 from pluggables.service.PluggablesService import PluggablesService
-from pluggables.tests.testmessages import (create_pluggable_request,
-    create_list_pluggables_request,  create_get_pluggable_request,
-    create_delete_pluggable_request, create_configure_pluggable_request)
+from pluggables.tests.testmessages import (
+    create_pluggable_request, create_list_pluggables_request,
+    create_get_pluggable_request, create_delete_pluggable_request,
+    create_configure_pluggable_request,
+)
 
 
 ###########################
@@ -63,21 +64,21 @@ class MockContextService(GenericGrpcService):
 # This fixture will be requested by test cases and last during testing session
 @pytest.fixture(scope='session')
 def pluggables_service():
-    LOGGER.info('Initializing DscmPluggableService...')
+    LOGGER.info('Initializing PluggableService...')
     _service = PluggablesService()
     _service.start()
 
     # yield the server, when test finishes, execution will resume to stop it
-    LOGGER.info('Yielding DscmPluggableService...')
+    LOGGER.info('Yielding PluggableService...')
     yield _service
 
-    LOGGER.info('Terminating DscmPluggableService...')
+    LOGGER.info('Terminating PluggableService...')
     _service.stop()
 
-    LOGGER.info('Terminated DscmPluggableService...')
+    LOGGER.info('Terminated PluggableService...')
 
 @pytest.fixture(scope='function')
-def dscm_pluggable_client(pluggables_service : PluggablesService):
+def pluggable_client(pluggables_service : PluggablesService):
     LOGGER.info('Creating PluggablesClient...')
     _client = PluggablesClient()
 
@@ -104,10 +105,10 @@ def log_all_methods(request):
 ###########################
 
 # CreatePluggable Test without configuration
-def test_CreatePluggable(dscm_pluggable_client : PluggablesClient):
+def test_CreatePluggable(pluggable_client : PluggablesClient):
     LOGGER.info('Creating Pluggable for test...')
     _pluggable_request = create_pluggable_request(preferred_pluggable_index=-1)
-    _pluggable         = dscm_pluggable_client.CreatePluggable(_pluggable_request)
+    _pluggable         = pluggable_client.CreatePluggable(_pluggable_request)
     LOGGER.info('Created Pluggable for test: %s', _pluggable)
     assert isinstance(_pluggable, Pluggable)
     assert _pluggable.id.pluggable_index         == _pluggable_request.preferred_pluggable_index
@@ -115,13 +116,13 @@ def test_CreatePluggable(dscm_pluggable_client : PluggablesClient):
 
 
 # CreatePluggable Test with configuration
-def test_CreatePluggable_with_config(dscm_pluggable_client : PluggablesClient):
+def test_CreatePluggable_with_config(pluggable_client : PluggablesClient):
     LOGGER.info('Creating Pluggable with initial configuration for test...')
     _pluggable_request = create_pluggable_request(
                             device_uuid               = "9bbf1937-db9e-45bc-b2c6-3214a9d42157",
                             preferred_pluggable_index = -1,
                             with_initial_config       = True)
-    _pluggable         = dscm_pluggable_client.CreatePluggable(_pluggable_request)
+    _pluggable         = pluggable_client.CreatePluggable(_pluggable_request)
     LOGGER.info('Created Pluggable with initial configuration for test: %s', _pluggable)
     assert isinstance(_pluggable, Pluggable)
     assert _pluggable.id.pluggable_index         == _pluggable_request.preferred_pluggable_index
@@ -133,26 +134,26 @@ def test_CreatePluggable_with_config(dscm_pluggable_client : PluggablesClient):
     assert len(dsc_group.subcarriers) == 2
 
 # create pluggable request with pluggable key already exists error
-def test_CreatePluggable_already_exists(dscm_pluggable_client : PluggablesClient):
+def test_CreatePluggable_already_exists(pluggable_client : PluggablesClient):
     LOGGER.info('Creating Pluggable for test...')
     _pluggable_request = create_pluggable_request(preferred_pluggable_index=5)
-    _pluggable         = dscm_pluggable_client.CreatePluggable(_pluggable_request)
+    _pluggable         = pluggable_client.CreatePluggable(_pluggable_request)
     LOGGER.info('Created Pluggable for test: %s', _pluggable)
     assert isinstance(_pluggable, Pluggable)
     assert _pluggable.id.pluggable_index         == _pluggable_request.preferred_pluggable_index
     assert _pluggable.id.device.device_uuid.uuid == _pluggable_request.device.device_uuid.uuid
     # Try to create the same pluggable again, should raise ALREADY_EXISTS
     with pytest.raises(grpc.RpcError) as e:
-        dscm_pluggable_client.CreatePluggable(_pluggable_request)
+        pluggable_client.CreatePluggable(_pluggable_request)
     assert e.value.code() == grpc.StatusCode.ALREADY_EXISTS
 
 # ListPluggables Test
-def test_ListPluggables(dscm_pluggable_client : PluggablesClient):
+def test_ListPluggables(pluggable_client : PluggablesClient):
     LOGGER.info('Listing Pluggables for test...')
     _list_request = create_list_pluggables_request(
                         view_level = View.VIEW_CONFIG       # View.VIEW_STATE
     )
-    _pluggables   = dscm_pluggable_client.ListPluggables(_list_request)
+    _pluggables   = pluggable_client.ListPluggables(_list_request)
     LOGGER.info('Listed Pluggables for test: %s', _pluggables)
     assert isinstance(_pluggables, ListPluggablesResponse)
     if len(_pluggables.pluggables) != 0:
@@ -164,12 +165,12 @@ def test_ListPluggables(dscm_pluggable_client : PluggablesClient):
         assert len(_pluggables.pluggables) == 0
 
 # GetPluggable Test
-def test_GetPluggable(dscm_pluggable_client : PluggablesClient):
+def test_GetPluggable(pluggable_client : PluggablesClient):
     LOGGER.info('Starting GetPluggable test...')
     LOGGER.info('Getting Pluggable for test...')
     # First create a pluggable to get it later
     _pluggable_request = create_pluggable_request(preferred_pluggable_index=1)
-    _created_pluggable = dscm_pluggable_client.CreatePluggable(_pluggable_request)
+    _created_pluggable = pluggable_client.CreatePluggable(_pluggable_request)
     LOGGER.info('Created Pluggable for GetPluggable test: %s', _created_pluggable)
 
     _get_request = create_get_pluggable_request(
@@ -177,7 +178,7 @@ def test_GetPluggable(dscm_pluggable_client : PluggablesClient):
                         pluggable_index   = _created_pluggable.id.pluggable_index,
                         view_level        = View.VIEW_FULL
     )
-    _pluggable   = dscm_pluggable_client.GetPluggable(_get_request)
+    _pluggable   = pluggable_client.GetPluggable(_get_request)
     LOGGER.info('Got Pluggable for test: %s', _pluggable)
     assert isinstance(_pluggable, Pluggable)
     assert _pluggable.id.pluggable_index         == _created_pluggable.id.pluggable_index
@@ -185,26 +186,26 @@ def test_GetPluggable(dscm_pluggable_client : PluggablesClient):
 
 
 # DeletePluggable Test
-def test_DeletePluggable(dscm_pluggable_client : PluggablesClient):
+def test_DeletePluggable(pluggable_client : PluggablesClient):
     LOGGER.info('Starting DeletePluggable test...')
     LOGGER.info('Creating Pluggable to delete for test...')
 
     # First create a pluggable to delete it later
     _pluggable_request = create_pluggable_request(preferred_pluggable_index=2)
-    _created_pluggable = dscm_pluggable_client.CreatePluggable(_pluggable_request)
+    _created_pluggable = pluggable_client.CreatePluggable(_pluggable_request)
     LOGGER.info('Created Pluggable to delete for test: %s', _created_pluggable)
 
     _delete_request = create_delete_pluggable_request(
                         device_uuid       = _created_pluggable.id.device.device_uuid.uuid,
                         pluggable_index   = _created_pluggable.id.pluggable_index
     )
-    _response       = dscm_pluggable_client.DeletePluggable(_delete_request)
+    _response       = pluggable_client.DeletePluggable(_delete_request)
     LOGGER.info('Deleted Pluggable for test, response: %s', _response)
     assert isinstance(_response, Empty)
 
     # Try to get the deleted pluggable, should raise NOT_FOUND
     with pytest.raises(grpc.RpcError) as e:
-        dscm_pluggable_client.GetPluggable(
+        pluggable_client.GetPluggable(
             create_get_pluggable_request(
                 device_uuid     = _created_pluggable.id.device.device_uuid.uuid,
                 pluggable_index = _created_pluggable.id.pluggable_index
@@ -213,20 +214,20 @@ def test_DeletePluggable(dscm_pluggable_client : PluggablesClient):
     assert e.value.code() == grpc.StatusCode.NOT_FOUND
 
 # ConfigurePluggable Test
-def test_ConfigurePluggable(dscm_pluggable_client : PluggablesClient):
+def test_ConfigurePluggable(pluggable_client : PluggablesClient):
     LOGGER.info('Starting ConfigurePluggable test...')
     LOGGER.info('Creating Pluggable to configure for test...')
 
     # First create a pluggable to configure it later
     _pluggable_request = create_pluggable_request(preferred_pluggable_index=3)
-    _created_pluggable = dscm_pluggable_client.CreatePluggable(_pluggable_request)
+    _created_pluggable = pluggable_client.CreatePluggable(_pluggable_request)
     LOGGER.info('Created Pluggable to configure for test: %s', _created_pluggable)
 
     _configure_request = create_configure_pluggable_request(
                             device_uuid       = _created_pluggable.id.device.device_uuid.uuid,
                             pluggable_index   = _created_pluggable.id.pluggable_index,
     )
-    _pluggable         = dscm_pluggable_client.ConfigurePluggable(_configure_request)
+    _pluggable         = pluggable_client.ConfigurePluggable(_configure_request)
     LOGGER.info('Configured Pluggable for test: %s', _pluggable)
     assert isinstance(_pluggable, Pluggable)
     assert _pluggable.config is not None
diff --git a/src/pluggables/tests/test_pluggables_with_SBI.py b/src/pluggables/tests/test_pluggables_with_SBI.py
index 7e8e56037..d93142942 100644
--- a/src/pluggables/tests/test_pluggables_with_SBI.py
+++ b/src/pluggables/tests/test_pluggables_with_SBI.py
@@ -16,7 +16,6 @@ import grpc, logging, pytest
 from common.proto.context_pb2 import Empty
 from common.proto.pluggables_pb2 import Pluggable, View
 from context.client.ContextClient import ContextClient
-from device.client.DeviceClient import DeviceClient
 from pluggables.client.PluggablesClient import PluggablesClient
 from pluggables.tests.testmessages import (
     create_pluggable_request, create_list_pluggables_request,
-- 
GitLab


From 96c22bcc0a0fac3a7e83339aa42b105c550fb059 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 4 Nov 2025 14:59:23 +0000
Subject: [PATCH 045/111] Pluggables component:

- Fixed Python dependency versions
---
 src/pluggables/Dockerfile | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/pluggables/Dockerfile b/src/pluggables/Dockerfile
index 264562a43..36a78ab5e 100644
--- a/src/pluggables/Dockerfile
+++ b/src/pluggables/Dockerfile
@@ -28,9 +28,9 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
     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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
-- 
GitLab


From eda18c26ca7ba258edbedbcabf2d98daaa1cf2a3 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 4 Nov 2025 15:07:16 +0000
Subject: [PATCH 046/111] Context and Service component:

- Fix Python dependenciy versions
---
 src/context/Dockerfile | 6 +++---
 src/service/Dockerfile | 6 +++---
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/src/context/Dockerfile b/src/context/Dockerfile
index add63fe65..dc08840cc 100644
--- a/src/context/Dockerfile
+++ b/src/context/Dockerfile
@@ -28,9 +28,9 @@ ENV PYTHONUNBUFFERED=0
 #     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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
diff --git a/src/service/Dockerfile b/src/service/Dockerfile
index 493094769..d0315a3cb 100644
--- a/src/service/Dockerfile
+++ b/src/service/Dockerfile
@@ -28,9 +28,9 @@ ENV PYTHONUNBUFFERED=0
 #     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
+RUN python3 -m pip install --upgrade 'pip==25.2'
+RUN python3 -m pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+RUN python3 -m pip install --upgrade 'pip-tools==7.3.0'
 
 # Get common Python packages
 # Note: this step enables sharing the previous Docker build steps among all the Python components
-- 
GitLab


From 44f8098e3a855b4cc4ef6b715a0a850c16a635a1 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 4 Nov 2025 15:26:10 +0000
Subject: [PATCH 047/111] Added Pluggables component to CI/CD pipeline

---
 .gitlab-ci.yml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 2856f9fed..aa5009dc8 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -58,6 +58,7 @@ include:
   - local: '/src/ztp_server/.gitlab-ci.yml'
   - local: '/src/osm_client/.gitlab-ci.yml'
   - local: '/src/simap_connector/.gitlab-ci.yml'
+  - local: '/src/pluggables/.gitlab-ci.yml'
 
   # This should be last one: end-to-end integration tests
   - local: '/src/tests/.gitlab-ci.yml'
-- 
GitLab


From 4f5ad6619a285b85b8453adb0ed9aaa88aa45df4 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 4 Nov 2025 15:50:32 +0000
Subject: [PATCH 048/111] Pre-merge code cleanup

---
 manifests/contextservice.yaml         |  2 +-
 scripts/run_tests_locally-nbi-dscm.sh |  6 +--
 src/nbi/requirements.in               |  1 -
 src/nbi/tests/test_l3vpn_ecoc25.py    | 60 ---------------------------
 4 files changed, 3 insertions(+), 66 deletions(-)
 delete mode 100644 src/nbi/tests/test_l3vpn_ecoc25.py

diff --git a/manifests/contextservice.yaml b/manifests/contextservice.yaml
index b362124fd..3ac332389 100644
--- a/manifests/contextservice.yaml
+++ b/manifests/contextservice.yaml
@@ -46,7 +46,7 @@ spec:
             - name: ALLOW_EXPLICIT_ADD_LINK_TO_TOPOLOGY
               value: "FALSE"
             - name: CRDB_DATABASE
-              value: "tfs_ip_context"
+              value: "tfs_context"
           envFrom:
             - secretRef:
                 name: crdb-data
diff --git a/scripts/run_tests_locally-nbi-dscm.sh b/scripts/run_tests_locally-nbi-dscm.sh
index f8562d0dd..4ccc156e9 100755
--- a/scripts/run_tests_locally-nbi-dscm.sh
+++ b/scripts/run_tests_locally-nbi-dscm.sh
@@ -1,5 +1,3 @@
-
-
 #!/bin/bash
 # Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
 #
@@ -20,11 +18,11 @@ PROJECTDIR=`pwd`
 cd $PROJECTDIR/src
 
 # test DSCM NBI functions
-/home/ubuntu/dscm/bin/python -m pytest --log-level=INFO --log-cli-level=INFO --verbose \
+python3 -m pytest --log-level=INFO --log-cli-level=INFO --verbose \
     nbi/tests/test_dscm_restconf.py::test_post_get_delete_leaf_optical_channel_frequency
 
 # # test JSON to Proto conversion functions
-# /home/ubuntu/dscm/bin/python -m pytest --log-level=INFO --log-cli-level=INFO --verbose \
+# python3 -m pytest --log-level=INFO --log-cli-level=INFO --verbose \
 #     nbi/tests/test_json_to_proto.py::test_create_pluggable_request_hub_format \
 #     nbi/tests/test_json_to_proto.py::test_create_pluggable_request_leaf_format \
 #     nbi/tests/test_json_to_proto.py::test_configure_pluggable_request_hub_format \
diff --git a/src/nbi/requirements.in b/src/nbi/requirements.in
index 1f1b7a9f4..c72fe279d 100644
--- a/src/nbi/requirements.in
+++ b/src/nbi/requirements.in
@@ -30,7 +30,6 @@ jsonschema==4.4.0       # 3.2.0 is incompatible
 kafka-python==2.0.6
 libyang==2.8.4
 netaddr==0.9.0
-netconf-console2==3.0.1
 pyang==2.6.0
 pydantic==2.6.3
 python-socketio==5.12.1
diff --git a/src/nbi/tests/test_l3vpn_ecoc25.py b/src/nbi/tests/test_l3vpn_ecoc25.py
deleted file mode 100644
index 5a3af5810..000000000
--- a/src/nbi/tests/test_l3vpn_ecoc25.py
+++ /dev/null
@@ -1,60 +0,0 @@
-# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 nbi.service.rest_server import RestServer
-from typing import  Dict
-from urllib.parse import quote
-import pytest, time, logging, os
-import requests
-from .DSCM_MockWebServer import nbi_service_rest, mock_service
-import json
-
-LOGGER = logging.getLogger(__name__)
-LOGGER.setLevel(logging.DEBUG)
-
-# Test configuration
-# BASE_URL = "http://192.168.202.254:80/restconf/data/"
-BASE_URL = "http://127.0.0.1:18080/restconf/data"
-
-PATH = "/ietf-l3vpn-svc:l3vpn-svc/vpn-services"
-
-
-@pytest.fixture(autouse=True)
-def log_each(request):
-    LOGGER.info(f">>>>>> START {request.node.name} >>>>>>")
-    yield
-    LOGGER.info(f"<<<<<< END   {request.node.name} <<<<<<")
-
-def test_post_service(nbi_service_rest: RestServer):
-
-    # service_file = 'descriptors/pablo_request.json'
-    service_file = 'nbi/tests/ietf_l3vpn_req_my_topology.json'
-    # service_file = 'descriptors/ietf_l3vpn_req_my_topology.json'
-
-    with open(service_file, 'r') as file:
-        json_data = json.load(file)
-    headers = {
-                'Content-Type': 'application/json',
-                'Accept': 'application/json'
-            }
-
-    URL = f"{BASE_URL}{PATH}"
-    LOGGER.info(f"POST {URL}")
-    LOGGER.info("--------------")
-    response = requests.post(URL, headers=headers, json=json_data)
-    time.sleep(10)
-    LOGGER.info(response.status_code)
-    LOGGER.info("--------------")
-    LOGGER.info(response.text)
-- 
GitLab


From 272dcada4a2b3d7bade94d3de4c2c8abae63fd02 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 4 Nov 2025 15:54:00 +0000
Subject: [PATCH 049/111] Pre-merge code cleanup

---
 src/pluggables/Dockerfile | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/pluggables/Dockerfile b/src/pluggables/Dockerfile
index 36a78ab5e..7d9006f93 100644
--- a/src/pluggables/Dockerfile
+++ b/src/pluggables/Dockerfile
@@ -62,7 +62,11 @@ RUN python3 -m pip install -r requirements.txt
 
 # Add component files into working directory
 WORKDIR /var/teraflow
+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/pluggables/. pluggables/
 
-# # Start the service
-ENTRYPOINT [ "python", "-m", "pluggables.service" ]
+# Start the service
+ENTRYPOINT ["python", "-m", "pluggables.service"]
-- 
GitLab


From d299bc7fef39ce052aecdacebf6161b4d46c2f34 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 4 Nov 2025 15:58:49 +0000
Subject: [PATCH 050/111] Pre-merge code cleanup

---
 src/pluggables/Dockerfile | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/pluggables/Dockerfile b/src/pluggables/Dockerfile
index 7d9006f93..8345ebdad 100644
--- a/src/pluggables/Dockerfile
+++ b/src/pluggables/Dockerfile
@@ -66,6 +66,7 @@ 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/device/server/. device/server/
 COPY src/pluggables/. pluggables/
 
 # Start the service
-- 
GitLab


From b91d59e03f08fdd2035305b9fbd92893866d559e Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 4 Nov 2025 16:01:21 +0000
Subject: [PATCH 051/111] Pre-merge code cleanup

---
 src/pluggables/Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/pluggables/Dockerfile b/src/pluggables/Dockerfile
index 8345ebdad..2f2f4bb07 100644
--- a/src/pluggables/Dockerfile
+++ b/src/pluggables/Dockerfile
@@ -66,7 +66,7 @@ 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/device/server/. device/server/
+COPY src/device/service/. device/service/
 COPY src/pluggables/. pluggables/
 
 # Start the service
-- 
GitLab


From 93c60ebb4223b7bf456a909a7975be76063663d7 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 4 Nov 2025 16:06:02 +0000
Subject: [PATCH 052/111] Pre-merge code cleanup

---
 src/pluggables/Dockerfile | 23 ++++++++++++++++++++---
 1 file changed, 20 insertions(+), 3 deletions(-)

diff --git a/src/pluggables/Dockerfile b/src/pluggables/Dockerfile
index 2f2f4bb07..3b8810c1c 100644
--- a/src/pluggables/Dockerfile
+++ b/src/pluggables/Dockerfile
@@ -16,9 +16,24 @@ FROM python:3.9-slim
 
 # Install dependencies
 RUN apt-get --yes --quiet --quiet update && \
-    apt-get --yes --quiet --quiet install wget g++ git && \
+    apt-get --yes --quiet --quiet install wget g++ git build-essential cmake libpcre2-dev python3-dev python3-cffi && \
     rm -rf /var/lib/apt/lists/*
 
+# Download, build and install libyang. Note that APT package is outdated
+# - Ref: https://github.com/CESNET/libyang
+# - Ref: https://github.com/CESNET/libyang-python/
+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" ..
+RUN make
+RUN make install
+RUN ldconfig
+
 # Set Python to show logs as they occur
 ENV PYTHONUNBUFFERED=0
 
@@ -56,8 +71,9 @@ 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/pluggables
 WORKDIR /var/teraflow/pluggables
-COPY src/pluggables/requirements.in requirements.in
-RUN pip-compile --quiet --output-file=requirements.txt requirements.in
+COPY src/device/requirements.in requirements_device.in
+COPY src/pluggables/requirements.in requirements_pluggables.in
+RUN pip-compile --quiet --output-file=requirements.txt requirements_device.in requirements_pluggables.in
 RUN python3 -m pip install -r requirements.txt
 
 # Add component files into working directory
@@ -65,6 +81,7 @@ WORKDIR /var/teraflow
 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/Config.py device/Config.py
 COPY src/device/client/. device/client/
 COPY src/device/service/. device/service/
 COPY src/pluggables/. pluggables/
-- 
GitLab


From 19778c2ce9217eeb26113c70e2cad2f55f9f3a0b Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 4 Nov 2025 16:12:37 +0000
Subject: [PATCH 053/111] Pre-merge code cleanup

---
 src/pluggables/Dockerfile | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/pluggables/Dockerfile b/src/pluggables/Dockerfile
index 3b8810c1c..de4d7aa62 100644
--- a/src/pluggables/Dockerfile
+++ b/src/pluggables/Dockerfile
@@ -84,6 +84,8 @@ COPY src/device/__init__.py device/__init__.py
 COPY src/device/Config.py device/Config.py
 COPY src/device/client/. device/client/
 COPY src/device/service/. device/service/
+COPY src/monitoring/__init__.py monitoring/__init__.py
+COPY src/monitoring/client/. monitoring/client/
 COPY src/pluggables/. pluggables/
 
 # Start the service
-- 
GitLab


From fa575abc991be01771ce96844c110db481d2d2c6 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 4 Nov 2025 16:32:52 +0000
Subject: [PATCH 054/111] Pre-merge code cleanup

---
 src/nbi/service/{rest_server/nbi_plugins => }/dscm_oc/__init__.py | 0
 .../{rest_server/nbi_plugins => }/dscm_oc/enforce_header.py       | 0
 src/nbi/service/{rest_server/nbi_plugins => }/dscm_oc/error.py    | 0
 .../nbi_plugins => }/dscm_oc/json_to_proto_conversion.py          | 0
 src/nbi/service/{rest_server/nbi_plugins => }/dscm_oc/routes.py   | 0
 5 files changed, 0 insertions(+), 0 deletions(-)
 rename src/nbi/service/{rest_server/nbi_plugins => }/dscm_oc/__init__.py (100%)
 rename src/nbi/service/{rest_server/nbi_plugins => }/dscm_oc/enforce_header.py (100%)
 rename src/nbi/service/{rest_server/nbi_plugins => }/dscm_oc/error.py (100%)
 rename src/nbi/service/{rest_server/nbi_plugins => }/dscm_oc/json_to_proto_conversion.py (100%)
 rename src/nbi/service/{rest_server/nbi_plugins => }/dscm_oc/routes.py (100%)

diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/__init__.py b/src/nbi/service/dscm_oc/__init__.py
similarity index 100%
rename from src/nbi/service/rest_server/nbi_plugins/dscm_oc/__init__.py
rename to src/nbi/service/dscm_oc/__init__.py
diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/enforce_header.py b/src/nbi/service/dscm_oc/enforce_header.py
similarity index 100%
rename from src/nbi/service/rest_server/nbi_plugins/dscm_oc/enforce_header.py
rename to src/nbi/service/dscm_oc/enforce_header.py
diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/error.py b/src/nbi/service/dscm_oc/error.py
similarity index 100%
rename from src/nbi/service/rest_server/nbi_plugins/dscm_oc/error.py
rename to src/nbi/service/dscm_oc/error.py
diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/json_to_proto_conversion.py b/src/nbi/service/dscm_oc/json_to_proto_conversion.py
similarity index 100%
rename from src/nbi/service/rest_server/nbi_plugins/dscm_oc/json_to_proto_conversion.py
rename to src/nbi/service/dscm_oc/json_to_proto_conversion.py
diff --git a/src/nbi/service/rest_server/nbi_plugins/dscm_oc/routes.py b/src/nbi/service/dscm_oc/routes.py
similarity index 100%
rename from src/nbi/service/rest_server/nbi_plugins/dscm_oc/routes.py
rename to src/nbi/service/dscm_oc/routes.py
-- 
GitLab


From 5cf9ff0045112daa0d3c60c15e8da05047192c7f Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 4 Nov 2025 16:33:14 +0000
Subject: [PATCH 055/111] NBI Component:

- Add registration of RESTCONF/OpenConfig/DSCM connector
---
 src/nbi/service/app.py | 26 ++++++++++++++------------
 1 file changed, 14 insertions(+), 12 deletions(-)

diff --git a/src/nbi/service/app.py b/src/nbi/service/app.py
index 67fd3c604..7cb7cb3e7 100644
--- a/src/nbi/service/app.py
+++ b/src/nbi/service/app.py
@@ -30,6 +30,8 @@ from common.Settings import (
 )
 from .NbiApplication import NbiApplication
 from .camara_qod import register_camara_qod
+from .dscm_oc import register_dscm_oc
+from .e2e_services import register_etsi_api
 from .etsi_bwm import register_etsi_bwm_api
 from .health_probes import register_health_probes
 from .ietf_acl import register_ietf_acl
@@ -38,15 +40,14 @@ from .ietf_l2vpn import register_ietf_l2vpn
 from .ietf_l3vpn import register_ietf_l3vpn
 from .ietf_network import register_ietf_network
 from .ietf_network_slice import register_ietf_nss
+from .osm_nbi import register_osm_api
 from .qkd_app import register_qkd_app
 from .restconf_root import register_restconf_root
+from .sse_telemetry import register_telemetry_subscription
 from .tfs_api import register_tfs_api
-from .osm_nbi import register_osm_api
 #from .topology_updates import register_topology_updates
 from .vntm_recommend import register_vntm_recommend
-from .sse_telemetry import register_telemetry_subscription
 from .well_known_meta import register_well_known
-from .e2e_services import register_etsi_api
 
 LOG_LEVEL = get_log_level()
 logging.basicConfig(
@@ -85,24 +86,25 @@ KafkaTopic.create_all_topics()
 LOGGER.info('Created required Kafka topics')
 
 nbi_app = NbiApplication(base_url=BASE_URL)
-register_health_probes   (nbi_app)
-register_restconf_root   (nbi_app)
-register_well_known      (nbi_app)
-register_tfs_api         (nbi_app)
+register_camara_qod      (nbi_app)
+register_dscm_oc         (nbi_app)
+register_etsi_api        (nbi_app)
 register_etsi_bwm_api    (nbi_app)
+register_health_probes   (nbi_app)
+register_ietf_acl        (nbi_app)
 register_ietf_hardware   (nbi_app)
 register_ietf_l2vpn      (nbi_app)
 register_ietf_l3vpn      (nbi_app)
 register_ietf_network    (nbi_app)
 register_ietf_nss        (nbi_app)
-register_ietf_acl        (nbi_app)
+register_osm_api         (nbi_app)
 register_qkd_app         (nbi_app)
+register_restconf_root   (nbi_app)
+register_telemetry_subscription(nbi_app)
+register_tfs_api         (nbi_app)
 #register_topology_updates(nbi_app) # does not work; check if eventlet-grpc side effects
 register_vntm_recommend  (nbi_app)
-register_telemetry_subscription(nbi_app)
-register_camara_qod      (nbi_app)
-register_etsi_api        (nbi_app)
-register_osm_api         (nbi_app)
+register_well_known      (nbi_app)
 LOGGER.info('All connectors registered')
 
 nbi_app.dump_configuration()
-- 
GitLab


From 07a6bcc2d42f5cad52f8022b11e2f1727c7f75ab Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 4 Nov 2025 16:37:45 +0000
Subject: [PATCH 056/111] Disabled DSCM unit tests while they are resolved

---
 src/nbi/.gitlab-ci.yml        |   1 +
 src/pluggables/.gitlab-ci.yml | 146 +++++++++++++++++-----------------
 2 files changed, 74 insertions(+), 73 deletions(-)

diff --git a/src/nbi/.gitlab-ci.yml b/src/nbi/.gitlab-ci.yml
index 0a5810354..492c4603a 100644
--- a/src/nbi/.gitlab-ci.yml
+++ b/src/nbi/.gitlab-ci.yml
@@ -120,6 +120,7 @@ unit_test nbi:
     - 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"
     - docker exec -i $IMAGE_NAME bash -c "coverage run --append -m pytest --log-level=INFO --verbose $IMAGE_NAME/tests/test_etsi_bwm.py --junitxml=/opt/results/${IMAGE_NAME}_report_etsi_bwm.xml"
     - docker exec -i $IMAGE_NAME bash -c "coverage run --append -m pytest --log-level=INFO --verbose $IMAGE_NAME/tests/test_camara_qod.py --junitxml=/opt/results/${IMAGE_NAME}_report_camara_qod.xml"
+    #- docker exec -i $IMAGE_NAME bash -c "coverage run --append -m pytest --log-level=INFO --verbose $IMAGE_NAME/tests/test_dscm_restconf.py --junitxml=/opt/results/${IMAGE_NAME}_report_dscm_restconf.xml"
     - docker exec -i $IMAGE_NAME bash -c "coverage report --include='${IMAGE_NAME}/*' --show-missing"
   coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/'
   after_script:
diff --git a/src/pluggables/.gitlab-ci.yml b/src/pluggables/.gitlab-ci.yml
index b9e58b0e8..695348a03 100644
--- a/src/pluggables/.gitlab-ci.yml
+++ b/src/pluggables/.gitlab-ci.yml
@@ -40,76 +40,76 @@ build pluggables:
       - .gitlab-ci.yml
 
 # Apply unit test to the component
-unit_test pluggables:
-  variables:
-    IMAGE_NAME: 'pluggables' # name of the microservice
-    IMAGE_TAG: 'latest' # tag of the container image (production, development, etc)
-  stage: unit_test
-  needs:
-    - build pluggables
-  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 context; then docker rm -f context; else echo "context container 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 "$CI_REGISTRY_IMAGE/context:$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
-    - CRDB_ADDRESS=$(docker inspect crdb --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}")
-    - echo $CRDB_ADDRESS
-    - >
-      docker run --name context -d -p 1010:1010
-      --env "CRDB_URI=cockroachdb://tfs:tfs123@${CRDB_ADDRESS}:26257/tfs_test?sslmode=require"
-      --network=teraflowbridge
-      $CI_REGISTRY_IMAGE/context:$IMAGE_TAG
-    - docker ps -a
-    - CONTEXT_ADDRESS=$(docker inspect context --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}")
-    - echo $CONTEXT_ADDRESS
-    - >
-      docker run --name $IMAGE_NAME -d -p 30040:30040
-      --env "CONTEXTSERVICE_SERVICE_HOST=${CONTEXT_ADDRESS}"
-      --env "CONTEXTSERVICE_SERVICE_PORT_GRPC=1010"
-      --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 rm -f $IMAGE_NAME context crdb
-    - 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/Dockerfile
-      - src/$IMAGE_NAME/tests/*.py
-      - manifests/${IMAGE_NAME}service.yaml
-      - .gitlab-ci.yml
-  artifacts:
-    when: always
-    reports:
-      junit: src/$IMAGE_NAME/tests/${IMAGE_NAME}_report.xml
+#unit_test pluggables:
+#  variables:
+#    IMAGE_NAME: 'pluggables' # name of the microservice
+#    IMAGE_TAG: 'latest' # tag of the container image (production, development, etc)
+#  stage: unit_test
+#  needs:
+#    - build pluggables
+#  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 context; then docker rm -f context; else echo "context container 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 "$CI_REGISTRY_IMAGE/context:$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
+#    - CRDB_ADDRESS=$(docker inspect crdb --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}")
+#    - echo $CRDB_ADDRESS
+#    - >
+#      docker run --name context -d -p 1010:1010
+#      --env "CRDB_URI=cockroachdb://tfs:tfs123@${CRDB_ADDRESS}:26257/tfs_test?sslmode=require"
+#      --network=teraflowbridge
+#      $CI_REGISTRY_IMAGE/context:$IMAGE_TAG
+#    - docker ps -a
+#    - CONTEXT_ADDRESS=$(docker inspect context --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}")
+#    - echo $CONTEXT_ADDRESS
+#    - >
+#      docker run --name $IMAGE_NAME -d -p 30040:30040
+#      --env "CONTEXTSERVICE_SERVICE_HOST=${CONTEXT_ADDRESS}"
+#      --env "CONTEXTSERVICE_SERVICE_PORT_GRPC=1010"
+#      --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 rm -f $IMAGE_NAME context crdb
+#    - 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/Dockerfile
+#      - src/$IMAGE_NAME/tests/*.py
+#      - manifests/${IMAGE_NAME}service.yaml
+#      - .gitlab-ci.yml
+#  artifacts:
+#    when: always
+#    reports:
+#      junit: src/$IMAGE_NAME/tests/${IMAGE_NAME}_report.xml
-- 
GitLab


From 144df730351025c46b5c263154c3524f21aa35df Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 4 Nov 2025 16:45:11 +0000
Subject: [PATCH 057/111] Device component - NETCONF DSCM Driver:

- Remove, not needed
---
 .../drivers/netconf_dscm/NetConfDriver.py     | 130 ------------------
 .../service/drivers/netconf_dscm/__init__.py  |  14 --
 .../templates/edit_config_hub_template.xml    |  31 -----
 .../templates/edit_config_leaf_template.xml   |  31 -----
 .../netconf_dscm/templates/edit_dscm_hub.xml  |  99 -------------
 .../templates/edit_dscm_leaves.xml            | 101 --------------
 .../templates/test_hub_template.xml           |  39 ------
 7 files changed, 445 deletions(-)
 delete mode 100644 src/device/service/drivers/netconf_dscm/NetConfDriver.py
 delete mode 100644 src/device/service/drivers/netconf_dscm/__init__.py
 delete mode 100644 src/device/service/drivers/netconf_dscm/templates/edit_config_hub_template.xml
 delete mode 100644 src/device/service/drivers/netconf_dscm/templates/edit_config_leaf_template.xml
 delete mode 100644 src/device/service/drivers/netconf_dscm/templates/edit_dscm_hub.xml
 delete mode 100644 src/device/service/drivers/netconf_dscm/templates/edit_dscm_leaves.xml
 delete mode 100644 src/device/service/drivers/netconf_dscm/templates/test_hub_template.xml

diff --git a/src/device/service/drivers/netconf_dscm/NetConfDriver.py b/src/device/service/drivers/netconf_dscm/NetConfDriver.py
deleted file mode 100644
index 20fcab5f8..000000000
--- a/src/device/service/drivers/netconf_dscm/NetConfDriver.py
+++ /dev/null
@@ -1,130 +0,0 @@
-# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 ast import Dict
-from common.method_wrappers.Decorator import MetricsPool
-from device.service.driver_api._Driver import _Driver
-from jinja2 import Environment, FileSystemLoader
-from typing import Any, List, Tuple, Union
-import logging
-import os
-import subprocess
-
-DRIVER_NAME = 'dscm-netconf'
-METRICS_POOL = MetricsPool('Device', 'Driver', labels={'driver': DRIVER_NAME})
-LOGGER = logging.getLogger(__name__)
-LOGGER.setLevel(logging.INFO)
-
-class NetConfDriver(_Driver):
-    def __init__(self, address : str, port : int, **settings) -> None:
-        super().__init__(DRIVER_NAME, address, port, **settings)
-    
-    def GetConfig(self, resources: List[str]) -> List[Tuple[str, Union[Any, None, Exception]]]:     # pyright: ignore[reportIncompatibleMethodOverride]
-        results = []
-        for resource_path in resources:
-            if not resource_path.startswith('/'):
-                raise ValueError(f"Invalid resource path: {resource_path}. Must start with '/'")
-            command = [
-                "netconf-console2",
-                f"--host={self.address}",
-                f"--port={self.port}",
-                "--tcp",
-                "--get-config",
-                f"{resource_path}"
-            ]
-            LOGGER.info(f"Executing command: {' '.join(command)}")
-            try:
-                result = subprocess.run(command, capture_output=True, text=True, timeout=10)
-                if result.returncode == 0:
-                    LOGGER.info(f"Get-config successful for {resource_path}")
-                    # LOGGER.info(result.stdout)
-                    results.append(result.stdout)
-                else:
-                    MSG = 'Exception retrieving {:s}: {:s}'
-                    LOGGER.exception(f"Get-config failed for {resource_path}: {result.stderr}")
-                    results.append(Exception(MSG.format(resource_path, result.stderr)))
-            except Exception as e:
-                LOGGER.exception("Command timed out")
-                results.append(e)
-        return results
-
-    def SetConfig(self, resources: List[Tuple[str, Any]]) -> List[Union[bool, Exception]]:
-        results = []
-        for node, config in resources:
-            # rendered_config = self.populated_xml_template(node, config)
-            self.populated_xml_template(node, config)
-            command = [
-                "netconf-console2",
-                f"--host={self.address}",
-                f"--port={self.port}",
-                "--tcp",
-                "--edit-config",
-                f"{node}.xml"    # rendered_config
-            ]
-            LOGGER.info(f"Executing command: {' '.join(command)}")
-            try:
-                    result = subprocess.run(command, capture_output=True, text=True, timeout=10)
-                    LOGGER.info(f"Command output: {result.stdout}")
-                    if result.returncode == 0:
-                        LOGGER.info(f"Set-config successful for {node}")
-                        results.append(True)
-                    else:
-                        MSG = 'Exception setting {:s}: {:s}'
-                        LOGGER.exception(f"Set-config failed for {node}: {result.stderr}")
-                        results.append(Exception(MSG.format(node, result.stderr)))
-            except Exception as e:
-                LOGGER.exception("Command timed out")
-                results.append(e)
-        return results
-
-
-    def populated_xml_template(self, node : str, config: Dict):
-        try:
-            # Get the directory of this file to locate the template
-            current_dir = os.path.dirname(os.path.abspath(__file__))
-            template_dir = os.path.join(current_dir, 'templates')
-            # template_dir = 'templates/'
-            LOGGER.info(f"Template directory: {template_dir}")
-            
-            # Set up Jinja2 environment
-            env = Environment(loader=FileSystemLoader(template_dir))
-            if node == 'T2.1':
-                LOGGER.info("Using hub template: edit_config_hub_template.xml")
-                # template = env.get_template('test_hub_template.xml')
-                template = env.get_template('edit_config_hub_template.xml')
-            elif node in ['T1.1', 'T1.2', 'T1.3']:
-                template = env.get_template('edit_config_leaf_template.xml')
-            else:
-                raise ValueError(f"Unknown node: {node}")
-
-            # Render the template with config values
-            rendered_xml = template.render(**config)
-
-            LOGGER.info(f"Rendered XML:\n{rendered_xml}")
-            # return rendered_xml
-            
-            # Write to file
-            output_file = f"{node}.xml"
-            with open(output_file, 'w') as f:
-                f.write(rendered_xml)
-            
-            LOGGER.info(f"XML template populated and saved to {output_file}")
-            return True
-            
-        except Exception as e:
-            LOGGER.exception(f"Failed to populate XML template: {e}")
-            # return False
-
-
diff --git a/src/device/service/drivers/netconf_dscm/__init__.py b/src/device/service/drivers/netconf_dscm/__init__.py
deleted file mode 100644
index 3ccc21c7d..000000000
--- a/src/device/service/drivers/netconf_dscm/__init__.py
+++ /dev/null
@@ -1,14 +0,0 @@
-# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/device/service/drivers/netconf_dscm/templates/edit_config_hub_template.xml b/src/device/service/drivers/netconf_dscm/templates/edit_config_hub_template.xml
deleted file mode 100644
index 4149bccda..000000000
--- a/src/device/service/drivers/netconf_dscm/templates/edit_config_hub_template.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-
-    
-        {{name}}
-        
-            {% if operation is defined and operation != 'delete' %}
-            
-                {% if frequency is defined %}{{frequency}}{% endif %}
-                {% if target_output_power is defined %}{{target_output_power}}{% endif %}
-                {% if operational_mode is defined %}{{operational_mode}}{% endif %}
-
-                {% if digital_sub_carriers_group is defined and digital_sub_carriers_group %}
-                    {% for group in digital_sub_carriers_group %}
-                    
-                        {{group.digital_sub_carriers_group_id}}
-
-                        {% if group.digital_sub_carrier_id is defined and group.digital_sub_carrier_id %}
-                            {% for sub_carrier in group.digital_sub_carrier_id %}
-                            
-                                {{sub_carrier.sub_carrier_id}}
-                                {{sub_carrier.active}}
-                            
-                            {% endfor %}
-                        {% endif %}
-                    
-                    {% endfor %}
-                {% endif %}
-            
-            {% endif %}
-        
-    
-
diff --git a/src/device/service/drivers/netconf_dscm/templates/edit_config_leaf_template.xml b/src/device/service/drivers/netconf_dscm/templates/edit_config_leaf_template.xml
deleted file mode 100644
index 4149bccda..000000000
--- a/src/device/service/drivers/netconf_dscm/templates/edit_config_leaf_template.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-
-    
-        {{name}}
-        
-            {% if operation is defined and operation != 'delete' %}
-            
-                {% if frequency is defined %}{{frequency}}{% endif %}
-                {% if target_output_power is defined %}{{target_output_power}}{% endif %}
-                {% if operational_mode is defined %}{{operational_mode}}{% endif %}
-
-                {% if digital_sub_carriers_group is defined and digital_sub_carriers_group %}
-                    {% for group in digital_sub_carriers_group %}
-                    
-                        {{group.digital_sub_carriers_group_id}}
-
-                        {% if group.digital_sub_carrier_id is defined and group.digital_sub_carrier_id %}
-                            {% for sub_carrier in group.digital_sub_carrier_id %}
-                            
-                                {{sub_carrier.sub_carrier_id}}
-                                {{sub_carrier.active}}
-                            
-                            {% endfor %}
-                        {% endif %}
-                    
-                    {% endfor %}
-                {% endif %}
-            
-            {% endif %}
-        
-    
-
diff --git a/src/device/service/drivers/netconf_dscm/templates/edit_dscm_hub.xml b/src/device/service/drivers/netconf_dscm/templates/edit_dscm_hub.xml
deleted file mode 100644
index 21eb62ebe..000000000
--- a/src/device/service/drivers/netconf_dscm/templates/edit_dscm_hub.xml
+++ /dev/null
@@ -1,99 +0,0 @@
-
-  
-    channel-1
-    
-      
-        195000000
-        -3.0
-        1
-        port-1
-        50.0
-        
-          1
-          4
-          100
-          
-            1
-            true
-          
-          
-            2
-            true
-          
-          
-            3
-            true
-          
-          
-            4
-            true
-          
-        
-        
-  	    2
-          4
-          100
-          
-            5
-            true
-          
-          
-            6
-            true
-          
-          
-            7
-            true
-          
-          
-            8
-            true
-            0.0
-          
-        
-        
-          3
-          4
-          100
-          
-            9
-            true
-          
-          
-            10
-            true
-          
-          
-            11
-            true
-          
-          
-            12
-            true
-          
-        
-        
-          4
-          4
-          100
-          
-            13
-            true
-          
-          
-            14
-            true
-          
-          
-            15
-            true
-          
-          
-            16
-            true
-          
-        
-      
-    
-  
-
diff --git a/src/device/service/drivers/netconf_dscm/templates/edit_dscm_leaves.xml b/src/device/service/drivers/netconf_dscm/templates/edit_dscm_leaves.xml
deleted file mode 100644
index 093b25b90..000000000
--- a/src/device/service/drivers/netconf_dscm/templates/edit_dscm_leaves.xml
+++ /dev/null
@@ -1,101 +0,0 @@
-
-  
-    channel-1
-    
-      
-        195006250
-        -99.0
-        1
-        port-1
-        50.0
-        
-          1
-          4
-          100
-          
-            1
-            true
-          
-          
-            2
-            true
-          
-          
-            3
-            true
-          
-          
-            4
-            true
-          
-  	
-      
-    
-  
-  
-    channel-3
-    
-      
-        195018750
-        -99.0
-        1
-        port-3
-        50.0
-        
-          1
-          4
-          100
-          
-            1
-            true
-          
-          
-            2
-            true
-          
-          
-            3
-            true
-          
-          
-            4
-            true
-          
-  	
-      
-    
-  
-  
-    channel-5
-    
-      
-        195031250
-        -99.0
-        1
-        port-5
-        50.0
-        
-          1
-          4
-          100
-          
-            1
-            true
-          
-          
-            2
-            true
-          
-          
-            3
-            true
-          
-          
-            4
-            true
-          
-  	
-      
-    
-  
-
diff --git a/src/device/service/drivers/netconf_dscm/templates/test_hub_template.xml b/src/device/service/drivers/netconf_dscm/templates/test_hub_template.xml
deleted file mode 100644
index 19a8d2ea8..000000000
--- a/src/device/service/drivers/netconf_dscm/templates/test_hub_template.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-
-  
-    {{ name }}
-    
-      {% if operation is defined and operation != 'delete' %}
-      
-        {% if frequency is defined %}
-        {{ frequency }}
-        {% endif %}
-
-        {% if target_output_power is defined %}
-        {{ target_output_power }}
-        {% endif %}
-
-        {% if operational_mode is defined %}
-        {{ operational_mode }}
-        {% endif %}
-
-        {% if digital_sub_carriers_group is defined and digital_sub_carriers_group %}
-          {% for group in digital_sub_carriers_group %}
-          
-            {{ group.digital_sub_carriers_group_id }}
-
-            {% if group.digital_sub_carrier_id is defined and group.digital_sub_carrier_id %}
-              {% for sub_carrier in group.digital_sub_carrier_id %}
-              
-                {{ sub_carrier.sub_carrier_id }}
-                {% if sub_carrier.active %}true{% else %}false{% endif %}
-              
-              {% endfor %}
-            {% endif %}
-          
-          {% endfor %}
-        {% endif %}
-      
-      {% endif %}
-    
-  
-
-- 
GitLab


From 32dc8224c1b10f99a851d460f34cbc3830fe813e Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 4 Nov 2025 16:46:40 +0000
Subject: [PATCH 058/111] Test Scripts:

- Remove unneeded script for Device NETCONF DSCM Driver
---
 .../run_tests_locally-device-netconf-dscm.sh  | 27 -------------------
 1 file changed, 27 deletions(-)
 delete mode 100755 scripts/run_tests_locally-device-netconf-dscm.sh

diff --git a/scripts/run_tests_locally-device-netconf-dscm.sh b/scripts/run_tests_locally-device-netconf-dscm.sh
deleted file mode 100755
index e01667e33..000000000
--- a/scripts/run_tests_locally-device-netconf-dscm.sh
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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
-
-python3 -m pytest --log-level=DEBUG --log-cli-level=INFO --verbose \
-    device/tests/dscm/test_dscm_netconf_hub_leaf.py::test_get_default_hub_config
-
-python3 -m pytest --log-level=DEBUG --log-cli-level=INFO --verbose \
-    device/tests/dscm/test_dscm_netconf_hub_leaf.py::test_get_default_leaves_config
-
-# python3 -m pytest --log-level=DEBUG --log-cli-level=INFO --verbose \
-#     device/tests/dscm/test_dscm_netconf_hub_leaf.py::test_get_and_remove_topology_context
-- 
GitLab


From a0f44c047486cecff13120bfe2bc01fd99a9a752 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 4 Nov 2025 16:50:27 +0000
Subject: [PATCH 059/111] Device component - NETCONF DSCM Driver:

- Remove, unneeded files
---
 .../components/component/config/edit_config.xml    | 14 --------------
 .../templates/components/component/get.xml         |  3 ---
 .../components/component/optical_channel/get.xml   | 11 -----------
 3 files changed, 28 deletions(-)
 delete mode 100644 src/device/service/drivers/openconfig/templates/components/component/config/edit_config.xml
 delete mode 100644 src/device/service/drivers/openconfig/templates/components/component/get.xml
 delete mode 100644 src/device/service/drivers/openconfig/templates/components/component/optical_channel/get.xml

diff --git a/src/device/service/drivers/openconfig/templates/components/component/config/edit_config.xml b/src/device/service/drivers/openconfig/templates/components/component/config/edit_config.xml
deleted file mode 100644
index 67ed5d1dd..000000000
--- a/src/device/service/drivers/openconfig/templates/components/component/config/edit_config.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-    
-        {{name}}
-        
-            {% if operation is defined and operation != 'delete' %}
-            
-                {% if frequency is defined %}{{frequency}}{% endif %}
-                {% if target_output_power is defined %}{{target_output_power}}{% endif %}
-                {% if operational_mode is defined %}{{operational_mode}}{% endif %}
-            
-            {% endif %}
-        
-    
-
diff --git a/src/device/service/drivers/openconfig/templates/components/component/get.xml b/src/device/service/drivers/openconfig/templates/components/component/get.xml
deleted file mode 100644
index aa25ed1e3..000000000
--- a/src/device/service/drivers/openconfig/templates/components/component/get.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-
-    
-
diff --git a/src/device/service/drivers/openconfig/templates/components/component/optical_channel/get.xml b/src/device/service/drivers/openconfig/templates/components/component/optical_channel/get.xml
deleted file mode 100644
index 89250f818..000000000
--- a/src/device/service/drivers/openconfig/templates/components/component/optical_channel/get.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-    
-        {% if component_name %}
-        {{ component_name }}
-        {% endif %}
-        
-        
-            
-        
-    
-
-- 
GitLab


From a3e0231aff11c551324f0102ccd6e32b161d47e0 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 4 Nov 2025 16:55:53 +0000
Subject: [PATCH 060/111] Pre-merge code cleanup, remove unneeded files

---
 src/device/service/drivers/__init__.py | 28 ++++++------
 src/device/tests/dscm/actual_hub.xml   | 21 ---------
 src/device/tests/dscm/rendered_hub.xml | 60 --------------------------
 3 files changed, 13 insertions(+), 96 deletions(-)
 delete mode 100644 src/device/tests/dscm/actual_hub.xml
 delete mode 100644 src/device/tests/dscm/rendered_hub.xml

diff --git a/src/device/service/drivers/__init__.py b/src/device/service/drivers/__init__.py
index 92fdff911..ba5298292 100644
--- a/src/device/service/drivers/__init__.py
+++ b/src/device/service/drivers/__init__.py
@@ -98,19 +98,19 @@ if LOAD_ALL_DEVICE_DRIVERS:
             }
         ]))
 
-# if LOAD_ALL_DEVICE_DRIVERS:
-#     from .gnmi_openconfig.GnmiOpenConfigDriver import GnmiOpenConfigDriver # pylint: disable=wrong-import-position
-#     DRIVERS.append(
-#         (GnmiOpenConfigDriver, [
-#             {
-#                 # Real Packet Router, specifying gNMI OpenConfig Driver => use GnmiOpenConfigDriver
-#                 FilterFieldEnum.DEVICE_TYPE: [
-#                     DeviceTypeEnum.PACKET_POP,
-#                     DeviceTypeEnum.PACKET_ROUTER,
-#                 ],
-#                 FilterFieldEnum.DRIVER     : DeviceDriverEnum.DEVICEDRIVER_GNMI_OPENCONFIG,
-#             }
-#         ]))
+if LOAD_ALL_DEVICE_DRIVERS:
+    from .gnmi_openconfig.GnmiOpenConfigDriver import GnmiOpenConfigDriver # pylint: disable=wrong-import-position
+    DRIVERS.append(
+        (GnmiOpenConfigDriver, [
+            {
+                # Real Packet Router, specifying gNMI OpenConfig Driver => use GnmiOpenConfigDriver
+                FilterFieldEnum.DEVICE_TYPE: [
+                    DeviceTypeEnum.PACKET_POP,
+                    DeviceTypeEnum.PACKET_ROUTER,
+                ],
+                FilterFieldEnum.DRIVER     : DeviceDriverEnum.DEVICEDRIVER_GNMI_OPENCONFIG,
+            }
+        ]))
 
 if LOAD_ALL_DEVICE_DRIVERS:
     from .gnmi_nokia_srlinux.GnmiNokiaSrLinuxDriver import GnmiNokiaSrLinuxDriver # pylint: disable=wrong-import-position
@@ -234,7 +234,6 @@ if LOAD_ALL_DEVICE_DRIVERS:
                 # Real Packet Router, specifying OpenConfig Driver => use OpenConfigDriver
                 FilterFieldEnum.DEVICE_TYPE: [
                     DeviceTypeEnum.OPEN_ROADM,
-                   
                 ],
                 FilterFieldEnum.DRIVER     : DeviceDriverEnum.DEVICEDRIVER_OPENROADM,
             }
@@ -250,4 +249,3 @@ if LOAD_ALL_DEVICE_DRIVERS:
                 FilterFieldEnum.DRIVER     : DeviceDriverEnum.DEVICEDRIVER_QKD,
             }
         ]))
-
diff --git a/src/device/tests/dscm/actual_hub.xml b/src/device/tests/dscm/actual_hub.xml
deleted file mode 100644
index 32067b11e..000000000
--- a/src/device/tests/dscm/actual_hub.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-1
-4
-100
-
-1
-false
-
-
-2
-false
-
-
-3
-false
-
-
-4
-false
-
-
diff --git a/src/device/tests/dscm/rendered_hub.xml b/src/device/tests/dscm/rendered_hub.xml
deleted file mode 100644
index 14a9d37d9..000000000
--- a/src/device/tests/dscm/rendered_hub.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-
-    
-        channel-1
-        
-            
-                195000000
-                0.0
-                9
-                    
-                        1
-
-                            
-                                1
-                                True
-                            
-                            
-                            
-                                2
-                                True
-                            
-                            
-                            
-                                3
-                                True
-                            
-                            
-                            
-                                4
-                                True
-                            
-
-                    
-                    
-                    
-                        1
-
-                            
-                                5
-                                True
-                            
-                            
-                            
-                                6
-                                True
-                            
-                            
-                            
-                                7
-                                True
-                            
-                            
-                            
-                                8
-                                True
-                                                    
-                    
-            
-        
-    
-
-- 
GitLab


From 43c83ac9ed32988b31ea78304d4749d7583c4e64 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 4 Nov 2025 16:56:12 +0000
Subject: [PATCH 061/111] Device component:

- Add missing dependencies in Dockerfile
---
 src/device/Dockerfile | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/device/Dockerfile b/src/device/Dockerfile
index e33f4e980..d74263414 100644
--- a/src/device/Dockerfile
+++ b/src/device/Dockerfile
@@ -82,6 +82,8 @@ COPY src/context/__init__.py context/__init__.py
 COPY src/context/client/. context/client/
 COPY src/monitoring/__init__.py monitoring/__init__.py
 COPY src/monitoring/client/. monitoring/client/
+COPY src/kpi_manager/__init__.py kpi_manager/__init__.py
+COPY src/kpi_manager/client/. kpi_manager/client/
 
 # Clone test mock tools
 RUN mkdir -p tests/tools/mock_ietf_actn_sdn_ctrl
-- 
GitLab


From 0d290dddb5068374479b2cbc6a85c93560e49312 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 4 Nov 2025 16:58:01 +0000
Subject: [PATCH 062/111] Device component:

- Remove unneeded Python library
---
 src/device/requirements.in | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/device/requirements.in b/src/device/requirements.in
index 0a75ac159..10139bc2c 100644
--- a/src/device/requirements.in
+++ b/src/device/requirements.in
@@ -27,7 +27,6 @@ Jinja2==3.0.3
 libyang==2.8.4
 macaddress
 ncclient==0.6.15
-netconf-console2==3.0.1
 numpy<2.0.0
 p4runtime==1.3.0
 pandas==1.5.*
-- 
GitLab


From ecf801eb495186da411c96ff87750b2fbd30b719 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 4 Nov 2025 17:23:51 +0000
Subject: [PATCH 063/111] NBI component:

- Add missing dependencies in Dockerfile
---
 src/nbi/Dockerfile | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/src/nbi/Dockerfile b/src/nbi/Dockerfile
index 1a08ddbe1..1b0d841f3 100644
--- a/src/nbi/Dockerfile
+++ b/src/nbi/Dockerfile
@@ -77,18 +77,20 @@ 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/service/__init__.py service/__init__.py
-COPY src/service/client/. service/client/
-COPY src/slice/__init__.py slice/__init__.py
-COPY src/slice/client/. slice/client/
+COPY src/osm_client/__init__.py osm_client/__init__.py
+COPY src/osm_client/client/. osm_client/client/
+COPY src/pluggables/__init__.py pluggables/__init__.py
+COPY src/pluggables/client/. pluggables/client/
 COPY src/qkd_app/__init__.py qkd_app/__init__.py
 COPY src/qkd_app/client/. qkd_app/client/
 COPY src/qos_profile/__init__.py qos_profile/__init__.py
 COPY src/qos_profile/client/. qos_profile/client/
-COPY src/osm_client/__init__.py osm_client/__init__.py
-COPY src/osm_client/client/. osm_client/client/
+COPY src/service/__init__.py service/__init__.py
+COPY src/service/client/. service/client/
 COPY src/simap_connector/__init__.py simap_connector/__init__.py
 COPY src/simap_connector/client/. simap_connector/client/
+COPY src/slice/__init__.py slice/__init__.py
+COPY src/slice/client/. slice/client/
 COPY src/vnt_manager/__init__.py vnt_manager/__init__.py
 COPY src/vnt_manager/client/. vnt_manager/client/
 RUN mkdir -p /var/teraflow/tests/tools
-- 
GitLab


From 86f9173c889133e2ea45dfb875df02ab0eeabb79 Mon Sep 17 00:00:00 2001
From: Waleed Akbar 
Date: Wed, 5 Nov 2025 09:07:08 +0000
Subject: [PATCH 064/111] Refactor deployment environment variables for
 consistency in monitoring scripts

---
 deploy/monitoring.sh | 7 +++----
 my_deploy.sh         | 2 +-
 2 files changed, 4 insertions(+), 5 deletions(-)

diff --git a/deploy/monitoring.sh b/deploy/monitoring.sh
index 7b29eb48f..74b245684 100755
--- a/deploy/monitoring.sh
+++ b/deploy/monitoring.sh
@@ -16,7 +16,7 @@
 set -euo pipefail
 
 # Deploy TFS in production environment
-export TFS_DEPLOY_PRODUCTION=${TFS_DEPLOY_PRODUCTION:-""}
+export DEPLOY_TSDB_MODE=${DEPLOY_TSDB_MODE:-""}
 
 # -----------------------------------------------------------
 # Global namespace for all deployments
@@ -108,7 +108,7 @@ kubectl rollout status deployment/"$RELEASE_NAME_PROM-server" -n "$NAMESPACE" ||
 
 
 # 2) Deploy Mimir
-if [ "$TFS_DEPLOY_PRODUCTION" == "YES" ]; then
+if [ "$DEPLOY_TSDB_MODE" == "YES" ]; then
     echo "Deploying Mimir in production mode."
     # You can add any production-specific configurations here if needed
     deploy_chart "$RELEASE_NAME_MIMIR" \
@@ -118,8 +118,7 @@ if [ "$TFS_DEPLOY_PRODUCTION" == "YES" ]; then
                 "$VALUES_FILE_MIMIR" \
                 "$NAMESPACE"
 
-    # Depending on how Mimir runs (StatefulSets, Deployments), you can wait for
-    # the correct resource to be ready. For example:
+    # you can wait for the resource to be ready.
     kubectl rollout status statefulset/"$RELEASE_NAME_MIMIR-distributor" -n "$NAMESPACE" || true
 fi
 
diff --git a/my_deploy.sh b/my_deploy.sh
index fdaab4723..7fd34d2f1 100644
--- a/my_deploy.sh
+++ b/my_deploy.sh
@@ -118,7 +118,7 @@ export TFS_GRAFANA_PASSWORD="admin123+"
 export TFS_SKIP_BUILD=""
 
 # Deploy TFS in production environment
-export TFS_DEPLOY_PRODUCTION=""
+export DEPLOY_TSDB_MODE=""
 
 # ----- CockroachDB ------------------------------------------------------------
 
-- 
GitLab


From 3b14aafe55b63612eb0e9f643b5317f625793801 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Wed, 5 Nov 2025 10:35:26 +0000
Subject: [PATCH 065/111] Tests - Tools - Firewall Agent:

- Update TODO.md file
- Update test commands
- Enable add/insert rules
- Enabled sorting of rules
- Factorized code for converting openconfig to NFT
---
 src/tests/tools/firewall_agent/docs/TODO.md   |  10 +
 .../firewall_agent/resources/ACLs.py          | 278 +++++++++---------
 .../resources/nft_model/Chain.py              |   6 +-
 .../resources/nft_model/NFTables.py           |  22 +-
 .../resources/nft_model/NFTablesCommand.py    |   8 +-
 .../resources/nft_model/Rule.py               |  45 ++-
 .../resources/nft_model/Table.py              |   6 +-
 .../scripts/data/oc_acl_block_30435_all.json  |  27 ++
 .../firewall_agent/scripts/test_commands.sh   |   3 +
 9 files changed, 237 insertions(+), 168 deletions(-)
 create mode 100644 src/tests/tools/firewall_agent/docs/TODO.md
 create mode 100644 src/tests/tools/firewall_agent/scripts/data/oc_acl_block_30435_all.json

diff --git a/src/tests/tools/firewall_agent/docs/TODO.md b/src/tests/tools/firewall_agent/docs/TODO.md
new file mode 100644
index 000000000..75a026986
--- /dev/null
+++ b/src/tests/tools/firewall_agent/docs/TODO.md
@@ -0,0 +1,10 @@
+# TODO
+
+- To block traffic to a MicroK8s service, apply rule:
+  `sudo nft add/insert rule ip filter FORWARD iifname "enp0s3" tcp dport 85 drop`
+
+  - when applying to ingress, also apply to FORWARD
+  - when applying to egress, also apply to FORWARD
+  - rules (INPUT, FORWARD, OUTPUT) should be applied based on sequence_id
+    - negative sequence_id => insert on top (first -1, then -2, then -3) so that order of rules is -3,-2,-1 at top of the chain
+    - positive sequence_id => append on bottom (first 0, then 1, then 2) so that order of rules is 0, 1, 2 at bottom of the chain
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/ACLs.py b/src/tests/tools/firewall_agent/firewall_agent/resources/ACLs.py
index 79772ad81..70424cf25 100644
--- a/src/tests/tools/firewall_agent/firewall_agent/resources/ACLs.py
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/ACLs.py
@@ -13,22 +13,88 @@
 # limitations under the License.
 
 
-import ipaddress, logging
+import logging
 from flask import request
 from flask_restful import Api, Resource, abort
 from typing import Dict, List, Set, Tuple
-from .nft_model.ActionEnum import ActionEnum, get_action_from_str
 from .nft_model.DirectionEnum import DirectionEnum
 from .nft_model.FamilyEnum import FamilyEnum
 from .nft_model.NFTables import NFTables
-from .nft_model.ProtocolEnum import ProtocolEnum, get_protocol_from_str
 from .nft_model.Rule import Rule
 from .nft_model.TableEnum import TableEnum
 
+
+LOGGER = logging.getLogger(__name__)
+
+
 BASE_URL_ROOT = '/restconf/data/openconfig-acl:acl'
 BASE_URL_ITEM = '/restconf/data/openconfig-acl:acl/acl-sets/acl-set='
 
-LOGGER = logging.getLogger(__name__)
+CHAIN_NAME_INPUT   = 'INPUT'
+CHAIN_NAME_FORWARD = 'FORWARD'
+CHAIN_NAME_OUTPUT  = 'OUTPUT'
+
+CHAINS_INPUT  = [CHAIN_NAME_INPUT, CHAIN_NAME_FORWARD]
+CHAINS_OUTPUT = [CHAIN_NAME_FORWARD, CHAIN_NAME_OUTPUT]
+CHAINS_ALL    = [CHAIN_NAME_INPUT, CHAIN_NAME_FORWARD, CHAIN_NAME_OUTPUT]
+
+TYPE_ACL_RULE_SEQ_ID    = Tuple[str, int]
+TYPE_IFACE_DIRECTION    = Tuple[str, DirectionEnum]
+TYPE_IFACE_DIRECTIONS   = List[TYPE_IFACE_DIRECTION]
+TYPE_ACL_RULE_TO_IF_DIR = Dict[TYPE_ACL_RULE_SEQ_ID, TYPE_IFACE_DIRECTIONS]
+
+def get_family_from_acl_set_type(acl_set_type : str) -> FamilyEnum:
+    return {
+        'ACL_IPV4' : FamilyEnum.IPV4,
+        'ACL_IPV6' : FamilyEnum.IPV6,
+    }[acl_set_type]
+
+class AclRuleToInterfaceDirection:
+    def __init__(self, nft : NFTables):
+        self._nft = nft
+        self._acl_rule_to_iface_direction : TYPE_ACL_RULE_TO_IF_DIR = dict()
+
+    def create_nft_chains_in_table(self, acl_set_type : str, chain_names : List[str]) -> None:
+        family = get_family_from_acl_set_type(acl_set_type)
+        table = self._nft.get_or_create_table(family, TableEnum.FILTER)
+        for chain_name in chain_names:
+            table.get_or_create_chain(chain_name)
+
+    def add_acl_set(self, if_name : str, acl_set : Dict, direction : DirectionEnum) -> None:
+        acl_set_name = acl_set['config']['set-name']
+        acl_set_type = acl_set['config']['type']
+
+        if direction == DirectionEnum.INGRESS:
+            self.create_nft_chains_in_table(acl_set_type, CHAINS_INPUT)
+        elif direction == DirectionEnum.EGRESS:
+            self.create_nft_chains_in_table(acl_set_type, CHAINS_OUTPUT)
+        else:
+            self.create_nft_chains_in_table(acl_set_type, CHAINS_ALL)
+
+        for acl_set_entry in acl_set['acl-entries']['acl-entry']:
+            sequence_id = int(acl_set_entry['sequence-id'])
+            key = (acl_set_name, sequence_id)
+            if_dir_list = self._acl_rule_to_iface_direction.setdefault(key, list())
+            if_dir_list.append((if_name, direction))
+
+    def add_interface(self, interface : Dict) -> None:
+        if_name = interface['config']['id']
+        for direction in [DirectionEnum.INGRESS, DirectionEnum.EGRESS]:
+            direction_value = direction.value
+            acl_sets_obj = interface.get(f'{direction_value}-acl-sets', dict())
+            acl_sets_lst = acl_sets_obj.get(f'{direction_value}-acl-set', list())
+            for acl_set in acl_sets_lst:
+                self.add_acl_set(if_name, acl_set, DirectionEnum.INGRESS)
+
+    def add_interfaces(self, interfaces : List[Dict]) -> None:
+        for interface in interfaces:
+            self.add_interface(interface)
+
+    def get_interfaces_directions(
+        self, acl_set_name : str, sequence_id : int
+    ) -> TYPE_IFACE_DIRECTIONS:
+        return self._acl_rule_to_iface_direction.get((acl_set_name, sequence_id), [])
+
 
 class ACLs(Resource):
     def get(self):
@@ -38,185 +104,103 @@ class ACLs(Resource):
 
     def post(self):
         payload = request.get_json(force=True)
-        # RESTCONF wrapper may be 'openconfig-acl:acl-set' or 'acl-set'
-        if not isinstance(payload, dict): abort(400, message='invalid payload')
-        if 'openconfig-acl:acl' in payload:
-            content = payload.get('openconfig-acl:acl')
-        elif 'acl' in payload:
-            content = payload.get('acl')
-        else:
+        if not isinstance(payload, dict):
             abort(400, message='invalid payload')
 
-        if not isinstance(content, dict): abort(400, message='invalid content')
+        content = payload.get('openconfig-acl:acl')
+        if content is None:
+            content = payload.get('acl')
+            if content is None:
+                abort(400, message='invalid payload')
 
+        if not isinstance(content, dict):
+            abort(400, message='invalid content')
+
+        interfaces = content['interfaces']['interface']
+        if not isinstance(interfaces, list):
+            abort(400, message='invalid interfaces')
 
         nft = NFTables()
 
-        interfaces = content['interfaces']['interface']
-        if not isinstance(interfaces, list): abort(400, message='invalid interfaces')
-        interfaces_struct : Dict[str, Dict[DirectionEnum, Dict[str, Set[int]]]] = dict()
-        acl_rule_to_iface_direction : Dict[Tuple[str, int], List[Tuple[str, DirectionEnum]]] = dict()
-        for interface in interfaces:
-            if_name = interface['config']['id']
-
-            ingress_acl_sets = interface.get('ingress-acl-sets', dict()).get('ingress-acl-set', list())
-            for ingress_acl_set in ingress_acl_sets:
-                acl_set_name = ingress_acl_set['config']['set-name']
-                acl_set_type = ingress_acl_set['config']['type']
-
-                family = {
-                    'ACL_IPV4' : FamilyEnum.IPV4,
-                    'ACL_IPV6' : FamilyEnum.IPV6,
-                }.get(acl_set_type)
-                table = nft.get_or_create_table(family, TableEnum.FILTER)
-                table.get_or_create_chain('input')
-
-                acl_set_sequence_ids = {
-                    int(acl_set_entry['sequence-id'])
-                    for acl_set_entry in ingress_acl_set['acl-entries']['acl-entry']
-                }
-
-                interfaces_struct.setdefault(if_name, dict())\
-                    .setdefault(DirectionEnum.INGRESS, dict())\
-                    .setdefault(acl_set_name, set())\
-                    .update(acl_set_sequence_ids)
-
-                for sequence_id in acl_set_sequence_ids:
-                    key = (acl_set_name, sequence_id)
-                    acl_rule_to_iface_direction.setdefault(key, list()).append((if_name, DirectionEnum.INGRESS))
-
-            egress_acl_sets = interface.get('egress-acl-sets', dict()).get('egress-acl-set', list())
-            for egress_acl_set in egress_acl_sets:
-                acl_set_name = egress_acl_set['config']['set-name']
-                acl_set_type = egress_acl_set['config']['type']
-
-                family = {
-                    'ACL_IPV4' : FamilyEnum.IPV4,
-                    'ACL_IPV6' : FamilyEnum.IPV6,
-                }.get(acl_set_type)
-                table = nft.get_or_create_table(family, TableEnum.FILTER)
-                table.get_or_create_chain('output')
-
-                acl_set_sequence_ids = {
-                    int(acl_set_entry['sequence-id'])
-                    for acl_set_entry in egress_acl_set['acl-entries']['acl-entry']
-                }
-
-                interfaces_struct.setdefault(if_name, dict())\
-                    .setdefault(DirectionEnum.EGRESS, dict())\
-                    .setdefault(acl_set_name, set())\
-                    .update(acl_set_sequence_ids)
-
-                for sequence_id in acl_set_sequence_ids:
-                    key = (acl_set_name, sequence_id)
-                    acl_rule_to_iface_direction.setdefault(key, list()).append((if_name, DirectionEnum.EGRESS))
+        arid = AclRuleToInterfaceDirection(nft)
+        arid.add_interfaces(interfaces)
 
         acl_sets = content['acl-sets']['acl-set']
-        if not isinstance(acl_sets, list): abort(400, message='invalid acl_sets')
+        if not isinstance(acl_sets, list):
+            abort(400, message='invalid acl_sets')
+
         for acl_set in acl_sets:
             acl_set_name = acl_set['config']['name']
             acl_set_type = acl_set['config']['type']
 
-            family = {
-                'ACL_IPV4' : FamilyEnum.IPV4,
-                'ACL_IPV6' : FamilyEnum.IPV6,
-            }.get(acl_set_type)
+            family = get_family_from_acl_set_type(acl_set_type)
+            table = TableEnum.FILTER
 
             for acl_entry in acl_set['acl-entries']['acl-entry']:
-                sequence_id = acl_entry['config']['sequence-id']
-                description = acl_entry['config']['description']
-                ipv4_config = acl_entry.get('ipv4', {}).get('config', {})
-                transp_config = acl_entry.get('transport', {}).get('config', {})
-
-                interfaces_directions = acl_rule_to_iface_direction[(acl_set_name, sequence_id)]
+                interfaces_directions = arid.get_interfaces_directions(
+                    acl_set_name, acl_entry['config']['sequence-id']
+                )
                 for if_name, direction in interfaces_directions:
-                    table = nft.get_or_create_table(family, TableEnum.FILTER)
-
                     if direction == DirectionEnum.INGRESS:
-                        rule = Rule(family=family, table=TableEnum.FILTER, chain='input')
-                        rule.input_if_name = if_name
-                        chain = table.get_or_create_chain('input')
+                        chain_list = CHAINS_INPUT
+                        input_if_name, output_if_name = if_name, None
                     elif direction == DirectionEnum.EGRESS:
-                        rule = Rule(family=family, table=TableEnum.FILTER, chain='output')
-                        rule.output_if_name = if_name
-                        chain = table.get_or_create_chain('output')
+                        chain_list = CHAINS_OUTPUT
+                        input_if_name, output_if_name = None, if_name
                     else:
                         raise Exception('Unsupported direction: {:s}'.format(str(direction)))
 
-                    rule.comment       = description
+                    for chain_name in chain_list:
+                        rule = Rule.from_openconfig(family, table, chain_name, acl_entry)
+                        rule.input_if_name = input_if_name
+                        rule.output_if_name = output_if_name
+                        nft.add_rule(rule)
 
-                    if 'source-address' in ipv4_config:
-                        rule.src_ip_addr = ipaddress.IPv4Interface(ipv4_config['source-address'])
+        entries = nft.dump()
+        for entry in entries:
+            LOGGER.warning('POST rules: {:s}'.format(str(entry)))
 
-                    if 'destination-address' in ipv4_config:
-                        rule.dst_ip_addr = ipaddress.IPv4Interface(ipv4_config['destination-address'])
+        nft.execute(verbose=True)
 
-                    if 'protocol' in ipv4_config:
-                        rule.ip_protocol = {
-                            'IP_TCP'  : ProtocolEnum.TCP,
-                            'IP_UDP'  : ProtocolEnum.UDP,
-                            'IP_ICMP' : ProtocolEnum.ICMP,
-                        }.get(ipv4_config['protocol'], None)
+        return {}, 201
 
-                    rule.src_port = transp_config.get('source-port')
-                    rule.dst_port = transp_config.get('destination-port')
 
-                    rule.action = {
-                        'ACCEPT' : ActionEnum.ACCEPT,
-                        'DROP'   : ActionEnum.DROP,
-                        'REJECT' : ActionEnum.REJECT,
-                    }.get(acl_entry['actions']['config']['forwarding-action'], None)
+def load_nftables_by_rule_comment(rule_comment : str) -> NFTables:
+    nft = NFTables()
+    nft.load(FamilyEnum.IPV4, TableEnum.FILTER)
 
-                    chain.rules.append(rule)
+    tables_to_remove : Set[Tuple[FamilyEnum, TableEnum]] = set()
+    for table_key, table in nft.tables.items():
 
-        entries = nft.dump()
-        for entry in entries:
-            LOGGER.warning('POST rules: {:s}'.format(str(entry)))
+        chains_to_remove : Set[str] = set()
+        for chain_name, chain in table.chains.items():
 
-        nft.execute(verbose=True)
+            for rule in reversed(chain.rules):
+                if rule.comment == rule_comment: continue
+                chain.rules.remove(rule) # not a rule of interest
 
-        return {}, 201
+            if len(chain.rules) > 0: continue
+            chains_to_remove.add(chain_name)
+
+        for chain_name in chains_to_remove:
+            table.chains.pop(chain_name)
+
+        if len(nft.tables) > 0: continue
+        tables_to_remove.add(table_key)
+
+    for table_key in tables_to_remove:
+        nft.tables.pop(table_key)
+
+    return nft
 
 
 class ACL(Resource):
     def get(self, name : str):
-        nft = NFTables()
-        nft.load(FamilyEnum.IPV4, TableEnum.FILTER)
-        tables_to_remove : Set[Tuple[FamilyEnum, TableEnum]] = set()
-        for table_key, table in nft.tables.items():
-            chains_to_remove : Set[str] = set()
-            for chain_name, chain in table.chains.items():
-                for rule in reversed(chain.rules):
-                    if rule.comment == name: continue
-                    chain.rules.remove(rule) # not a rule of interest
-                if len(chain.rules) > 0: continue
-                chains_to_remove.add(chain_name)
-            for chain_name in chains_to_remove:
-                table.chains.pop(chain_name)
-            if len(nft.tables) > 0: continue
-            tables_to_remove.add(table_key)
-        for table_key in tables_to_remove:
-            nft.tables.pop(table_key)
+        nft = load_nftables_by_rule_comment(name)
         return nft.to_openconfig(), 200
 
     def delete(self, name : str):
-        nft = NFTables()
-        nft.load(FamilyEnum.IPV4, TableEnum.FILTER)
-        tables_to_remove : Set[Tuple[FamilyEnum, TableEnum]] = set()
-        for table_key, table in nft.tables.items():
-            chains_to_remove : Set[str] = set()
-            for chain_name, chain in table.chains.items():
-                for rule in reversed(chain.rules):
-                    if rule.comment == name: continue
-                    chain.rules.remove(rule) # not a rule of interest
-                if len(chain.rules) > 0: continue
-                chains_to_remove.add(chain_name)
-            for chain_name in chains_to_remove:
-                table.chains.pop(chain_name)
-            if len(nft.tables) > 0: continue
-            tables_to_remove.add(table_key)
-        for table_key in tables_to_remove:
-            nft.tables.pop(table_key)
+        nft = load_nftables_by_rule_comment(name)
         nft.execute(removal=True, verbose=True)
         return {}, 204
 
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py
index 53db9463f..7062fea25 100644
--- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py
@@ -74,8 +74,8 @@ class Chain:
         for rule in self.rules: entries.extend(rule.dump())
         return entries
 
-    def get_commands(self, removal : bool = False) -> List[str]:
-        commands : List[Dict] = list()
+    def get_commands(self, removal : bool = False) -> List[Tuple[int, str]]:
+        commands : List[Tuple[int, str]] = list()
         if removal:
             # NOTE: For now, do not remove chains. We do not process all kinds of
             # chains and their removal might cause side effects on NFTables.
@@ -88,7 +88,7 @@ class Chain:
                 'policy', 'accept', ';',
                 '}'
             ]
-            commands.append(' '.join(parts))
+            commands.append(-1, ' '.join(parts))
         for rule in self.rules:
             commands.append(rule.get_command(removal=removal))
         return commands
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTables.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTables.py
index a1c0b6d90..1d13aa93b 100644
--- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTables.py
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTables.py
@@ -15,11 +15,13 @@
 
 import logging
 from dataclasses import dataclass, field
+import operator
 from typing import Dict, List, Optional, Set, Tuple
 from .DirectionEnum import DirectionEnum
 from .Exceptions import UnsupportedElementException
 from .FamilyEnum import FamilyEnum, get_family_from_str
 from .NFTablesCommand import NFTablesCommand
+from .Rule import Rule
 from .Table import Table
 from .TableEnum import TableEnum, get_table_from_str
 
@@ -38,10 +40,6 @@ class NFTables:
         entries = NFTablesCommand.list(family=family, table=table, chain=chain)
         for entry in entries: self.parse_entry(entry)
 
-    def execute(self, removal : bool = False, verbose : bool = True) -> None:
-        commands = self.get_commands(removal=removal)
-        NFTablesCommand.execute(commands, verbose=verbose)
-
     def get_or_create_table(self, family : FamilyEnum, table : TableEnum) -> Table:
         return self.tables.setdefault((family, table), Table(family, table))
 
@@ -82,6 +80,11 @@ class NFTables:
         if table not in {TableEnum.FILTER}: return
         self.get_or_create_table(family, table).add_rule_by_entry(entry)
 
+    def add_rule(self, rule : Rule) -> None:
+        table = self.get_or_create_table(rule.family, rule.table)
+        chain = table.get_or_create_chain(rule.chain)
+        chain.rules.append(rule)
+
     def to_openconfig(self) -> List[Dict]:
         acl_sets : List[Dict] = list()
         interfaces_struct : Dict[str, Dict[DirectionEnum, Dict[str, Set[int]]]] = dict()
@@ -146,8 +149,13 @@ class NFTables:
         for table in self.tables.values(): entries.extend(table.dump())
         return entries
 
-    def get_commands(self, removal : bool = False) -> List[str]:
-        commands : List[Dict] = list()
+    def get_commands(self, removal : bool = False) -> List[Tuple[int, str]]:
+        commands : List[Tuple[int, str]] = list()
         for table in self.tables.values():
             commands.extend(table.get_commands(removal=removal))
-        return commands
+        # return a sorted list of commands by their priority (lower first)
+        return sorted(commands, key=operator.itemgetter(0))
+
+    def execute(self, removal : bool = False, verbose : bool = True) -> None:
+        commands = self.get_commands(removal=removal)
+        NFTablesCommand.execute(commands, verbose=verbose)
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesCommand.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesCommand.py
index 0b3170aee..983acf506 100644
--- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesCommand.py
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesCommand.py
@@ -14,7 +14,7 @@
 
 
 import json, logging, nftables
-from typing import Dict, List, Optional
+from typing import Dict, List, Optional, Tuple
 from .Exceptions import (
     InvalidArgumentException, MalformedOutputException, RuntimeException
 )
@@ -67,12 +67,12 @@ class NFTablesCommand:
         return json_nftables['nftables']
 
     @staticmethod
-    def execute(commands : List[str], verbose : bool = True) -> None:
+    def execute(commands : List[Tuple[int, str]], verbose : bool = True) -> None:
         nft = nftables.Nftables()
         nft.set_json_output(True)
-        for command in commands:
+        for priority, command in commands:
             if verbose:
-                LOGGER.info(f'Executing: {command}')
+                LOGGER.info(f'Executing [priority={str(priority)}]: {command}')
             rc, output, error = nft.cmd(command)
             if verbose:
                 LOGGER.info(f'rc={str(rc)} output={str(output)} error={str(error)}')
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py
index 301dc1346..25d3ed3b6 100644
--- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py
@@ -35,6 +35,8 @@ class Rule:
     chain          : str
     handle         : Optional[int] = None
 
+    sequence_id    : int           = 0
+
     input_if_name  : Optional[str] = None
     output_if_name : Optional[str] = None
     src_ip_addr    : Optional[ipaddress.IPv4Interface] = None
@@ -51,7 +53,6 @@ class Rule:
     def from_nft_entry(
         cls, family : FamilyEnum, table : TableEnum, chain : str, entry : Dict
     ) -> 'Rule':
-        print(entry)
         rule : 'Rule' = cls(family, table, chain)
 
         if 'expr' not in entry: raise MissingFieldException('rule.expr', entry)
@@ -71,6 +72,41 @@ class Rule:
         rule.handle = entry['handle']
         return rule
 
+    @classmethod
+    def from_openconfig(
+        cls, family : FamilyEnum, table : TableEnum, chain : str, acl_entry : Dict
+    ) -> 'Rule':
+        rule : 'Rule' = cls(family, table, chain)
+
+        rule.sequence_id = int(acl_entry['config']['sequence-id'])
+        rule.comment = acl_entry['config']['description']
+
+        ipv4_config = acl_entry.get('ipv4', {}).get('config', {})
+        if 'source-address' in ipv4_config:
+            rule.src_ip_addr = ipaddress.IPv4Interface(ipv4_config['source-address'])
+
+        if 'destination-address' in ipv4_config:
+            rule.dst_ip_addr = ipaddress.IPv4Interface(ipv4_config['destination-address'])
+
+        if 'protocol' in ipv4_config:
+            rule.ip_protocol = {
+                'IP_TCP'  : ProtocolEnum.TCP,
+                'IP_UDP'  : ProtocolEnum.UDP,
+                'IP_ICMP' : ProtocolEnum.ICMP,
+            }.get(ipv4_config['protocol'], None)
+
+        transp_config = acl_entry.get('transport', {}).get('config', {})
+        rule.src_port = transp_config.get('source-port')
+        rule.dst_port = transp_config.get('destination-port')
+
+        rule.action = {
+            'ACCEPT' : ActionEnum.ACCEPT,
+            'DROP'   : ActionEnum.DROP,
+            'REJECT' : ActionEnum.REJECT,
+        }.get(acl_entry['actions']['config']['forwarding-action'], None)
+
+        return rule
+
     def to_openconfig(self, sequence_id : int) -> Tuple[Dict, Dict]:
         acl_entry_config = {'sequence-id': sequence_id}
         if self.comment is not None: acl_entry_config['description'] = self.comment
@@ -180,7 +216,7 @@ class Rule:
         if self.handle is not None: rule['handle'] = self.handle
         return [{'rule': rule}]
 
-    def get_command(self, removal : bool = False) -> str:
+    def get_command(self, removal : bool = False) -> Tuple[int, str]:
         if removal:
             if self.handle is None: raise MissingFieldException('handle', asdict(self))
             parts = [
@@ -189,7 +225,8 @@ class Rule:
                 'handle', str(self.handle)
             ]
         else:
-            parts = ['add', 'rule', self.family.value, self.table.value, self.chain]
+            verb = 'add' if self.sequence_id < 1000 else 'insert'
+            parts = [verb, 'rule', self.family.value, self.table.value, self.chain]
             if self.input_if_name is not None: parts.extend(['iifname', self.input_if_name])
             if self.output_if_name is not None: parts.extend(['oifname', self.output_if_name])
             if self.src_ip_addr is not None: parts.extend(['ip', 'saddr', str(self.src_ip_addr)])
@@ -198,4 +235,4 @@ class Rule:
             if self.dst_port is not None: parts.extend([self.ip_protocol.value, 'dport', str(self.dst_port)])
             if self.action is not None: parts.append(self.action.value)
             if self.comment is not None: parts.extend(['comment', f'"{self.comment}"'])
-        return ' '.join(parts)
+        return self.sequence_id, ' '.join(parts)
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py
index 2d2b07884..b9d1fa86f 100644
--- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py
@@ -72,15 +72,15 @@ class Table:
         for chain in self.chains.values(): entries.extend(chain.dump())
         return entries
 
-    def get_commands(self, removal : bool = False) -> List[str]:
-        commands : List[Dict] = list()
+    def get_commands(self, removal : bool = False) -> List[Tuple[int, str]]:
+        commands : List[Tuple[int, str]] = list()
         if removal:
             # NOTE: For now, do not remove tables. We do not process all kinds of
             # tables and their removal might cause side effects on NFTables.
             pass
         else:
             parts = ['add', 'table', self.family.value, self.table.value]
-            commands.append(' '.join(parts))
+            commands.append(-2, ' '.join(parts))
         for chain in self.chains.values():
             commands.extend(chain.get_commands(removal=removal))
         return commands
diff --git a/src/tests/tools/firewall_agent/scripts/data/oc_acl_block_30435_all.json b/src/tests/tools/firewall_agent/scripts/data/oc_acl_block_30435_all.json
new file mode 100644
index 000000000..5e50f560a
--- /dev/null
+++ b/src/tests/tools/firewall_agent/scripts/data/oc_acl_block_30435_all.json
@@ -0,0 +1,27 @@
+{"openconfig-acl:acl": {
+    "acl-sets": {"acl-set": [{
+        "name": "ip-filter-input", "type": "ACL_IPV4",
+        "config": {"name": "ip-filter-input", "type": "ACL_IPV4"},
+        "acl-entries": {"acl-entry": [
+            {
+                "sequence-id": 1,
+                "config": {"sequence-id": 1, "description": "drop-30435-all"},
+                "ipv4": {"config": {"protocol": "IP_TCP"}},
+                "transport": {"config": {"destination-port": 30435}},
+                "actions": {"config": {"forwarding-action": "DROP"}}
+            }
+        ]}
+    }]},
+    "interfaces": {"interface": [{
+        "id": "enp0s3",
+        "config": {"id": "enp0s3"},
+        "interface-ref": {"config": {"interface": "enp0s3", "subinterface": 1}},
+        "ingress-acl-sets": {"ingress-acl-set": [
+            {
+                "set-name": "ip-filter-input", "type": "ACL_IPV4",
+                "config": {"set-name": "ip-filter-input", "type": "ACL_IPV4"},
+                "acl-entries": {"acl-entry": [{"sequence-id": 1}]}
+            }
+        ]}
+    }]}
+}}
diff --git a/src/tests/tools/firewall_agent/scripts/test_commands.sh b/src/tests/tools/firewall_agent/scripts/test_commands.sh
index 25438b2d5..9db629ff9 100755
--- a/src/tests/tools/firewall_agent/scripts/test_commands.sh
+++ b/src/tests/tools/firewall_agent/scripts/test_commands.sh
@@ -30,3 +30,6 @@ wget -q -O- http://localhost:8002
 
 curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=drop-8001-host
 curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=drop-8002-ext
+
+curl -X POST -d @scripts/data/oc_acl_block_30435_all.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl
+curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=drop-30435-all
-- 
GitLab


From e2f1246a60b1262c7204d36ca6acfab9bf7bb236 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Wed, 5 Nov 2025 10:38:41 +0000
Subject: [PATCH 066/111] Tests - Tools - Firewall Agent:

- Update example commands
---
 src/tests/tools/firewall_agent/docs/Docs-and-Commands.md | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/tests/tools/firewall_agent/docs/Docs-and-Commands.md b/src/tests/tools/firewall_agent/docs/Docs-and-Commands.md
index 7dd08a844..4f420ed0a 100644
--- a/src/tests/tools/firewall_agent/docs/Docs-and-Commands.md
+++ b/src/tests/tools/firewall_agent/docs/Docs-and-Commands.md
@@ -9,6 +9,10 @@
 ## Example Commands:
 
 ```bash
+
+# WORKS to block traffic:
+sudo nft insert rule ip filter FORWARD iifname "enp0s3" tcp dport 85 drop
+
 sudo nft add table ip filter
 sudo nft add chain ip filter input  {type filter hook input priority filter ; policy accept; }
 sudo nft add chain ip filter output {type filter hook output priority filter; policy accept; }
-- 
GitLab


From 6ba95b23f866a14dbca6a150c8918f6171b9e62b Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Wed, 5 Nov 2025 13:59:32 +0000
Subject: [PATCH 067/111] Pre-merge code cleanup

---
 deploy/all.sh        | 17 +++++++++++++++++
 deploy/monitoring.sh | 21 ++++++++++++++++++---
 my_deploy.sh         | 10 ++++++++--
 3 files changed, 43 insertions(+), 5 deletions(-)

diff --git a/deploy/all.sh b/deploy/all.sh
index 85e27a640..cd33ff516 100755
--- a/deploy/all.sh
+++ b/deploy/all.sh
@@ -213,6 +213,23 @@ export QDB_DROP_TABLES_IF_EXIST=${QDB_DROP_TABLES_IF_EXIST:-""}
 export QDB_REDEPLOY=${QDB_REDEPLOY:-""}
 
 
+# ----- Time Series Storage - Prometheus / Grafana Mimir -----------------------
+
+# If not already set, set Time Series Storage installation mode. Accepted values are:
+# 'single' and 'cluster'.
+# - If TSDB_DEPLOY_MODE is "single", Time Series Storage is deployed in single node
+#   mode and features a basic Prometheus instance. It is convenient for development and
+#   testing purposes and should fit in a VM.
+#   IT SHOULD NOT BE USED IN PRODUCTION ENVIRONMENTS.
+# - If TSDB_DEPLOY_MODE is "cluster", Time Series Storage is deployed in cluster mode
+#   and a Grafana Mimir database in cluster mode will be deployed. It is convenient for
+#   production and provides scalability features. If you are deploying for production,
+#   also read the following link providing details on deploying Grafana Mimir for
+#   production environments:
+#   Ref: https://grafana.com/docs/mimir/latest/manage/run-production-environment/
+export TSDB_DEPLOY_MODE=${TSDB_DEPLOY_MODE:-"single"}
+
+
 # ----- K8s Observability ------------------------------------------------------
 
 # If not already set, set the external port Prometheus Mgmt HTTP GUI interface will be exposed to.
diff --git a/deploy/monitoring.sh b/deploy/monitoring.sh
index 74b245684..a577c432f 100755
--- a/deploy/monitoring.sh
+++ b/deploy/monitoring.sh
@@ -15,8 +15,23 @@
 
 set -euo pipefail
 
-# Deploy TFS in production environment
-export DEPLOY_TSDB_MODE=${DEPLOY_TSDB_MODE:-""}
+
+# ----- Time Series Storage - Prometheus / Grafana Mimir -----------------------
+
+# If not already set, set Time Series Storage installation mode. Accepted values are:
+# 'single' and 'cluster'.
+# - If TSDB_DEPLOY_MODE is "single", Time Series Storage is deployed in single node
+#   mode and features a basic Prometheus instance. It is convenient for development and
+#   testing purposes and should fit in a VM.
+#   IT SHOULD NOT BE USED IN PRODUCTION ENVIRONMENTS.
+# - If TSDB_DEPLOY_MODE is "cluster", Time Series Storage is deployed in cluster mode
+#   and a Grafana Mimir database in cluster mode will be deployed. It is convenient for
+#   production and provides scalability features. If you are deploying for production,
+#   also read the following link providing details on deploying Grafana Mimir for
+#   production environments:
+#   Ref: https://grafana.com/docs/mimir/latest/manage/run-production-environment/
+export TSDB_DEPLOY_MODE=${TSDB_DEPLOY_MODE:-"single"}
+
 
 # -----------------------------------------------------------
 # Global namespace for all deployments
@@ -108,7 +123,7 @@ kubectl rollout status deployment/"$RELEASE_NAME_PROM-server" -n "$NAMESPACE" ||
 
 
 # 2) Deploy Mimir
-if [ "$DEPLOY_TSDB_MODE" == "YES" ]; then
+if [ "$TSDB_DEPLOY_MODE" == "cluster" ]; then
     echo "Deploying Mimir in production mode."
     # You can add any production-specific configurations here if needed
     deploy_chart "$RELEASE_NAME_MIMIR" \
diff --git a/my_deploy.sh b/my_deploy.sh
index a285fb0fe..24e1f6902 100644
--- a/my_deploy.sh
+++ b/my_deploy.sh
@@ -120,8 +120,6 @@ export TFS_GRAFANA_PASSWORD="admin123+"
 # Disable skip-build flag to rebuild the Docker images.
 export TFS_SKIP_BUILD=""
 
-# Deploy TFS in production environment
-export DEPLOY_TSDB_MODE=""
 
 # ----- CockroachDB ------------------------------------------------------------
 
@@ -219,6 +217,14 @@ export QDB_DROP_TABLES_IF_EXIST=""
 export QDB_REDEPLOY=""
 
 
+# ----- Time Series Storage - Prometheus / Grafana Mimir -----------------------
+
+# Set Time Series Storage installation mode to 'single' (i.e., Prometheus only).
+# This option is convenient for development and testing. See ./deploy/all.sh or
+# ./deploy/monitoring.sh for additional details.
+export TSDB_DEPLOY_MODE="single"
+
+
 # ----- K8s Observability ------------------------------------------------------
 
 # Set the external port Prometheus Mgmt HTTP GUI interface will be exposed to.
-- 
GitLab


From cc5833f5a062e982fb1358bcb36426f610bc16bf Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Wed, 5 Nov 2025 14:16:37 +0000
Subject: [PATCH 068/111] Tests - Tools - Firewall Agent:

- Updated example commands
- Fixed chain priorities to "raw"
- Fixed add/insert decission threshold
- Added parsing of forward and prerouting tables
- Separated ACLs.py into 2 files for clarity
---
 .../firewall_agent/docs/Docs-and-Commands.md  | 29 +++++-
 .../firewall_agent/resources/ACLs.py          | 71 +-------------
 .../resources/AclRuleToInterfaceDirection.py  | 98 +++++++++++++++++++
 .../resources/nft_model/Chain.py              |  3 +-
 .../resources/nft_model/Rule.py               |  4 +-
 .../resources/nft_model/Table.py              |  4 +-
 6 files changed, 137 insertions(+), 72 deletions(-)
 create mode 100644 src/tests/tools/firewall_agent/firewall_agent/resources/AclRuleToInterfaceDirection.py

diff --git a/src/tests/tools/firewall_agent/docs/Docs-and-Commands.md b/src/tests/tools/firewall_agent/docs/Docs-and-Commands.md
index 4f420ed0a..2c133c875 100644
--- a/src/tests/tools/firewall_agent/docs/Docs-and-Commands.md
+++ b/src/tests/tools/firewall_agent/docs/Docs-and-Commands.md
@@ -9,9 +9,34 @@
 ## Example Commands:
 
 ```bash
+sudo nft --interactive --handle
 
-# WORKS to block traffic:
-sudo nft insert rule ip filter FORWARD iifname "enp0s3" tcp dport 85 drop
+# WORKS to block traffic, but weird as external facing port is 30435, not 85
+insert rule ip filter FORWARD iifname "enp0s3" tcp dport 85 drop
+
+# WORKS to block/allow traffic by external facing port 30435
+add table ip filter
+add chain ip filter PREROUTING { type filter hook prerouting priority raw; policy accept; }
+add rule ip filter PREROUTING tcp dport 30435 reject
+insert rule ip filter PREROUTING ip saddr 10.0.2.2/32 tcp dport 30435 accept
+insert rule ip filter PREROUTING ip saddr 10.0.2.10/32 tcp dport 30435 accept
+
+list chain ip filter PREROUTING
+table ip filter {
+        chain PREROUTING { # handle 30
+                type filter hook prerouting priority raw; policy accept;
+                ip saddr 10.0.2.10 tcp dport 30435 accept # handle 34
+                ip saddr 10.0.2.2 tcp dport 30435 accept # handle 33
+                tcp dport 30435 reject # handle 31
+        }
+}
+
+delete rule ip filter PREROUTING handle 34
+delete rule ip filter PREROUTING handle 33
+delete rule ip filter PREROUTING handle 31
+
+
+# =============================
 
 sudo nft add table ip filter
 sudo nft add chain ip filter input  {type filter hook input priority filter ; policy accept; }
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/ACLs.py b/src/tests/tools/firewall_agent/firewall_agent/resources/ACLs.py
index 70424cf25..b947215d0 100644
--- a/src/tests/tools/firewall_agent/firewall_agent/resources/ACLs.py
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/ACLs.py
@@ -16,12 +16,16 @@
 import logging
 from flask import request
 from flask_restful import Api, Resource, abort
-from typing import Dict, List, Set, Tuple
+from typing import Set, Tuple
 from .nft_model.DirectionEnum import DirectionEnum
 from .nft_model.FamilyEnum import FamilyEnum
 from .nft_model.NFTables import NFTables
 from .nft_model.Rule import Rule
 from .nft_model.TableEnum import TableEnum
+from .AclRuleToInterfaceDirection import (
+    CHAINS_INPUT, CHAINS_OUTPUT, AclRuleToInterfaceDirection,
+    get_family_from_acl_set_type
+)
 
 
 LOGGER = logging.getLogger(__name__)
@@ -30,71 +34,6 @@ LOGGER = logging.getLogger(__name__)
 BASE_URL_ROOT = '/restconf/data/openconfig-acl:acl'
 BASE_URL_ITEM = '/restconf/data/openconfig-acl:acl/acl-sets/acl-set='
 
-CHAIN_NAME_INPUT   = 'INPUT'
-CHAIN_NAME_FORWARD = 'FORWARD'
-CHAIN_NAME_OUTPUT  = 'OUTPUT'
-
-CHAINS_INPUT  = [CHAIN_NAME_INPUT, CHAIN_NAME_FORWARD]
-CHAINS_OUTPUT = [CHAIN_NAME_FORWARD, CHAIN_NAME_OUTPUT]
-CHAINS_ALL    = [CHAIN_NAME_INPUT, CHAIN_NAME_FORWARD, CHAIN_NAME_OUTPUT]
-
-TYPE_ACL_RULE_SEQ_ID    = Tuple[str, int]
-TYPE_IFACE_DIRECTION    = Tuple[str, DirectionEnum]
-TYPE_IFACE_DIRECTIONS   = List[TYPE_IFACE_DIRECTION]
-TYPE_ACL_RULE_TO_IF_DIR = Dict[TYPE_ACL_RULE_SEQ_ID, TYPE_IFACE_DIRECTIONS]
-
-def get_family_from_acl_set_type(acl_set_type : str) -> FamilyEnum:
-    return {
-        'ACL_IPV4' : FamilyEnum.IPV4,
-        'ACL_IPV6' : FamilyEnum.IPV6,
-    }[acl_set_type]
-
-class AclRuleToInterfaceDirection:
-    def __init__(self, nft : NFTables):
-        self._nft = nft
-        self._acl_rule_to_iface_direction : TYPE_ACL_RULE_TO_IF_DIR = dict()
-
-    def create_nft_chains_in_table(self, acl_set_type : str, chain_names : List[str]) -> None:
-        family = get_family_from_acl_set_type(acl_set_type)
-        table = self._nft.get_or_create_table(family, TableEnum.FILTER)
-        for chain_name in chain_names:
-            table.get_or_create_chain(chain_name)
-
-    def add_acl_set(self, if_name : str, acl_set : Dict, direction : DirectionEnum) -> None:
-        acl_set_name = acl_set['config']['set-name']
-        acl_set_type = acl_set['config']['type']
-
-        if direction == DirectionEnum.INGRESS:
-            self.create_nft_chains_in_table(acl_set_type, CHAINS_INPUT)
-        elif direction == DirectionEnum.EGRESS:
-            self.create_nft_chains_in_table(acl_set_type, CHAINS_OUTPUT)
-        else:
-            self.create_nft_chains_in_table(acl_set_type, CHAINS_ALL)
-
-        for acl_set_entry in acl_set['acl-entries']['acl-entry']:
-            sequence_id = int(acl_set_entry['sequence-id'])
-            key = (acl_set_name, sequence_id)
-            if_dir_list = self._acl_rule_to_iface_direction.setdefault(key, list())
-            if_dir_list.append((if_name, direction))
-
-    def add_interface(self, interface : Dict) -> None:
-        if_name = interface['config']['id']
-        for direction in [DirectionEnum.INGRESS, DirectionEnum.EGRESS]:
-            direction_value = direction.value
-            acl_sets_obj = interface.get(f'{direction_value}-acl-sets', dict())
-            acl_sets_lst = acl_sets_obj.get(f'{direction_value}-acl-set', list())
-            for acl_set in acl_sets_lst:
-                self.add_acl_set(if_name, acl_set, DirectionEnum.INGRESS)
-
-    def add_interfaces(self, interfaces : List[Dict]) -> None:
-        for interface in interfaces:
-            self.add_interface(interface)
-
-    def get_interfaces_directions(
-        self, acl_set_name : str, sequence_id : int
-    ) -> TYPE_IFACE_DIRECTIONS:
-        return self._acl_rule_to_iface_direction.get((acl_set_name, sequence_id), [])
-
 
 class ACLs(Resource):
     def get(self):
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/AclRuleToInterfaceDirection.py b/src/tests/tools/firewall_agent/firewall_agent/resources/AclRuleToInterfaceDirection.py
new file mode 100644
index 000000000..6f2668fd0
--- /dev/null
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/AclRuleToInterfaceDirection.py
@@ -0,0 +1,98 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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, List, Tuple
+from .nft_model.DirectionEnum import DirectionEnum
+from .nft_model.FamilyEnum import FamilyEnum
+from .nft_model.NFTables import NFTables
+from .nft_model.TableEnum import TableEnum
+
+
+TYPE_ACL_RULE_SEQ_ID    = Tuple[str, int]
+TYPE_IFACE_DIRECTION    = Tuple[str, DirectionEnum]
+TYPE_IFACE_DIRECTIONS   = List[TYPE_IFACE_DIRECTION]
+TYPE_ACL_RULE_TO_IF_DIR = Dict[TYPE_ACL_RULE_SEQ_ID, TYPE_IFACE_DIRECTIONS]
+
+
+CHAIN_NAME_PREROUTING  = 'PREROUTING'
+CHAIN_NAME_INPUT       = 'INPUT'
+CHAIN_NAME_FORWARD     = 'FORWARD'
+CHAIN_NAME_OUTPUT      = 'OUTPUT'
+CHAIN_NAME_POSTROUTING = 'POSTROUTING'
+
+CHAINS_INPUT  = [
+    CHAIN_NAME_PREROUTING, CHAIN_NAME_INPUT, CHAIN_NAME_FORWARD
+]
+CHAINS_OUTPUT = [
+    CHAIN_NAME_FORWARD, CHAIN_NAME_OUTPUT, CHAIN_NAME_POSTROUTING
+]
+CHAINS_ALL    = [
+    CHAIN_NAME_PREROUTING, CHAIN_NAME_INPUT, CHAIN_NAME_FORWARD,
+    CHAIN_NAME_OUTPUT, CHAIN_NAME_POSTROUTING
+]
+
+
+def get_family_from_acl_set_type(acl_set_type : str) -> FamilyEnum:
+    return {
+        'ACL_IPV4' : FamilyEnum.IPV4,
+        'ACL_IPV6' : FamilyEnum.IPV6,
+    }[acl_set_type]
+
+
+class AclRuleToInterfaceDirection:
+    def __init__(self, nft : NFTables):
+        self._nft = nft
+        self._acl_rule_to_iface_direction : TYPE_ACL_RULE_TO_IF_DIR = dict()
+
+    def create_nft_chains_in_table(self, acl_set_type : str, chain_names : List[str]) -> None:
+        family = get_family_from_acl_set_type(acl_set_type)
+        table = self._nft.get_or_create_table(family, TableEnum.FILTER)
+        for chain_name in chain_names:
+            table.get_or_create_chain(chain_name)
+
+    def add_acl_set(self, if_name : str, acl_set : Dict, direction : DirectionEnum) -> None:
+        acl_set_name = acl_set['config']['set-name']
+        acl_set_type = acl_set['config']['type']
+
+        if direction == DirectionEnum.INGRESS:
+            self.create_nft_chains_in_table(acl_set_type, CHAINS_INPUT)
+        elif direction == DirectionEnum.EGRESS:
+            self.create_nft_chains_in_table(acl_set_type, CHAINS_OUTPUT)
+        else:
+            self.create_nft_chains_in_table(acl_set_type, CHAINS_ALL)
+
+        for acl_set_entry in acl_set['acl-entries']['acl-entry']:
+            sequence_id = int(acl_set_entry['sequence-id'])
+            key = (acl_set_name, sequence_id)
+            if_dir_list = self._acl_rule_to_iface_direction.setdefault(key, list())
+            if_dir_list.append((if_name, direction))
+
+    def add_interface(self, interface : Dict) -> None:
+        if_name = interface['config']['id']
+        for direction in [DirectionEnum.INGRESS, DirectionEnum.EGRESS]:
+            direction_value = direction.value
+            acl_sets_obj = interface.get(f'{direction_value}-acl-sets', dict())
+            acl_sets_lst = acl_sets_obj.get(f'{direction_value}-acl-set', list())
+            for acl_set in acl_sets_lst:
+                self.add_acl_set(if_name, acl_set, DirectionEnum.INGRESS)
+
+    def add_interfaces(self, interfaces : List[Dict]) -> None:
+        for interface in interfaces:
+            self.add_interface(interface)
+
+    def get_interfaces_directions(
+        self, acl_set_name : str, sequence_id : int
+    ) -> TYPE_IFACE_DIRECTIONS:
+        return self._acl_rule_to_iface_direction.get((acl_set_name, sequence_id), [])
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py
index 7062fea25..cb43a1f8a 100644
--- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py
@@ -81,10 +81,11 @@ class Chain:
             # chains and their removal might cause side effects on NFTables.
             pass
         else:
+            #chain_hook = str(self.chain).lower()
             parts = [
                 'add', 'chain', self.family.value, self.table.value, self.chain,
                 '{',
-                'type', self.table.value, 'hook', self.chain, 'priority', self.table.value, ';',
+                'type', self.table.value, 'hook', self.chain, 'priority', 'raw', ';',
                 'policy', 'accept', ';',
                 '}'
             ]
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py
index 25d3ed3b6..cdfd1075f 100644
--- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py
@@ -225,7 +225,9 @@ class Rule:
                 'handle', str(self.handle)
             ]
         else:
-            verb = 'add' if self.sequence_id < 1000 else 'insert'
+            # NOTE: if sequence_id < 10000: insert the rules to the top;
+            # otherwise, append to the bottom. Anyways, sort rules by sequence_id.
+            verb = 'insert' if self.sequence_id < 10000 else 'add'
             parts = [verb, 'rule', self.family.value, self.table.value, self.chain]
             if self.input_if_name is not None: parts.extend(['iifname', self.input_if_name])
             if self.output_if_name is not None: parts.extend(['oifname', self.output_if_name])
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py
index b9d1fa86f..10289a0ec 100644
--- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py
@@ -33,14 +33,14 @@ class Table:
 
     def add_chain_by_entry(self, entry : Dict) -> Chain:
         name : str = entry.pop('name')
-        if name.lower() not in {'input', 'output'}: return None
+        if name.lower() not in {'input', 'output', 'forward', 'prerouting'}: return None
         chain_obj = self.get_or_create_chain(name)
         chain_obj.handle = entry['handle']
         return chain_obj
 
     def add_rule_by_entry(self, entry : Dict) -> None:
         chain : str = entry.pop('chain')
-        if chain.lower() not in {'input', 'output'}: return
+        if chain.lower() not in {'input', 'output', 'forward', 'prerouting'}: return
         self.get_or_create_chain(chain).add_rule(entry)
 
     def to_openconfig(self) -> Tuple[List[Dict], Dict]:
-- 
GitLab


From 19c6585fbdfa6d1d3c8fcb193393128220dede84 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Wed, 5 Nov 2025 15:03:48 +0000
Subject: [PATCH 069/111] Tests - Tools - Firewall Agent:

- Fixed composition of OpenConfig Interfaces
---
 .../tools/firewall_agent/firewall_agent/resources/Interfaces.py  | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/Interfaces.py b/src/tests/tools/firewall_agent/firewall_agent/resources/Interfaces.py
index 6a33f70b9..4c8d9e307 100644
--- a/src/tests/tools/firewall_agent/firewall_agent/resources/Interfaces.py
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/Interfaces.py
@@ -31,6 +31,7 @@ class Interfaces(Resource):
             if_state = copy.deepcopy(if_config)
             if_state.update({'admin-status': 'UP', 'oper-status': 'UP'})
             if_data = {'name': if_name, 'config': if_config, 'state': if_state}
+            if_list.append(if_data)
 
             sif_index = 1
             sif_config = {'index': sif_index, 'enabled': True}
-- 
GitLab


From 72e8cd84c0c29c4a290129dd56cc4af4ce3519ac Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Wed, 5 Nov 2025 15:07:00 +0000
Subject: [PATCH 070/111] Tests - Tools - Firewall Agent:

- Skipped counter rule entry types
---
 .../firewall_agent/firewall_agent/resources/nft_model/Rule.py   | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py
index cdfd1075f..a7a0ab4bb 100644
--- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py
@@ -65,6 +65,8 @@ class Rule:
                 parse_nft_match(rule, match)
             elif expr_entry_type in {'accept', 'drop', 'reject'}:
                 rule.action = get_action_from_str(expr_entry_type)
+            elif expr_entry_type in {'counter'}:
+                pass # ignore these entry types
             else:
                 raise UnsupportedElementException('expr_entry', expr_entry)
 
-- 
GitLab


From e4be98d39fe93a1ca18d39bec6dbe54ef3691cc1 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Wed, 5 Nov 2025 15:21:07 +0000
Subject: [PATCH 071/111] Tests - Tools - Firewall Agent:

- Skipped rules with unsupported fields
---
 .../firewall_agent/resources/nft_model/Chain.py      |  4 +++-
 .../resources/nft_model/NFTablesParserTools.py       | 12 +++++++++++-
 .../firewall_agent/resources/nft_model/Rule.py       |  8 +++++++-
 3 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py
index cb43a1f8a..a34b7e585 100644
--- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py
@@ -30,7 +30,9 @@ class Chain:
     rules  : List[Rule] = field(default_factory=list)
 
     def add_rule(self, entry : Dict) -> None:
-        self.rules.append(Rule.from_nft_entry(self.family, self.table, self.chain, entry))
+        rule = Rule.from_nft_entry(self.family, self.table, self.chain, entry)
+        if rule is None: return
+        self.rules.append(rule)
 
     def to_openconfig(self) -> Tuple[Optional[Dict], Dict]:
         acl_set_name = f'{self.family.value}-{self.table.value}-{self.chain}'
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesParserTools.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesParserTools.py
index 8d3476c67..cf9c97523 100644
--- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesParserTools.py
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesParserTools.py
@@ -38,20 +38,24 @@ def parse_nft_ip_addr(right : Union[str, Dict]) -> ipaddress.IPv4Interface:
     return ipaddress.IPv4Interface(f'{address}/{str(prefix_len)}')
 
 
-def parse_nft_match(rule : 'Rule', match : Dict) -> None:
+def parse_nft_match(rule : 'Rule', match : Dict) -> int:
     if 'op' not in match: raise MissingFieldException('rule.expr.match.op', match)
     if 'left' not in match: raise MissingFieldException('rule.expr.match.left', match)
     if 'right' not in match: raise MissingFieldException('rule.expr.match.right', match)
     if match['op'] != '==': raise UnsupportedElementException('rule.expr.match.op', match)
 
+    num_fields_updated = 0
+
     match_left = match['left']
     match_right = match['right']
     if 'meta' in match_left and 'key' in match_left['meta']:
         meta_key = match_left['meta']['key']
         if 'iifname' in meta_key:
             rule.input_if_name = match_right
+            num_fields_updated += 1
         elif 'oifname' in meta_key:
             rule.output_if_name = match_right
+            num_fields_updated += 1
         else:
             raise UnsupportedElementException('rule.expr.match', match)
     elif 'payload' in match_left:
@@ -61,17 +65,23 @@ def parse_nft_match(rule : 'Rule', match : Dict) -> None:
             field_name = payload['field']
             if protocol == 'ip' and field_name == 'saddr':
                 rule.src_ip_addr = parse_nft_ip_addr(match_right)
+                num_fields_updated += 1
             elif protocol == 'ip' and field_name == 'daddr':
                 rule.dst_ip_addr = parse_nft_ip_addr(match_right)
+                num_fields_updated += 1
             elif protocol in {'tcp', 'udp'} and field_name == 'sport':
                 rule.ip_protocol = get_protocol_from_str(protocol)
                 rule.src_port = match_right
+                num_fields_updated += 1
             elif protocol in {'tcp', 'udp'} and field_name == 'dport':
                 rule.ip_protocol = get_protocol_from_str(protocol)
                 rule.dst_port = match_right
+                num_fields_updated += 1
             else:
                 raise UnsupportedElementException('rule.expr.match', match)
         else:
             raise UnsupportedElementException('rule.expr.match', match)
     else:
         raise UnsupportedElementException('rule.expr.match', match)
+
+    return num_fields_updated
\ No newline at end of file
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py
index a7a0ab4bb..6e66519c5 100644
--- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py
@@ -57,19 +57,25 @@ class Rule:
 
         if 'expr' not in entry: raise MissingFieldException('rule.expr', entry)
         expr_list : List[Dict] = entry.pop('expr')
+        num_fields_updated = 0
         for expr_entry in expr_list:
             expr_entry_fields = set(expr_entry.keys())
             expr_entry_type = expr_entry_fields.pop()
             if expr_entry_type == 'match':
                 match = expr_entry['match']
-                parse_nft_match(rule, match)
+                num_fields_updated += parse_nft_match(rule, match)
             elif expr_entry_type in {'accept', 'drop', 'reject'}:
                 rule.action = get_action_from_str(expr_entry_type)
+                num_fields_updated += 1
             elif expr_entry_type in {'counter'}:
                 pass # ignore these entry types
             else:
                 raise UnsupportedElementException('expr_entry', expr_entry)
 
+        if len(num_fields_updated) == 0:
+            # Ignoring empty/unsupported rule...
+            return None
+
         rule.comment = entry.pop('comment', None)
         rule.handle = entry['handle']
         return rule
-- 
GitLab


From 54e5f9069e51fa698a8c95c2868f898d9ad061ef Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Wed, 5 Nov 2025 15:30:14 +0000
Subject: [PATCH 072/111] Tests - Tools - Firewall Agent:

- Skipped jump rule entry types
---
 .../firewall_agent/firewall_agent/resources/nft_model/Rule.py   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py
index 6e66519c5..bafc2f4a6 100644
--- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py
@@ -67,7 +67,7 @@ class Rule:
             elif expr_entry_type in {'accept', 'drop', 'reject'}:
                 rule.action = get_action_from_str(expr_entry_type)
                 num_fields_updated += 1
-            elif expr_entry_type in {'counter'}:
+            elif expr_entry_type in {'counter', 'jump'}:
                 pass # ignore these entry types
             else:
                 raise UnsupportedElementException('expr_entry', expr_entry)
-- 
GitLab


From e2402e08fe045a8de5ce23ae5a35e0d4a41588a6 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Wed, 5 Nov 2025 15:30:57 +0000
Subject: [PATCH 073/111] Disabled CI/CD tests

---
 .gitlab-ci.yml | 98 +++++++++++++++++++++++++-------------------------
 1 file changed, 50 insertions(+), 48 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 2856f9fed..1e757241d 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -12,52 +12,54 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# stages of the cicd pipeline
-stages:
-  #- dependencies
-  - build
-  - unit_test
-  - end2end_test
 
-# 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/nbi/.gitlab-ci.yml'
-  - local: '/src/context/.gitlab-ci.yml'
-  - local: '/src/device/.gitlab-ci.yml'
-  - local: '/src/service/.gitlab-ci.yml'
-  - local: '/src/qkd_app/.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/automation/.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'
-  #- local: '/src/l3_attackmitigator/.gitlab-ci.yml'
-  - local: '/src/slice/.gitlab-ci.yml'
-  #- 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/kpi_manager/.gitlab-ci.yml'
-  - local: '/src/kpi_value_api/.gitlab-ci.yml'
-  #- local: '/src/kpi_value_writer/.gitlab-ci.yml'
-  #- local: '/src/telemetry/.gitlab-ci.yml'
-  - local: '/src/analytics/.gitlab-ci.yml'
-  - local: '/src/qos_profile/.gitlab-ci.yml'
-  - local: '/src/vnt_manager/.gitlab-ci.yml'
-  - local: '/src/e2e_orchestrator/.gitlab-ci.yml'
-  - local: '/src/ztp_server/.gitlab-ci.yml'
-  - local: '/src/osm_client/.gitlab-ci.yml'
-  - local: '/src/simap_connector/.gitlab-ci.yml'
-
-  # This should be last one: end-to-end integration tests
-  - local: '/src/tests/.gitlab-ci.yml'
+## stages of the cicd pipeline
+#stages:
+#  #- dependencies
+#  - build
+#  - unit_test
+#  - end2end_test
+#
+## 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/nbi/.gitlab-ci.yml'
+#  - local: '/src/context/.gitlab-ci.yml'
+#  - local: '/src/device/.gitlab-ci.yml'
+#  - local: '/src/service/.gitlab-ci.yml'
+#  - local: '/src/qkd_app/.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/automation/.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'
+#  #- local: '/src/l3_attackmitigator/.gitlab-ci.yml'
+#  - local: '/src/slice/.gitlab-ci.yml'
+#  #- 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/kpi_manager/.gitlab-ci.yml'
+#  - local: '/src/kpi_value_api/.gitlab-ci.yml'
+#  #- local: '/src/kpi_value_writer/.gitlab-ci.yml'
+#  #- local: '/src/telemetry/.gitlab-ci.yml'
+#  - local: '/src/analytics/.gitlab-ci.yml'
+#  - local: '/src/qos_profile/.gitlab-ci.yml'
+#  - local: '/src/vnt_manager/.gitlab-ci.yml'
+#  - local: '/src/e2e_orchestrator/.gitlab-ci.yml'
+#  - local: '/src/ztp_server/.gitlab-ci.yml'
+#  - local: '/src/osm_client/.gitlab-ci.yml'
+#  - local: '/src/simap_connector/.gitlab-ci.yml'
+#
+#  # This should be last one: end-to-end integration tests
+#  - local: '/src/tests/.gitlab-ci.yml'
+#
\ No newline at end of file
-- 
GitLab


From bd69eba917a33b70802892c3161239a86988846c Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Wed, 5 Nov 2025 15:32:08 +0000
Subject: [PATCH 074/111] Tests - Tools - Firewall Agent:

- Fix in rule skipper
---
 .../firewall_agent/firewall_agent/resources/nft_model/Rule.py   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py
index bafc2f4a6..6be73c772 100644
--- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py
@@ -72,7 +72,7 @@ class Rule:
             else:
                 raise UnsupportedElementException('expr_entry', expr_entry)
 
-        if len(num_fields_updated) == 0:
+        if num_fields_updated == 0:
             # Ignoring empty/unsupported rule...
             return None
 
-- 
GitLab


From 80a3a750a7923a65a54dfef47b075388fa99f196 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Wed, 5 Nov 2025 15:45:59 +0000
Subject: [PATCH 075/111] Tests - Tools - Firewall Agent:

- Fix in rule skipper
---
 .../firewall_agent/resources/nft_model/Exceptions.py          | 4 ++--
 .../firewall_agent/firewall_agent/resources/nft_model/Rule.py | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Exceptions.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Exceptions.py
index 0ac157de9..9c4956a7c 100644
--- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Exceptions.py
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Exceptions.py
@@ -43,9 +43,9 @@ class MalformedOutputException(Exception):
         )
 
 class UnsupportedElementException(Exception):
-    def __init__(self, element_type : str, value : str) -> None:
+    def __init__(self, element : str, value : str) -> None:
         super().__init__(
-            f'Unsupported: element_type={str(element_type)} value={str(value)}'
+            f'Unsupported: element={str(element)} value={str(value)}'
         )
 
 class MissingFieldException(Exception):
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py
index 6be73c772..da59cdbdb 100644
--- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py
@@ -56,7 +56,7 @@ class Rule:
         rule : 'Rule' = cls(family, table, chain)
 
         if 'expr' not in entry: raise MissingFieldException('rule.expr', entry)
-        expr_list : List[Dict] = entry.pop('expr')
+        expr_list : List[Dict] = entry['expr']
         num_fields_updated = 0
         for expr_entry in expr_list:
             expr_entry_fields = set(expr_entry.keys())
@@ -67,7 +67,7 @@ class Rule:
             elif expr_entry_type in {'accept', 'drop', 'reject'}:
                 rule.action = get_action_from_str(expr_entry_type)
                 num_fields_updated += 1
-            elif expr_entry_type in {'counter', 'jump'}:
+            elif expr_entry_type in {'counter', 'jump', 'xt'}:
                 pass # ignore these entry types
             else:
                 raise UnsupportedElementException('expr_entry', expr_entry)
-- 
GitLab


From cc528bc05e6f80c64a99bb9d711f067a04f1486e Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Wed, 5 Nov 2025 16:01:05 +0000
Subject: [PATCH 076/111] Tests - Tools - Firewall Agent:

- Moved old test files to tests folder
- Arranged new ACL data files and test commands
- Removed olf TODO file
---
 src/tests/tools/firewall_agent/docs/TODO.md   | 10 -------
 .../data/allow_30435_from_10_0_2_10.json      | 27 ++++++++++++++++++
 .../data/allow_30435_from_10_0_2_2.json       | 27 ++++++++++++++++++
 ...435_all.json => block_30435_from_all.json} |  6 ++--
 .../firewall_agent/scripts/test_commands.sh   | 20 ++++++-------
 .../{ => tests}/docker-compose-down.sh        |  0
 .../{ => tests}/docker-compose-up.sh          |  0
 .../{ => tests}/docker-compose.yml            |  0
 .../data => tests}/oc_acl_block_8001.json     |  0
 .../data => tests}/oc_acl_block_8002.json     |  0
 .../data => tests}/oc_acl_multi_rule.json     |  0
 .../firewall_agent/tests/test_commands.sh     | 28 +++++++++++++++++++
 12 files changed, 93 insertions(+), 25 deletions(-)
 delete mode 100644 src/tests/tools/firewall_agent/docs/TODO.md
 create mode 100644 src/tests/tools/firewall_agent/scripts/data/allow_30435_from_10_0_2_10.json
 create mode 100644 src/tests/tools/firewall_agent/scripts/data/allow_30435_from_10_0_2_2.json
 rename src/tests/tools/firewall_agent/scripts/data/{oc_acl_block_30435_all.json => block_30435_from_all.json} (81%)
 rename src/tests/tools/firewall_agent/{ => tests}/docker-compose-down.sh (100%)
 rename src/tests/tools/firewall_agent/{ => tests}/docker-compose-up.sh (100%)
 rename src/tests/tools/firewall_agent/{ => tests}/docker-compose.yml (100%)
 rename src/tests/tools/firewall_agent/{scripts/data => tests}/oc_acl_block_8001.json (100%)
 rename src/tests/tools/firewall_agent/{scripts/data => tests}/oc_acl_block_8002.json (100%)
 rename src/tests/tools/firewall_agent/{scripts/data => tests}/oc_acl_multi_rule.json (100%)
 create mode 100755 src/tests/tools/firewall_agent/tests/test_commands.sh

diff --git a/src/tests/tools/firewall_agent/docs/TODO.md b/src/tests/tools/firewall_agent/docs/TODO.md
deleted file mode 100644
index 75a026986..000000000
--- a/src/tests/tools/firewall_agent/docs/TODO.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# TODO
-
-- To block traffic to a MicroK8s service, apply rule:
-  `sudo nft add/insert rule ip filter FORWARD iifname "enp0s3" tcp dport 85 drop`
-
-  - when applying to ingress, also apply to FORWARD
-  - when applying to egress, also apply to FORWARD
-  - rules (INPUT, FORWARD, OUTPUT) should be applied based on sequence_id
-    - negative sequence_id => insert on top (first -1, then -2, then -3) so that order of rules is -3,-2,-1 at top of the chain
-    - positive sequence_id => append on bottom (first 0, then 1, then 2) so that order of rules is 0, 1, 2 at bottom of the chain
diff --git a/src/tests/tools/firewall_agent/scripts/data/allow_30435_from_10_0_2_10.json b/src/tests/tools/firewall_agent/scripts/data/allow_30435_from_10_0_2_10.json
new file mode 100644
index 000000000..e80184037
--- /dev/null
+++ b/src/tests/tools/firewall_agent/scripts/data/allow_30435_from_10_0_2_10.json
@@ -0,0 +1,27 @@
+{"openconfig-acl:acl": {
+    "acl-sets": {"acl-set": [{
+        "name": "ip-filter-input", "type": "ACL_IPV4",
+        "config": {"name": "ip-filter-input", "type": "ACL_IPV4"},
+        "acl-entries": {"acl-entry": [
+            {
+                "sequence-id": 1,
+                "config": {"sequence-id": 1, "description": "allow-30435-from-10-0-2-10"},
+                "ipv4": {"config": {"source-address": "10.0.2.10/32", "protocol": "IP_TCP"}},
+                "transport": {"config": {"destination-port": 30435}},
+                "actions": {"config": {"forwarding-action": "ALLOW"}}
+            }
+        ]}
+    }]},
+    "interfaces": {"interface": [{
+        "id": "enp0s3",
+        "config": {"id": "enp0s3"},
+        "interface-ref": {"config": {"interface": "enp0s3", "subinterface": 1}},
+        "ingress-acl-sets": {"ingress-acl-set": [
+            {
+                "set-name": "ip-filter-input", "type": "ACL_IPV4",
+                "config": {"set-name": "ip-filter-input", "type": "ACL_IPV4"},
+                "acl-entries": {"acl-entry": [{"sequence-id": 1}]}
+            }
+        ]}
+    }]}
+}}
diff --git a/src/tests/tools/firewall_agent/scripts/data/allow_30435_from_10_0_2_2.json b/src/tests/tools/firewall_agent/scripts/data/allow_30435_from_10_0_2_2.json
new file mode 100644
index 000000000..9029e91b4
--- /dev/null
+++ b/src/tests/tools/firewall_agent/scripts/data/allow_30435_from_10_0_2_2.json
@@ -0,0 +1,27 @@
+{"openconfig-acl:acl": {
+    "acl-sets": {"acl-set": [{
+        "name": "ip-filter-input", "type": "ACL_IPV4",
+        "config": {"name": "ip-filter-input", "type": "ACL_IPV4"},
+        "acl-entries": {"acl-entry": [
+            {
+                "sequence-id": 1,
+                "config": {"sequence-id": 1, "description": "allow-30435-from-10-0-2-2"},
+                "ipv4": {"config": {"source-address": "10.0.2.2/32", "protocol": "IP_TCP"}},
+                "transport": {"config": {"destination-port": 30435}},
+                "actions": {"config": {"forwarding-action": "ALLOW"}}
+            }
+        ]}
+    }]},
+    "interfaces": {"interface": [{
+        "id": "enp0s3",
+        "config": {"id": "enp0s3"},
+        "interface-ref": {"config": {"interface": "enp0s3", "subinterface": 1}},
+        "ingress-acl-sets": {"ingress-acl-set": [
+            {
+                "set-name": "ip-filter-input", "type": "ACL_IPV4",
+                "config": {"set-name": "ip-filter-input", "type": "ACL_IPV4"},
+                "acl-entries": {"acl-entry": [{"sequence-id": 1}]}
+            }
+        ]}
+    }]}
+}}
diff --git a/src/tests/tools/firewall_agent/scripts/data/oc_acl_block_30435_all.json b/src/tests/tools/firewall_agent/scripts/data/block_30435_from_all.json
similarity index 81%
rename from src/tests/tools/firewall_agent/scripts/data/oc_acl_block_30435_all.json
rename to src/tests/tools/firewall_agent/scripts/data/block_30435_from_all.json
index 5e50f560a..8f474d330 100644
--- a/src/tests/tools/firewall_agent/scripts/data/oc_acl_block_30435_all.json
+++ b/src/tests/tools/firewall_agent/scripts/data/block_30435_from_all.json
@@ -4,8 +4,8 @@
         "config": {"name": "ip-filter-input", "type": "ACL_IPV4"},
         "acl-entries": {"acl-entry": [
             {
-                "sequence-id": 1,
-                "config": {"sequence-id": 1, "description": "drop-30435-all"},
+                "sequence-id": 10000,
+                "config": {"sequence-id": 10000, "description": "drop-30435-from-all"},
                 "ipv4": {"config": {"protocol": "IP_TCP"}},
                 "transport": {"config": {"destination-port": 30435}},
                 "actions": {"config": {"forwarding-action": "DROP"}}
@@ -20,7 +20,7 @@
             {
                 "set-name": "ip-filter-input", "type": "ACL_IPV4",
                 "config": {"set-name": "ip-filter-input", "type": "ACL_IPV4"},
-                "acl-entries": {"acl-entry": [{"sequence-id": 1}]}
+                "acl-entries": {"acl-entry": [{"sequence-id": 10000}]}
             }
         ]}
     }]}
diff --git a/src/tests/tools/firewall_agent/scripts/test_commands.sh b/src/tests/tools/firewall_agent/scripts/test_commands.sh
index 9db629ff9..9acad4ab0 100755
--- a/src/tests/tools/firewall_agent/scripts/test_commands.sh
+++ b/src/tests/tools/firewall_agent/scripts/test_commands.sh
@@ -18,18 +18,14 @@ curl http://172.17.0.1:8888/restconf/data/openconfig-platform:components
 curl http://172.17.0.1:8888/restconf/data/openconfig-interfaces:interfaces
 curl http://172.17.0.1:8888/restconf/data/openconfig-acl:acl
 
-wget -q -O- http://localhost:8001
-wget -q -O- http://localhost:8002
+curl -X POST -d @scripts/data/block_30435_from_all.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl
+curl -X POST -d @scripts/data/allow_30435_from_10_0_2_2.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl
+curl -X POST -d @scripts/data/allow_30435_from_10_0_2_10.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl
 
-curl -X POST -d @scripts/data/oc_acl_block_8001.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl
-curl -X POST -d @scripts/data/oc_acl_block_8002.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl
-curl -X POST -d @scripts/data/oc_acl_multi_rule.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl
-
-wget -q -O- http://localhost:8001
-wget -q -O- http://localhost:8002
+curl http://172.17.0.1:8888/restconf/data/openconfig-acl:acl
 
-curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=drop-8001-host
-curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=drop-8002-ext
+curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=allow-30435-from-10-0-2-2
+curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=allow-30435-from-10-0-2-10
+curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=block-30435-from-all
 
-curl -X POST -d @scripts/data/oc_acl_block_30435_all.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl
-curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=drop-30435-all
+curl http://172.17.0.1:8888/restconf/data/openconfig-acl:acl
diff --git a/src/tests/tools/firewall_agent/docker-compose-down.sh b/src/tests/tools/firewall_agent/tests/docker-compose-down.sh
similarity index 100%
rename from src/tests/tools/firewall_agent/docker-compose-down.sh
rename to src/tests/tools/firewall_agent/tests/docker-compose-down.sh
diff --git a/src/tests/tools/firewall_agent/docker-compose-up.sh b/src/tests/tools/firewall_agent/tests/docker-compose-up.sh
similarity index 100%
rename from src/tests/tools/firewall_agent/docker-compose-up.sh
rename to src/tests/tools/firewall_agent/tests/docker-compose-up.sh
diff --git a/src/tests/tools/firewall_agent/docker-compose.yml b/src/tests/tools/firewall_agent/tests/docker-compose.yml
similarity index 100%
rename from src/tests/tools/firewall_agent/docker-compose.yml
rename to src/tests/tools/firewall_agent/tests/docker-compose.yml
diff --git a/src/tests/tools/firewall_agent/scripts/data/oc_acl_block_8001.json b/src/tests/tools/firewall_agent/tests/oc_acl_block_8001.json
similarity index 100%
rename from src/tests/tools/firewall_agent/scripts/data/oc_acl_block_8001.json
rename to src/tests/tools/firewall_agent/tests/oc_acl_block_8001.json
diff --git a/src/tests/tools/firewall_agent/scripts/data/oc_acl_block_8002.json b/src/tests/tools/firewall_agent/tests/oc_acl_block_8002.json
similarity index 100%
rename from src/tests/tools/firewall_agent/scripts/data/oc_acl_block_8002.json
rename to src/tests/tools/firewall_agent/tests/oc_acl_block_8002.json
diff --git a/src/tests/tools/firewall_agent/scripts/data/oc_acl_multi_rule.json b/src/tests/tools/firewall_agent/tests/oc_acl_multi_rule.json
similarity index 100%
rename from src/tests/tools/firewall_agent/scripts/data/oc_acl_multi_rule.json
rename to src/tests/tools/firewall_agent/tests/oc_acl_multi_rule.json
diff --git a/src/tests/tools/firewall_agent/tests/test_commands.sh b/src/tests/tools/firewall_agent/tests/test_commands.sh
new file mode 100755
index 000000000..5e82b0913
--- /dev/null
+++ b/src/tests/tools/firewall_agent/tests/test_commands.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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.
+
+
+wget -q -O- http://localhost:8001
+wget -q -O- http://localhost:8002
+
+curl -X POST -d @scripts/data/oc_acl_block_8001.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl
+curl -X POST -d @scripts/data/oc_acl_block_8002.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl
+curl -X POST -d @scripts/data/oc_acl_multi_rule.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl
+
+wget -q -O- http://localhost:8001
+wget -q -O- http://localhost:8002
+
+curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=drop-8001-host
+curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=drop-8002-ext
-- 
GitLab


From ff0f2d41e770ef02d6f6dab98dc553e56da3f389 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Wed, 5 Nov 2025 16:10:10 +0000
Subject: [PATCH 077/111] Tests - Tools - Firewall Agent:

- Fixed formatting of table and chain rules
---
 .../firewall_agent/firewall_agent/resources/nft_model/Chain.py  | 2 +-
 .../firewall_agent/firewall_agent/resources/nft_model/Table.py  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py
index a34b7e585..6ff7e8d8d 100644
--- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py
@@ -91,7 +91,7 @@ class Chain:
                 'policy', 'accept', ';',
                 '}'
             ]
-            commands.append(-1, ' '.join(parts))
+            commands.append((-1, ' '.join(parts)))
         for rule in self.rules:
             commands.append(rule.get_command(removal=removal))
         return commands
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py
index 10289a0ec..ea8bf064e 100644
--- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py
@@ -80,7 +80,7 @@ class Table:
             pass
         else:
             parts = ['add', 'table', self.family.value, self.table.value]
-            commands.append(-2, ' '.join(parts))
+            commands.append((-2, ' '.join(parts)))
         for chain in self.chains.values():
             commands.extend(chain.get_commands(removal=removal))
         return commands
-- 
GitLab


From 8b3c5d3f2954c7fb1c23f496d2126f44cb726ee4 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Wed, 5 Nov 2025 16:12:12 +0000
Subject: [PATCH 078/111] Tests - Tools - Firewall Agent:

- Fixed formatting of chain rules
---
 .../firewall_agent/resources/nft_model/Chain.py               | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py
index 6ff7e8d8d..0e217c80f 100644
--- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py
@@ -83,11 +83,11 @@ class Chain:
             # chains and their removal might cause side effects on NFTables.
             pass
         else:
-            #chain_hook = str(self.chain).lower()
+            chain_hook = str(self.chain).lower()
             parts = [
                 'add', 'chain', self.family.value, self.table.value, self.chain,
                 '{',
-                'type', self.table.value, 'hook', self.chain, 'priority', 'raw', ';',
+                'type', self.table.value, 'hook', chain_hook, 'priority', 'raw', ';',
                 'policy', 'accept', ';',
                 '}'
             ]
-- 
GitLab


From 8a741e5ebeb8cbd1ef164f0b7350cd3f9ff10ce2 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Wed, 5 Nov 2025 16:57:23 +0000
Subject: [PATCH 079/111] Tests - Tools - Firewall Agent:

- Discover existing tables and chains before configuring a rule from OpenConfigACL
---
 .../firewall_agent/resources/ACLs.py          |  1 +
 .../resources/nft_model/Chain.py              | 41 ++++++++++++++++++-
 .../resources/nft_model/NFTables.py           |  7 ++--
 .../resources/nft_model/Table.py              | 16 +++++---
 4 files changed, 55 insertions(+), 10 deletions(-)

diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/ACLs.py b/src/tests/tools/firewall_agent/firewall_agent/resources/ACLs.py
index b947215d0..945c98beb 100644
--- a/src/tests/tools/firewall_agent/firewall_agent/resources/ACLs.py
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/ACLs.py
@@ -60,6 +60,7 @@ class ACLs(Resource):
             abort(400, message='invalid interfaces')
 
         nft = NFTables()
+        nft.load(skip_rules=True)
 
         arid = AclRuleToInterfaceDirection(nft)
         arid.add_interfaces(interfaces)
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py
index 0e217c80f..9c20f6f0f 100644
--- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py
@@ -13,22 +13,61 @@
 # limitations under the License.
 
 
+import enum
 from dataclasses import dataclass, field
 from typing import Dict, List, Optional, Set, Tuple
+from .ActionEnum import ActionEnum
 from .DirectionEnum import DirectionEnum
 from .FamilyEnum import FamilyEnum
 from .TableEnum import TableEnum
 from .Rule import Rule
 
 
+class ChainPriorityEnum(enum.IntEnum):
+    RAW    = -300
+    MANGLE = -150
+    FILTER = 0
+
 @dataclass
 class Chain:
     family : FamilyEnum
     table  : TableEnum
     chain  : str
-    handle : Optional[int] = None
+    handle : Optional[int       ] = None
+    type   : Optional[str       ] = None
+    hook   : Optional[str       ] = None
+    prio   : Optional[int       ] = None
+    policy : Optional[ActionEnum] = None
     rules  : List[Rule] = field(default_factory=list)
 
+    @classmethod
+    def from_manual(
+        cls, family : FamilyEnum, table : TableEnum, name : str,
+        handle : Optional[int] = None, type_ : Optional[str] = None,
+        hook : Optional[str] = None, prio : int = ChainPriorityEnum.RAW.value,
+        policy : ActionEnum = ActionEnum.ACCEPT
+    ) -> 'Chain':
+        chain : 'Chain' = cls(family, table, name)
+        chain.handle = handle
+        if type_ is None: type_ = str(table.value).lower()
+        if hook is None: hook = str(name).lower()
+        chain.prio = prio
+        chain.policy = policy
+        return chain
+
+    @classmethod
+    def from_nft_entry(
+        cls, family : FamilyEnum, table : TableEnum, entry : Dict
+    ) -> 'Chain':
+        name : str = entry['name']
+        chain : 'Chain' = cls(family, table, name)
+        chain.handle = entry['handle']
+        chain.type   = entry.get('type',   table.value.lower())
+        chain.hook   = entry.get('hook',   name.lower())
+        chain.prio   = entry.get('prio',   ChainPriorityEnum.RAW.value)
+        chain.policy = entry.get('policy', ActionEnum.ACCEPT.value)
+        return chain
+
     def add_rule(self, entry : Dict) -> None:
         rule = Rule.from_nft_entry(self.family, self.table, self.chain, entry)
         if rule is None: return
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTables.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTables.py
index 1d13aa93b..7c3aea14b 100644
--- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTables.py
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTables.py
@@ -35,15 +35,15 @@ class NFTables:
 
     def load(
         self, family : Optional[FamilyEnum] = None, table : Optional[TableEnum] = None,
-        chain : Optional[str] = None
+        chain : Optional[str] = None, skip_rules : bool = False
     ) -> None:
         entries = NFTablesCommand.list(family=family, table=table, chain=chain)
-        for entry in entries: self.parse_entry(entry)
+        for entry in entries: self.parse_entry(entry, skip_rules=skip_rules)
 
     def get_or_create_table(self, family : FamilyEnum, table : TableEnum) -> Table:
         return self.tables.setdefault((family, table), Table(family, table))
 
-    def parse_entry(self, entry : Dict) -> None:
+    def parse_entry(self, entry : Dict, skip_rules : bool = False) -> None:
         entry_fields = set(entry.keys())
         if len(entry_fields) != 1: raise UnsupportedElementException('entry', entry)
         entry_type = entry_fields.pop()
@@ -54,6 +54,7 @@ class NFTables:
         elif entry_type in {'chain'}:
             self.parse_entry_chain(entry['chain'])
         elif entry_type in {'rule'}:
+            if skip_rules: return
             self.parse_entry_rule(entry['rule'])
         else:
             raise UnsupportedElementException('entry', entry)
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py
index ea8bf064e..9522772e3 100644
--- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py
@@ -28,20 +28,24 @@ class Table:
     handle : Optional[int] = None
     chains : Dict[str, Chain] = field(default_factory=dict)
 
+    def get_chain(self, name : str) -> Chain:
+        return self.chains[name]
+
     def get_or_create_chain(self, name : str) -> Chain:
-        return self.chains.setdefault(name, Chain(self.family, self.table, name))
+        return self.chains.setdefault(name, Chain.from_manual(self.family, self.table, name))
 
     def add_chain_by_entry(self, entry : Dict) -> Chain:
-        name : str = entry.pop('name')
+        name : str = entry['name']
         if name.lower() not in {'input', 'output', 'forward', 'prerouting'}: return None
-        chain_obj = self.get_or_create_chain(name)
-        chain_obj.handle = entry['handle']
-        return chain_obj
+        if name in self.chains: return self.chains[name]
+        chain = Chain.from_nft_entry(self.family, self.table, entry)
+        self.chains[name] = chain
+        return chain
 
     def add_rule_by_entry(self, entry : Dict) -> None:
         chain : str = entry.pop('chain')
         if chain.lower() not in {'input', 'output', 'forward', 'prerouting'}: return
-        self.get_or_create_chain(chain).add_rule(entry)
+        self.get_chain(chain).add_rule(entry)
 
     def to_openconfig(self) -> Tuple[List[Dict], Dict]:
         acl_sets : List[Dict] = list()
-- 
GitLab


From 59f2a1ea32a5333033428c11c784e31052cf723b Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Wed, 5 Nov 2025 17:49:14 +0000
Subject: [PATCH 080/111] Tests - Tools - Firewall Agent:

- Fixed discovery of existing tables and chains
- Fixed chain addition command
- Fixed parsing of ACL entries
- Fixed test commands and data files
---
 .../resources/nft_model/Chain.py              |  6 +--
 .../resources/nft_model/Exceptions.py         | 10 ++--
 .../resources/nft_model/Rule.py               | 48 +++++++++++++++----
 ....json => accept_30435_from_10_0_2_10.json} |  4 +-
 ...2.json => accept_30435_from_10_0_2_2.json} |  4 +-
 ...om_all.json => reject_30435_from_all.json} |  4 +-
 .../firewall_agent/scripts/test_commands.sh   | 12 ++---
 7 files changed, 59 insertions(+), 29 deletions(-)
 rename src/tests/tools/firewall_agent/scripts/data/{allow_30435_from_10_0_2_10.json => accept_30435_from_10_0_2_10.json} (85%)
 rename src/tests/tools/firewall_agent/scripts/data/{allow_30435_from_10_0_2_2.json => accept_30435_from_10_0_2_2.json} (85%)
 rename src/tests/tools/firewall_agent/scripts/data/{block_30435_from_all.json => reject_30435_from_all.json} (91%)

diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py
index 9c20f6f0f..261f19b64 100644
--- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py
@@ -64,7 +64,7 @@ class Chain:
         chain.handle = entry['handle']
         chain.type   = entry.get('type',   table.value.lower())
         chain.hook   = entry.get('hook',   name.lower())
-        chain.prio   = entry.get('prio',   ChainPriorityEnum.RAW.value)
+        chain.prio   = entry.get('prio',   ChainPriorityEnum.FILTER.value)
         chain.policy = entry.get('policy', ActionEnum.ACCEPT.value)
         return chain
 
@@ -126,8 +126,8 @@ class Chain:
             parts = [
                 'add', 'chain', self.family.value, self.table.value, self.chain,
                 '{',
-                'type', self.table.value, 'hook', chain_hook, 'priority', 'raw', ';',
-                'policy', 'accept', ';',
+                'type', self.type, 'hook', self.hook, 'priority', str(self.prio), ';',
+                'policy', self.policy, ';',
                 '}'
             ]
             commands.append((-1, ' '.join(parts)))
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Exceptions.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Exceptions.py
index 9c4956a7c..17bb3441e 100644
--- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Exceptions.py
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Exceptions.py
@@ -43,10 +43,12 @@ class MalformedOutputException(Exception):
         )
 
 class UnsupportedElementException(Exception):
-    def __init__(self, element : str, value : str) -> None:
-        super().__init__(
-            f'Unsupported: element={str(element)} value={str(value)}'
-        )
+    def __init__(
+        self, element : str, value : str, extra : Optional[str] = None
+    ) -> None:
+        msg = f'Unsupported: element={str(element)} value={str(value)}'
+        if extra is not None: msg += f' {str(extra)}'
+        super().__init__(msg)
 
 class MissingFieldException(Exception):
     def __init__(self, field_name : str, objekt : Dict) -> None:
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py
index da59cdbdb..5a839f3e1 100644
--- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py
@@ -28,6 +28,40 @@ from .TableEnum import TableEnum
 LOGGER = logging.getLogger(__name__)
 
 
+OPENCONFIG_ACL_ACTION_TO_NFT = {
+    'ACCEPT' : ActionEnum.ACCEPT,
+    'DROP'   : ActionEnum.DROP,
+    'REJECT' : ActionEnum.REJECT,
+}
+
+def get_nft_action_from_openconfig(oc_action : str) -> ActionEnum:
+    nft_action = OPENCONFIG_ACL_ACTION_TO_NFT.get(oc_action)
+    if nft_action is None:
+        supported_values = set(OPENCONFIG_ACL_ACTION_TO_NFT.keys())
+        raise UnsupportedElementException(
+            'acl_entry.actions.config.forwarding-action', str(oc_action),
+            extra=f'supported_values={str(supported_values)}'
+        )
+    return nft_action
+
+
+OPENCONFIG_IPV4_PROTOCOL_TO_NFT = {
+    'IP_TCP'  : ProtocolEnum.TCP,
+    'IP_UDP'  : ProtocolEnum.UDP,
+    'IP_ICMP' : ProtocolEnum.ICMP,
+}
+
+def get_nft_ipv4_protocol_from_openconfig(oc_ipv4_protocol : str) -> ProtocolEnum:
+    nft_protocol = OPENCONFIG_IPV4_PROTOCOL_TO_NFT.get(oc_ipv4_protocol)
+    if nft_protocol is None:
+        supported_values = set(OPENCONFIG_IPV4_PROTOCOL_TO_NFT.keys())
+        raise UnsupportedElementException(
+            'acl_entry.ipv4.config.protocol', str(oc_ipv4_protocol),
+            extra=f'supported_values={str(supported_values)}'
+        )
+    return nft_protocol
+
+
 @dataclass
 class Rule:
     family         : FamilyEnum
@@ -97,21 +131,15 @@ class Rule:
             rule.dst_ip_addr = ipaddress.IPv4Interface(ipv4_config['destination-address'])
 
         if 'protocol' in ipv4_config:
-            rule.ip_protocol = {
-                'IP_TCP'  : ProtocolEnum.TCP,
-                'IP_UDP'  : ProtocolEnum.UDP,
-                'IP_ICMP' : ProtocolEnum.ICMP,
-            }.get(ipv4_config['protocol'], None)
+            ip_protocol = ipv4_config['protocol']
+            rule.ip_protocol = get_nft_ipv4_protocol_from_openconfig(ip_protocol)
 
         transp_config = acl_entry.get('transport', {}).get('config', {})
         rule.src_port = transp_config.get('source-port')
         rule.dst_port = transp_config.get('destination-port')
 
-        rule.action = {
-            'ACCEPT' : ActionEnum.ACCEPT,
-            'DROP'   : ActionEnum.DROP,
-            'REJECT' : ActionEnum.REJECT,
-        }.get(acl_entry['actions']['config']['forwarding-action'], None)
+        action = acl_entry['actions']['config']['forwarding-action']
+        rule.action = get_nft_action_from_openconfig(action)
 
         return rule
 
diff --git a/src/tests/tools/firewall_agent/scripts/data/allow_30435_from_10_0_2_10.json b/src/tests/tools/firewall_agent/scripts/data/accept_30435_from_10_0_2_10.json
similarity index 85%
rename from src/tests/tools/firewall_agent/scripts/data/allow_30435_from_10_0_2_10.json
rename to src/tests/tools/firewall_agent/scripts/data/accept_30435_from_10_0_2_10.json
index e80184037..e46bd1f26 100644
--- a/src/tests/tools/firewall_agent/scripts/data/allow_30435_from_10_0_2_10.json
+++ b/src/tests/tools/firewall_agent/scripts/data/accept_30435_from_10_0_2_10.json
@@ -5,10 +5,10 @@
         "acl-entries": {"acl-entry": [
             {
                 "sequence-id": 1,
-                "config": {"sequence-id": 1, "description": "allow-30435-from-10-0-2-10"},
+                "config": {"sequence-id": 1, "description": "accept-30435-from-10-0-2-10"},
                 "ipv4": {"config": {"source-address": "10.0.2.10/32", "protocol": "IP_TCP"}},
                 "transport": {"config": {"destination-port": 30435}},
-                "actions": {"config": {"forwarding-action": "ALLOW"}}
+                "actions": {"config": {"forwarding-action": "ACCEPT"}}
             }
         ]}
     }]},
diff --git a/src/tests/tools/firewall_agent/scripts/data/allow_30435_from_10_0_2_2.json b/src/tests/tools/firewall_agent/scripts/data/accept_30435_from_10_0_2_2.json
similarity index 85%
rename from src/tests/tools/firewall_agent/scripts/data/allow_30435_from_10_0_2_2.json
rename to src/tests/tools/firewall_agent/scripts/data/accept_30435_from_10_0_2_2.json
index 9029e91b4..df18d93c1 100644
--- a/src/tests/tools/firewall_agent/scripts/data/allow_30435_from_10_0_2_2.json
+++ b/src/tests/tools/firewall_agent/scripts/data/accept_30435_from_10_0_2_2.json
@@ -5,10 +5,10 @@
         "acl-entries": {"acl-entry": [
             {
                 "sequence-id": 1,
-                "config": {"sequence-id": 1, "description": "allow-30435-from-10-0-2-2"},
+                "config": {"sequence-id": 1, "description": "accept-30435-from-10-0-2-2"},
                 "ipv4": {"config": {"source-address": "10.0.2.2/32", "protocol": "IP_TCP"}},
                 "transport": {"config": {"destination-port": 30435}},
-                "actions": {"config": {"forwarding-action": "ALLOW"}}
+                "actions": {"config": {"forwarding-action": "ACCEPT"}}
             }
         ]}
     }]},
diff --git a/src/tests/tools/firewall_agent/scripts/data/block_30435_from_all.json b/src/tests/tools/firewall_agent/scripts/data/reject_30435_from_all.json
similarity index 91%
rename from src/tests/tools/firewall_agent/scripts/data/block_30435_from_all.json
rename to src/tests/tools/firewall_agent/scripts/data/reject_30435_from_all.json
index 8f474d330..99ac22dd0 100644
--- a/src/tests/tools/firewall_agent/scripts/data/block_30435_from_all.json
+++ b/src/tests/tools/firewall_agent/scripts/data/reject_30435_from_all.json
@@ -5,10 +5,10 @@
         "acl-entries": {"acl-entry": [
             {
                 "sequence-id": 10000,
-                "config": {"sequence-id": 10000, "description": "drop-30435-from-all"},
+                "config": {"sequence-id": 10000, "description": "reject-30435-from-all"},
                 "ipv4": {"config": {"protocol": "IP_TCP"}},
                 "transport": {"config": {"destination-port": 30435}},
-                "actions": {"config": {"forwarding-action": "DROP"}}
+                "actions": {"config": {"forwarding-action": "REJECT"}}
             }
         ]}
     }]},
diff --git a/src/tests/tools/firewall_agent/scripts/test_commands.sh b/src/tests/tools/firewall_agent/scripts/test_commands.sh
index 9acad4ab0..22da27d92 100755
--- a/src/tests/tools/firewall_agent/scripts/test_commands.sh
+++ b/src/tests/tools/firewall_agent/scripts/test_commands.sh
@@ -18,14 +18,14 @@ curl http://172.17.0.1:8888/restconf/data/openconfig-platform:components
 curl http://172.17.0.1:8888/restconf/data/openconfig-interfaces:interfaces
 curl http://172.17.0.1:8888/restconf/data/openconfig-acl:acl
 
-curl -X POST -d @scripts/data/block_30435_from_all.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl
-curl -X POST -d @scripts/data/allow_30435_from_10_0_2_2.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl
-curl -X POST -d @scripts/data/allow_30435_from_10_0_2_10.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl
+curl -X POST -d @scripts/data/reject_30435_from_all.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl
+curl -X POST -d @scripts/data/accept_30435_from_10_0_2_2.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl
+curl -X POST -d @scripts/data/accept_30435_from_10_0_2_10.json http://127.0.0.1:8888/restconf/data/openconfig-acl:acl
 
 curl http://172.17.0.1:8888/restconf/data/openconfig-acl:acl
 
-curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=allow-30435-from-10-0-2-2
-curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=allow-30435-from-10-0-2-10
-curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=block-30435-from-all
+curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=accept-30435-from-10-0-2-2
+curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=accept-30435-from-10-0-2-10
+curl -X DELETE http://172.17.0.1:8888/restconf/data/openconfig-acl:acl/acl-sets/acl-set=reject-30435-from-all
 
 curl http://172.17.0.1:8888/restconf/data/openconfig-acl:acl
-- 
GitLab


From cdb68dca9f07e64f8ba5ee149980b920b297fd96 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Wed, 5 Nov 2025 18:10:18 +0000
Subject: [PATCH 081/111] Declared new Device Driver RESTCONF_OPENCONFIG

---
 proto/context.proto                           |  1 +
 src/common/type_checkers/Assertions.py        |  2 +
 .../database/models/enums/DeviceDriver.py     |  1 +
 .../drivers/ietf_l2vpn/TfsApiClient.py        |  3 +
 .../drivers/ietf_l3vpn/TfsApiClient.py        |  3 +
 .../drivers/ietf_slice/TfsApiClient.py        |  3 +
 .../drivers/optical_tfs/TfsApiClient.py       |  3 +
 .../java/org/etsi/tfs/policy/Serializer.java  | 40 +++++++++++
 .../service_handler_api/FilterFields.py       |  1 +
 src/webui/service/device/forms.py             |  2 +
 src/webui/service/device/routes.py            |  4 ++
 .../java/org/etsi/tfs/ztp/Serializer.java     | 72 +++++++++++++++----
 12 files changed, 121 insertions(+), 14 deletions(-)

diff --git a/proto/context.proto b/proto/context.proto
index 320e553c5..62b21b449 100644
--- a/proto/context.proto
+++ b/proto/context.proto
@@ -254,6 +254,7 @@ enum DeviceDriverEnum {
   DEVICEDRIVER_RYU = 18;
   DEVICEDRIVER_GNMI_NOKIA_SRLINUX = 19;
   DEVICEDRIVER_OPENROADM = 20;
+  DEVICEDRIVER_RESTCONF_OPENCONFIG = 21;
 }
 
 enum DeviceOperationalStatusEnum {
diff --git a/src/common/type_checkers/Assertions.py b/src/common/type_checkers/Assertions.py
index 478186059..4ceb620a5 100644
--- a/src/common/type_checkers/Assertions.py
+++ b/src/common/type_checkers/Assertions.py
@@ -58,6 +58,8 @@ def validate_device_driver_enum(message):
         'DEVICEDRIVER_MORPHEUS',
         'DEVICEDRIVER_RYU',
         'DEVICEDRIVER_GNMI_NOKIA_SRLINUX',
+        'DEVICEDRIVER_OPENROADM',
+        'DEVICEDRIVER_GNMI_OPENCONFIG',
     ]
 
 def validate_device_operational_status_enum(message):
diff --git a/src/context/service/database/models/enums/DeviceDriver.py b/src/context/service/database/models/enums/DeviceDriver.py
index faa8ace3a..7f45d82ec 100644
--- a/src/context/service/database/models/enums/DeviceDriver.py
+++ b/src/context/service/database/models/enums/DeviceDriver.py
@@ -43,6 +43,7 @@ class ORM_DeviceDriverEnum(enum.Enum):
     RYU                   = DeviceDriverEnum.DEVICEDRIVER_RYU
     GNMI_NOKIA_SRLINUX    = DeviceDriverEnum.DEVICEDRIVER_GNMI_NOKIA_SRLINUX
     OPENROADM             = DeviceDriverEnum.DEVICEDRIVER_OPENROADM
+    RESTCONF_OPENCONFIG   = DeviceDriverEnum.DEVICEDRIVER_RESTCONF_OPENCONFIG
 
 grpc_to_enum__device_driver = functools.partial(
     grpc_to_enum, DeviceDriverEnum, ORM_DeviceDriverEnum)
diff --git a/src/device/service/drivers/ietf_l2vpn/TfsApiClient.py b/src/device/service/drivers/ietf_l2vpn/TfsApiClient.py
index ac2106716..1b906b820 100644
--- a/src/device/service/drivers/ietf_l2vpn/TfsApiClient.py
+++ b/src/device/service/drivers/ietf_l2vpn/TfsApiClient.py
@@ -47,6 +47,9 @@ MAPPING_DRIVER = {
     'DEVICEDRIVER_SMARTNIC'             : 16,
     'DEVICEDRIVER_MORPHEUS'             : 17,
     'DEVICEDRIVER_RYU'                  : 18,
+    'DEVICEDRIVER_GNMI_NOKIA_SRLINUX'   : 19,
+    'DEVICEDRIVER_OPENROADM'            : 20,
+    'DEVICEDRIVER_RESTCONF_OPENCONFIG'  : 21,
 }
 
 LOGGER = logging.getLogger(__name__)
diff --git a/src/device/service/drivers/ietf_l3vpn/TfsApiClient.py b/src/device/service/drivers/ietf_l3vpn/TfsApiClient.py
index de695685c..c984c1adf 100644
--- a/src/device/service/drivers/ietf_l3vpn/TfsApiClient.py
+++ b/src/device/service/drivers/ietf_l3vpn/TfsApiClient.py
@@ -53,6 +53,9 @@ MAPPING_DRIVER = {
     'DEVICEDRIVER_SMARTNIC'             : 16,
     'DEVICEDRIVER_MORPHEUS'             : 17,
     'DEVICEDRIVER_RYU'                  : 18,
+    'DEVICEDRIVER_GNMI_NOKIA_SRLINUX'   : 19,
+    'DEVICEDRIVER_OPENROADM'            : 20,
+    'DEVICEDRIVER_RESTCONF_OPENCONFIG'  : 21,
 }
 
 
diff --git a/src/device/service/drivers/ietf_slice/TfsApiClient.py b/src/device/service/drivers/ietf_slice/TfsApiClient.py
index 08c9b78e0..0388e9105 100644
--- a/src/device/service/drivers/ietf_slice/TfsApiClient.py
+++ b/src/device/service/drivers/ietf_slice/TfsApiClient.py
@@ -54,6 +54,9 @@ MAPPING_DRIVER = {
     'DEVICEDRIVER_SMARTNIC'             : 16,
     'DEVICEDRIVER_MORPHEUS'             : 17,
     'DEVICEDRIVER_RYU'                  : 18,
+    'DEVICEDRIVER_GNMI_NOKIA_SRLINUX'   : 19,
+    'DEVICEDRIVER_OPENROADM'            : 20,
+    'DEVICEDRIVER_RESTCONF_OPENCONFIG'  : 21,
 }
 
 
diff --git a/src/device/service/drivers/optical_tfs/TfsApiClient.py b/src/device/service/drivers/optical_tfs/TfsApiClient.py
index 79802fcf6..59126c7b1 100644
--- a/src/device/service/drivers/optical_tfs/TfsApiClient.py
+++ b/src/device/service/drivers/optical_tfs/TfsApiClient.py
@@ -55,6 +55,9 @@ MAPPING_DRIVER = {
     'DEVICEDRIVER_SMARTNIC'             : 16,
     'DEVICEDRIVER_MORPHEUS'             : 17,
     'DEVICEDRIVER_RYU'                  : 18,
+    'DEVICEDRIVER_GNMI_NOKIA_SRLINUX'   : 19,
+    'DEVICEDRIVER_OPENROADM'            : 20,
+    'DEVICEDRIVER_RESTCONF_OPENCONFIG'  : 21,
 }
 
 LOGGER = logging.getLogger(__name__)
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 7fc4c8b8c..20dcd2bd3 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
@@ -2319,8 +2319,28 @@ public class Serializer {
                 return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_OPTICAL_TFS;
             case IETF_ACTN:
                 return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_IETF_ACTN;
+            case OC:
+                return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_OC;
+            case QKD:
+                return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_QKD;
+            case IETF_L3VPN:
+                return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_IETF_L3VPN;
+            case IETF_SLICE:
+                return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_IETF_SLICE;
+            case NCE:
+                return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_NCE;
             case SMARTNIC:
                 return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_SMARTNIC;
+            case MORPHEUS:
+                return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_MORPHEUS;
+            case RYU:
+                return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_RYU;
+            case GNMI_NOKIA_SRLINUX:
+                return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_GNMI_NOKIA_SRLINUX;
+            case OPENROADM:
+                return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_OPENROADM;
+            case RESTCONF_OPENCONFIG:
+                return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_RESTCONF_OPENCONFIG;
             case UNDEFINED:
             default:
                 return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_UNDEFINED;
@@ -2350,8 +2370,28 @@ public class Serializer {
                 return DeviceDriverEnum.OPTICAL_TFS;
             case DEVICEDRIVER_IETF_ACTN:
                 return DeviceDriverEnum.IETF_ACTN;
+            case DEVICEDRIVER_OC:
+                return DeviceDriverEnum.OC;
+            case DEVICEDRIVER_QKD:
+                return DeviceDriverEnum.QKD;
+            case DEVICEDRIVER_IETF_L3VPN:
+                return DeviceDriverEnum.IETF_L3VPN;
+            case DEVICEDRIVER_IETF_SLICE:
+                return DeviceDriverEnum.IETF_SLICE;
+            case DEVICEDRIVER_NCE:
+                return DeviceDriverEnum.NCE;
             case DEVICEDRIVER_SMARTNIC:
                 return DeviceDriverEnum.SMARTNIC;
+            case DEVICEDRIVER_MORPHEUS:
+                return DeviceDriverEnum.MORPHEUS;
+            case DEVICEDRIVER_RYU:
+                return DeviceDriverEnum.RYU;
+            case DEVICEDRIVER_GNMI_NOKIA_SRLINUX:
+                return DeviceDriverEnum.GNMI_NOKIA_SRLINUX;
+            case DEVICEDRIVER_OPENROADM:
+                return DeviceDriverEnum.OPENROADM;
+            case DEVICEDRIVER_RESTCONF_OPENCONFIG:
+                return DeviceDriverEnum.RESTCONF_OPENCONFIG;
             case DEVICEDRIVER_UNDEFINED:
             case UNRECOGNIZED:
             default:
diff --git a/src/service/service/service_handler_api/FilterFields.py b/src/service/service/service_handler_api/FilterFields.py
index 6da1d6f55..473efa3e0 100644
--- a/src/service/service/service_handler_api/FilterFields.py
+++ b/src/service/service/service_handler_api/FilterFields.py
@@ -58,6 +58,7 @@ DEVICE_DRIVER_VALUES = {
     DeviceDriverEnum.DEVICEDRIVER_RYU,
     DeviceDriverEnum.DEVICEDRIVER_GNMI_NOKIA_SRLINUX,
     DeviceDriverEnum.DEVICEDRIVER_OPENROADM,
+    DeviceDriverEnum.DEVICEDRIVER_RESTCONF_OPENCONFIG,
 }
 
 # Map allowed filter fields to allowed values per Filter field. If no restriction (free text) None is specified
diff --git a/src/webui/service/device/forms.py b/src/webui/service/device/forms.py
index be6bda21b..33465eeca 100644
--- a/src/webui/service/device/forms.py
+++ b/src/webui/service/device/forms.py
@@ -42,6 +42,8 @@ class AddDeviceForm(FlaskForm):
     device_drivers_morpheus = BooleanField('MORPHEUS')
     device_drivers_ryu = BooleanField('RYU')
     device_drivers_gnmi_nokia_srlinux = BooleanField('GNMI NOKIA SR LINUX')
+    device_drivers_gnmi_nokia_srlinux = BooleanField('OPENROADM')
+    device_drivers_restconf_openconfig = BooleanField('RESTCONF OPENCONFIG')
 
     device_config_address = StringField('connect/address',default='127.0.0.1',validators=[DataRequired(), Length(min=5)])
     device_config_port = StringField('connect/port',default='0',validators=[DataRequired(), Length(min=1)])
diff --git a/src/webui/service/device/routes.py b/src/webui/service/device/routes.py
index f48d5d300..d2975a75f 100644
--- a/src/webui/service/device/routes.py
+++ b/src/webui/service/device/routes.py
@@ -151,6 +151,10 @@ def add():
             device_drivers.append(DeviceDriverEnum.DEVICEDRIVER_RYU)
         if form.device_drivers_gnmi_nokia_srlinux.data:
             device_drivers.append(DeviceDriverEnum.DEVICEDRIVER_GNMI_NOKIA_SRLINUX)
+        if form.device_drivers_openroadm.data:
+            device_drivers.append(DeviceDriverEnum.DEVICEDRIVER_OPENROADM)
+        if form.device_drivers_restconf_openconfig.data:
+            device_drivers.append(DeviceDriverEnum.DEVICEDRIVER_RESTCONF_OPENCONFIG)
         device_obj.device_drivers.extend(device_drivers) # pylint: disable=no-member
 
         try:
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 250a38680..77dc1f373 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
@@ -1,18 +1,18 @@
 /*
-* Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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.
-*/
+ * Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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;
 
@@ -869,6 +869,28 @@ public class Serializer {
                 return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_OPTICAL_TFS;
             case IETF_ACTN:
                 return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_IETF_ACTN;
+            case OC:
+                return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_OC;
+            case QKD:
+                return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_QKD;
+            case IETF_L3VPN:
+                return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_IETF_L3VPN;
+            case IETF_SLICE:
+                return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_IETF_SLICE;
+            case NCE:
+                return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_NCE;
+            case SMARTNIC:
+                return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_SMARTNIC;
+            case MORPHEUS:
+                return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_MORPHEUS;
+            case RYU:
+                return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_RYU;
+            case GNMI_NOKIA_SRLINUX:
+                return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_GNMI_NOKIA_SRLINUX;
+            case OPENROADM:
+                return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_OPENROADM;
+            case RESTCONF_OPENCONFIG:
+                return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_RESTCONF_OPENCONFIG;
             case UNDEFINED:
             default:
                 return ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_UNDEFINED;
@@ -898,6 +920,28 @@ public class Serializer {
                 return DeviceDriverEnum.OPTICAL_TFS;
             case DEVICEDRIVER_IETF_ACTN:
                 return DeviceDriverEnum.IETF_ACTN;
+            case DEVICEDRIVER_OC:
+                return DeviceDriverEnum.OC;
+            case DEVICEDRIVER_QKD:
+                return DeviceDriverEnum.QKD;
+            case DEVICEDRIVER_IETF_L3VPN:
+                return DeviceDriverEnum.IETF_L3VPN;
+            case DEVICEDRIVER_IETF_SLICE:
+                return DeviceDriverEnum.IETF_SLICE;
+            case DEVICEDRIVER_NCE:
+                return DeviceDriverEnum.NCE;
+            case DEVICEDRIVER_SMARTNIC:
+                return DeviceDriverEnum.SMARTNIC;
+            case DEVICEDRIVER_MORPHEUS:
+                return DeviceDriverEnum.MORPHEUS;
+            case DEVICEDRIVER_RYU:
+                return DeviceDriverEnum.RYU;
+            case DEVICEDRIVER_GNMI_NOKIA_SRLINUX:
+                return DeviceDriverEnum.GNMI_NOKIA_SRLINUX;
+            case DEVICEDRIVER_OPENROADM:
+                return DeviceDriverEnum.OPENROADM;
+            case DEVICEDRIVER_RESTCONF_OPENCONFIG:
+                return DeviceDriverEnum.RESTCONF_OPENCONFIG;
             case DEVICEDRIVER_UNDEFINED:
             case UNRECOGNIZED:
             default:
-- 
GitLab


From 921bcda2726a7fd2e0fb10ad24a2c32a89d72ca7 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Wed, 5 Nov 2025 18:32:31 +0000
Subject: [PATCH 082/111] ZTP and Policy components:

- Added RESTCONF_OPENCONFIG Driver
---
 .../context/model/DeviceDriverEnum.java       |  3 +-
 .../java/org/etsi/tfs/ztp/Serializer.java     | 28 +++++++++----------
 .../ztp/context/model/DeviceDriverEnum.java   |  3 +-
 3 files changed, 18 insertions(+), 16 deletions(-)

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 1f7a4368c..d7db46f47 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
@@ -37,5 +37,6 @@ public enum DeviceDriverEnum {
     MORPHEUS,
     RYU,
     GNMI_NOKIA_SRLINUX,
-    OPENROADM
+    OPENROADM,
+    RESTCONF_OPENCONFIG
 }
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 77dc1f373..a1a008eb8 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
@@ -1,18 +1,18 @@
 /*
- * Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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.
- */
+* Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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;
 
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 27187f254..d67dc62ca 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
@@ -37,5 +37,6 @@ public enum DeviceDriverEnum {
     MORPHEUS,
     RYU,
     GNMI_NOKIA_SRLINUX,
-    OPENROADM
+    OPENROADM,
+    RESTCONF_OPENCONFIG
 }
-- 
GitLab


From 2b1df779590815ae2a4da267a94851d6e17ba52f Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Thu, 6 Nov 2025 11:15:12 +0000
Subject: [PATCH 083/111] Fix versions of basic development libraries.

---
 install_requirements.sh | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/install_requirements.sh b/install_requirements.sh
index 5401a57c9..9d2705e9e 100755
--- a/install_requirements.sh
+++ b/install_requirements.sh
@@ -47,9 +47,12 @@ sudo ldconfig
 cd ../..
 
 echo "Updating PIP, SetupTools and Wheel..."
-pip install --upgrade pip               # ensure next packages get the latest versions
-pip install --upgrade setuptools wheel  # bring basic tooling for other requirements
-pip install --upgrade pip-tools pylint  # bring tooling for package compilation and code linting
+# Bring basic tooling for other requirements, package compilation, and code linting.
+# Ensure next packages get the fixed versions to prevent:
+#   "'InstallRequirement' object has no attribute 'use_pep517'"
+pip install --upgrade 'pip==25.2'
+pip install --upgrade 'setuptools==79.0.0' 'wheel==0.45.1'
+pip install --upgrade 'pip-tools==7.3.0'
 printf "\n"
 
 echo "Creating integrated requirements file..."
-- 
GitLab


From 8a0b21daed0a8ade67e02646d18b2b8eeb5dd164 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Thu, 6 Nov 2025 18:21:30 +0000
Subject: [PATCH 084/111] Tests - Tools - Firewall Agent:

- Fixed manual instantiation of chain object
---
 .../firewall_agent/resources/nft_model/Chain.py             | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py
index 261f19b64..f9b67ad3e 100644
--- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py
@@ -49,10 +49,10 @@ class Chain:
     ) -> 'Chain':
         chain : 'Chain' = cls(family, table, name)
         chain.handle = handle
-        if type_ is None: type_ = str(table.value).lower()
-        if hook is None: hook = str(name).lower()
+        if type_ is None: chain.type = str(table.value).lower()
+        if hook is None: chain.hook = str(name).lower()
         chain.prio = prio
-        chain.policy = policy
+        chain.policy = policy.value
         return chain
 
     @classmethod
-- 
GitLab


From 9617dfbd220edc79881c5d5343a58ff03076897e Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Thu, 6 Nov 2025 18:22:52 +0000
Subject: [PATCH 085/111] Common - Tools - RestConf - Client:

- Fixed discovery of base URL from host-meta
---
 src/common/tools/rest_conf/client/RestConfClient.py | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/common/tools/rest_conf/client/RestConfClient.py b/src/common/tools/rest_conf/client/RestConfClient.py
index 088bb4ae1..953e68716 100644
--- a/src/common/tools/rest_conf/client/RestConfClient.py
+++ b/src/common/tools/rest_conf/client/RestConfClient.py
@@ -61,6 +61,10 @@ class RestConfClient(RestApiClient):
         self._base_url = str(href).replace('//', '/')
         if self._restconf_version is not None:
             self._base_url += '/{:s}'.format(self._restconf_version)
+        if self._base_url.endswith('/data/'):
+            self._base_url = self._base_url.split('/data/')[0]
+        elif self._base_url.endswith('/data'):
+            self._base_url = self._base_url.split('/data')[0]
 
 
     def get(
-- 
GitLab


From fc2674a87d8df89e713df83da41daed4a75d6257 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Thu, 6 Nov 2025 18:25:47 +0000
Subject: [PATCH 086/111] Device component - RESTCONF OPENCONFIG Driver:

- Added test scripts and data files
- Implemented driver skeleton
- Implemented discovery of endpoints
- Implemented management of ACL rules
---
 ...ests_locally-device-restconf-openconfig.sh |  25 ++
 .../RestConfOpenConfigDriver.py               | 173 ++++++++++++
 .../drivers/restconf_openconfig/__init__.py   |  14 +
 .../handlers/AclRuleSetHandler.py             | 248 ++++++++++++++++++
 .../handlers/ComponentsHandler.py             |  71 +++++
 .../restconf_openconfig/handlers/__init__.py  |  13 +
 .../tests/restconf_openconfig/__init__.py     |  14 +
 .../data/accept_30435_from_10_0_2_10.json     |  19 ++
 .../data/accept_30435_from_10_0_2_2.json      |  19 ++
 .../data/reject_30435_from_all.json           |  19 ++
 .../test_unitary_restconf_openconfig.py       | 150 +++++++++++
 11 files changed, 765 insertions(+)
 create mode 100755 scripts/run_tests_locally-device-restconf-openconfig.sh
 create mode 100644 src/device/service/drivers/restconf_openconfig/RestConfOpenConfigDriver.py
 create mode 100644 src/device/service/drivers/restconf_openconfig/__init__.py
 create mode 100644 src/device/service/drivers/restconf_openconfig/handlers/AclRuleSetHandler.py
 create mode 100644 src/device/service/drivers/restconf_openconfig/handlers/ComponentsHandler.py
 create mode 100644 src/device/service/drivers/restconf_openconfig/handlers/__init__.py
 create mode 100644 src/device/tests/restconf_openconfig/__init__.py
 create mode 100644 src/device/tests/restconf_openconfig/data/accept_30435_from_10_0_2_10.json
 create mode 100644 src/device/tests/restconf_openconfig/data/accept_30435_from_10_0_2_2.json
 create mode 100644 src/device/tests/restconf_openconfig/data/reject_30435_from_all.json
 create mode 100644 src/device/tests/restconf_openconfig/test_unitary_restconf_openconfig.py

diff --git a/scripts/run_tests_locally-device-restconf-openconfig.sh b/scripts/run_tests_locally-device-restconf-openconfig.sh
new file mode 100755
index 000000000..974d584b1
--- /dev/null
+++ b/scripts/run_tests_locally-device-restconf-openconfig.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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=DEBUG --verbose -o log_cli=true \
+    device/tests/restconf_openconfig/test_unitary_restconf_openconfig.py
diff --git a/src/device/service/drivers/restconf_openconfig/RestConfOpenConfigDriver.py b/src/device/service/drivers/restconf_openconfig/RestConfOpenConfigDriver.py
new file mode 100644
index 000000000..b940f27ba
--- /dev/null
+++ b/src/device/service/drivers/restconf_openconfig/RestConfOpenConfigDriver.py
@@ -0,0 +1,173 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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 copy, json, logging, re, requests, threading
+from typing import Any, Iterator, List, Optional, Tuple, Union
+from common.method_wrappers.Decorator import MetricsPool, metered_subclass_method
+from common.tools.rest_conf.client.RestConfClient import RestConfClient
+from common.type_checkers.Checkers import chk_string, chk_type
+from device.service.driver_api._Driver import (
+    _Driver, RESOURCE_ACL, RESOURCE_ENDPOINTS, RESOURCE_INTERFACES
+)
+from .handlers.ComponentsHandler import ComponentsHandler
+from .handlers.AclRuleSetHandler import AclRuleSetHandler
+
+
+ALL_RESOURCE_KEYS = [
+    RESOURCE_ACL,
+    RESOURCE_ENDPOINTS,
+    RESOURCE_INTERFACES,
+]
+
+
+RE_ACL_RULESET = re.compile(
+    r'^\/device\[([^\]]+)\]\/endpoint\[([^\]]+)\]\/acl\_ruleset\[([^\]]+)\]$'
+)
+
+def parse_resource_key(resource_key : str) -> Optional[Tuple[str, str, str]]:
+    re_match_acl_ruleset = RE_ACL_RULESET.match(resource_key)
+    if re_match_acl_ruleset is None: return None
+    device_key, endpoint_key, acl_ruleset_name = re_match_acl_ruleset.groups()
+    return device_key, endpoint_key, acl_ruleset_name
+
+
+
+DRIVER_NAME = 'restconf_openconfig'
+METRICS_POOL = MetricsPool('Device', 'Driver', labels={'driver': DRIVER_NAME})
+
+
+class RestConfOpenConfigDriver(_Driver):
+    def __init__(self, address : str, port : int, **settings) -> None:
+        super().__init__(DRIVER_NAME, address, port, **settings)
+        logger_prefix = '{:s}:[{:s}:{:s}]'.format(
+            str(__name__), str(self.address), str(self.port)
+        )
+        self.__logger = logging.getLogger(logger_prefix)
+        self.__lock = threading.Lock()
+        self.__started = threading.Event()
+        self.__terminate = threading.Event()
+
+        restconf_settings = copy.deepcopy(settings)
+        restconf_settings['logger'] = logging.getLogger(logger_prefix + '.RestConfClient_v1')
+
+        self._rest_conf_client = RestConfClient(address, port=port, **restconf_settings)
+        self._handler_components = ComponentsHandler(self._rest_conf_client)
+        self._handler_acl_ruleset = AclRuleSetHandler(self._rest_conf_client)
+
+    def Connect(self) -> bool:
+        with self.__lock:
+            if self.__started.is_set(): return True
+            try:
+                self._rest_conf_client._discover_base_url()
+            except requests.exceptions.Timeout:
+                self.__logger.exception('Timeout exception checking connectivity')
+                return False
+            except Exception:  # pylint: disable=broad-except
+                self.__logger.exception('Unhandled exception checking connectivity')
+                return False
+            else:
+                self.__started.set()
+                return True
+
+    def Disconnect(self) -> bool:
+        with self.__lock:
+            self.__terminate.set()
+            if not self.__started.is_set(): return True
+            return True
+
+    @metered_subclass_method(METRICS_POOL)
+    def GetInitialConfig(self) -> List[Tuple[str, Any]]:
+        with self.__lock:
+            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)
+        results = list()
+        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)
+                try:
+                    chk_string(str_resource_name, resource_key, allow_empty=False)
+                    if resource_key == RESOURCE_ENDPOINTS:
+                        results.extend(self._handler_components.get())
+                    elif resource_key == RESOURCE_ACL:
+                        results.extend(self._handler_acl_ruleset.get())
+                    else:
+                        parts = parse_resource_key(resource_key)
+                        if parts is None: continue
+                        device_key, endpoint_key, acl_ruleset_name = parts
+                        results.extend(self._handler_acl_ruleset.get(acl_ruleset_name=acl_ruleset_name))
+                except Exception as e:
+                    MSG = 'Error processing resource_key({:s}, {:s})'
+                    self.__logger.exception(MSG.format(str_resource_name, str(resource_key)))
+                    results.append((resource_key, e))  # if processing fails, store the exception
+
+        return results
+
+    @metered_subclass_method(METRICS_POOL)
+    def SetConfig(self, resources : List[Tuple[str, Any]]) -> List[Union[bool, Exception]]:
+        chk_type('resources', resources, list)
+        if len(resources) == 0: return []
+
+        results = []
+        with self.__lock:
+            for resource_key, resource_value in resources:
+                self.__logger.info('resource: key({:s}) => value({:s})'.format(str(resource_key), str(resource_value)))
+                try:
+                    if isinstance(resource_value, str): resource_value = json.loads(resource_value)
+                    if parse_resource_key(resource_key) is None: continue
+                    results.append(self._handler_acl_ruleset.update(resource_value))
+                except Exception as e:
+                    results.append(e)
+
+        return results
+
+    @metered_subclass_method(METRICS_POOL)
+    def DeleteConfig(self, resources : List[Tuple[str, Any]]) -> List[Union[bool, Exception]]:
+        chk_type('resources', resources, list)
+        if len(resources) == 0: return []
+
+        results = []
+        with self.__lock:
+            for resource_key, resource_value in resources:
+                self.__logger.info('resource: key({:s}) => value({:s})'.format(str(resource_key), str(resource_value)))
+                try:
+                    #if isinstance(resource_value, str): resource_value = json.loads(resource_value)
+                    resource_key_parts = parse_resource_key(resource_key)
+                    if resource_key_parts is None: continue
+                    _, _, acl_ruleset_name = resource_key_parts
+                    results.append(self._handler_acl_ruleset.delete(acl_ruleset_name))
+                except Exception as e:
+                    results.append(e)
+
+        return results
+
+    @metered_subclass_method(METRICS_POOL)
+    def SubscribeState(self, subscriptions : List[Tuple[str, float, float]]) -> List[Union[bool, Exception]]:
+        # TODO: RESTCONF OPENCONFIG 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]]:
+        # TODO: RESTCONF OPENCONFIG 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: RESTCONF OPENCONFIG does not support monitoring by now
+        return []
diff --git a/src/device/service/drivers/restconf_openconfig/__init__.py b/src/device/service/drivers/restconf_openconfig/__init__.py
new file mode 100644
index 000000000..3ccc21c7d
--- /dev/null
+++ b/src/device/service/drivers/restconf_openconfig/__init__.py
@@ -0,0 +1,14 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/device/service/drivers/restconf_openconfig/handlers/AclRuleSetHandler.py b/src/device/service/drivers/restconf_openconfig/handlers/AclRuleSetHandler.py
new file mode 100644
index 000000000..7e52980fc
--- /dev/null
+++ b/src/device/service/drivers/restconf_openconfig/handlers/AclRuleSetHandler.py
@@ -0,0 +1,248 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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, Dict, List, Optional, Tuple, Union
+from common.proto.context_pb2 import AclDirectionEnum
+from common.tools.rest_conf.client.RestConfClient import RestConfClient
+
+
+LOGGER = logging.getLogger(__name__)
+
+
+_TFS_2_OC_RULE_TYPE = {
+    'ACLRULETYPE_IPV4': 'ACL_IPV4',
+    'ACLRULETYPE_IPV6': 'ACL_IPV6',
+}
+_OC_2_TFS_RULE_TYPE  = {v: k for k, v in _TFS_2_OC_RULE_TYPE.items() }
+
+_TFS_2_OC_PROTOCOL = {
+    1  : 'IP_ICMP',
+    6  : 'IP_TCP',
+    17 : 'IP_UDP',
+}
+_OC_2_TFS_PROTOCOL  = {v: k for k, v in _TFS_2_OC_PROTOCOL.items() }
+
+_TFS_2_OC_FWD_ACTION = {
+    'ACLFORWARDINGACTION_DROP'  : 'DROP',
+    'ACLFORWARDINGACTION_ACCEPT': 'ACCEPT',
+    'ACLFORWARDINGACTION_REJECT': 'REJECT',
+}
+_OC_2_TFS_FWD_ACTION = {v: k for k, v in _TFS_2_OC_FWD_ACTION.items()}
+
+
+DIRECTION_INGRESS = {
+    AclDirectionEnum.ACLDIRECTION_BOTH,
+    AclDirectionEnum.Name(AclDirectionEnum.ACLDIRECTION_BOTH),
+    AclDirectionEnum.ACLDIRECTION_INGRESS,
+    AclDirectionEnum.Name(AclDirectionEnum.ACLDIRECTION_INGRESS),
+}
+
+DIRECTION_EGRESS = {
+    AclDirectionEnum.ACLDIRECTION_BOTH,
+    AclDirectionEnum.Name(AclDirectionEnum.ACLDIRECTION_BOTH),
+    AclDirectionEnum.ACLDIRECTION_EGRESS,
+    AclDirectionEnum.Name(AclDirectionEnum.ACLDIRECTION_EGRESS),
+}
+
+
+class AclRuleSetHandler:
+    def __init__(self, rest_conf_client : RestConfClient) -> None:
+        self._rest_conf_client = rest_conf_client
+        self._subpath_root = '/openconfig-acl:acl'
+        self._subpath_item = self._subpath_root + '/acl-sets/acl-set={acl_ruleset_name:s}'
+
+
+    def get(self, acl_ruleset_name : Optional[str] = None) -> Union[Dict, List]:
+        if acl_ruleset_name is None:
+            subpath_url = self._subpath_root
+        else:
+            subpath_url = self._subpath_item.format(acl_ruleset_name=acl_ruleset_name)
+
+        reply = self._rest_conf_client.get(subpath_url)
+
+        if 'openconfig-acl:acl' not in reply:
+            raise Exception('Malformed reply. "openconfig-acl:acl" missing')
+        acls = reply['openconfig-acl:acl']
+
+        if 'acl-sets' not in acls:
+            raise Exception('Malformed reply. "openconfig-acl:acl/acl-sets" missing')
+        aclsets = acls['acl-sets']
+
+        if 'acl-set' not in aclsets:
+            raise Exception('Malformed reply. "openconfig-acl:acl/acl-sets/acl-set" missing')
+        aclset_lst = aclsets['acl-set']
+
+        if len(aclset_lst) == 0:
+            MSG = '[get] No ACL-Sets are reported'
+            LOGGER.debug(MSG)
+            return list()
+
+        results : List[Tuple[str, Dict[str, Any]]] = list()
+        for acl_set in aclset_lst:
+            acl_set_name = acl_set['name']
+            oc_acl_set_type = acl_set['config']['type']
+            tfs_acl_set_type = _OC_2_TFS_RULE_TYPE[oc_acl_set_type]
+
+            rule_set: Dict[str, Any] = {
+                'name'       : acl_set_name,
+                'type'       : tfs_acl_set_type,
+                'entries'    : [],
+            }
+
+            acl_set_config : Dict = acl_set.get('config', {})
+            acl_set_description = acl_set_config.get('description')
+            if acl_set_description is not None:
+                rule_set['description'] = acl_set_description
+
+            for ace in acl_set.get('acl-entries', {}).get('acl-entry', []):
+                seq = ace['sequence-id']
+
+                ipv4_cfg = ace.get('ipv4', {}).get('config', {})
+                match = dict()
+                if 'source-address' in ipv4_cfg:
+                    match['src_address'] = ipv4_cfg['source-address']
+                if 'destination-address' in ipv4_cfg:
+                    match['dst_address'] = ipv4_cfg['destination-address']
+                if 'protocol' in ipv4_cfg:
+                    match['protocol'] = _OC_2_TFS_PROTOCOL[ipv4_cfg['protocol']]
+
+                transp_cfg = ace.get('transport', {}).get('config', {})
+                if 'source-port' in transp_cfg:
+                    match['src_port'] = transp_cfg['source-port']
+                if 'destination-port' in transp_cfg:
+                    match['dst_port'] = transp_cfg['destination-port']
+
+                act = ace.get('actions', {}).get('config', {}).get('forwarding-action', 'DROP')
+                fwd_tfs = _OC_2_TFS_FWD_ACTION[act]
+
+                rule_set['entries'].append({
+                    'sequence_id': seq,
+                    'match': match,
+                    'action': {'forward_action': fwd_tfs},
+                })
+
+            # find where that ACL is bound (first matching interface)
+            if_name = ''
+            for intf in acls.get('interfaces', {}).get('interface', []):
+                for ing in intf.get('ingress-acl-sets', {}).get('ingress-acl-set', []):
+                    if ing['set-name'] == acl_set_name:
+                        if_name = intf['id']
+                        break
+
+            path = '/device[]/endpoint[{:s}]/acl_ruleset[{:s}]'.format(
+                if_name, acl_set_name
+            )
+            tfs_acl_data = {
+                'endpoint_id': {'endpoint_uuid': {'uuid': if_name}},
+                'direction': 'ACLDIRECTION_INGRESS',
+                'rule_set': rule_set,
+            }
+            results.append((path, tfs_acl_data))
+
+        return results
+
+
+    def update(self, acl_data : Dict) -> bool:
+        if_name   = acl_data['endpoint_id']['endpoint_uuid']['uuid']
+        direction = acl_data['direction']
+        rule_set  = acl_data['rule_set']
+
+        if direction in DIRECTION_INGRESS:
+            acl_set_name = 'ip-filter-input'
+        elif direction in DIRECTION_EGRESS:
+            acl_set_name = 'ip-filter-output'
+        else:
+            MSG = 'Unsupported direction: {:s}'
+            raise Exception(MSG.format(str(direction)))
+
+        acl_entry_desc = rule_set['name']
+        acl_set_type   = _TFS_2_OC_RULE_TYPE[rule_set['type']]
+
+        oc_acl_entries = list()
+        sequence_ids : List[int] = list()
+        for entry in rule_set.get('entries', []):
+            sequence_id = int(entry['sequence_id'])
+            oc_action = _TFS_2_OC_FWD_ACTION[entry['action']['forward_action']]
+            oc_acl_entry = {
+                'sequence-id': sequence_id,
+                'config': {'sequence-id': sequence_id, 'description' : acl_entry_desc},
+                'actions': {'config': {'forwarding-action': oc_action}}
+            }
+
+            entry_match = entry.get('match', dict())
+
+            ipv4_config = dict()
+            if 'protocol' in entry_match:
+                ipv4_config['protocol'] = _TFS_2_OC_PROTOCOL[entry_match['protocol']]
+            if 'src_address' in entry_match:
+                ipv4_config['source-address'] = entry_match['src_address']
+            if 'dst_address' in entry_match:
+                ipv4_config['destination-address'] = entry_match['dst_address']
+            if len(ipv4_config) > 0:
+                oc_acl_entry.setdefault('ipv4', dict())['config'] = ipv4_config
+
+            transport_config = dict()
+            if 'src_port' in entry_match:
+                transport_config['source-port'] = entry_match['src_port']
+            if 'dst_port' in entry_match:
+                transport_config['destination-port'] = entry_match['dst_port']
+            if len(transport_config) > 0:
+                oc_acl_entry.setdefault('transport', dict())['config'] = transport_config
+
+            oc_acl_entries.append(oc_acl_entry)
+            sequence_ids.append(sequence_id)
+
+        oc_interface = {
+            'id': if_name,
+            'config': {'id': if_name},
+            'interface-ref': {'config': {'interface': if_name, 'subinterface': 1}},
+        }
+
+        if direction in DIRECTION_INGRESS:
+            oc_interface['ingress-acl-sets'] = {'ingress-acl-set': [{
+                'set-name': acl_set_name, 'type': acl_set_type,
+                'config': {'set-name': acl_set_name, 'type': acl_set_type},
+                'acl-entries': {'acl-entry': [
+                    {'sequence-id': sequence_id}
+                    for sequence_id in sequence_ids
+                ]}
+            }]}
+
+        if direction in DIRECTION_EGRESS:
+            oc_interface['egress-acl-sets'] = {'egress-acl-set': [{
+                'set-name': acl_set_name, 'type': acl_set_type,
+                'config': {'set-name': acl_set_name, 'type': acl_set_type},
+                'acl-entries': {'acl-entry': [
+                    {'sequence-id': sequence_id}
+                    for sequence_id in sequence_ids
+                ]}
+            }]}
+
+        oc_acl_data = {'openconfig-acl:acl': {
+            'acl-sets': {'acl-set': [{
+                'name': acl_set_name, 'type': acl_set_type,
+                'config': {'name': acl_set_name, 'type': acl_set_type},
+                'acl-entries': {'acl-entry': oc_acl_entries},
+            }]},
+            'interfaces': {'interface': [oc_interface]},
+        }}
+        return self._rest_conf_client.post(self._subpath_root, body=oc_acl_data) is not None
+
+
+    def delete(self, acl_ruleset_name : str) -> bool:
+        if acl_ruleset_name is None: raise Exception('acl_ruleset_name is None')
+        subpath_url = self._subpath_item.format(acl_ruleset_name=acl_ruleset_name)
+        return self._rest_conf_client.delete(subpath_url)
diff --git a/src/device/service/drivers/restconf_openconfig/handlers/ComponentsHandler.py b/src/device/service/drivers/restconf_openconfig/handlers/ComponentsHandler.py
new file mode 100644
index 000000000..f2c9fc6e3
--- /dev/null
+++ b/src/device/service/drivers/restconf_openconfig/handlers/ComponentsHandler.py
@@ -0,0 +1,71 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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, List, Tuple
+from common.tools.rest_conf.client.RestConfClient import RestConfClient
+
+
+LOGGER = logging.getLogger(__name__)
+
+
+class ComponentsHandler:
+    def __init__(self, rest_conf_client : RestConfClient) -> None:
+        self._rest_conf_client = rest_conf_client
+        self._subpath_root = '/openconfig-platform:components'
+
+    def get(self) -> List[Tuple[str, Dict]]:
+        reply = self._rest_conf_client.get(self._subpath_root)
+
+        if 'openconfig-platform:components' not in reply:
+            raise Exception('Malformed reply. "openconfig-platform:components" missing')
+        components = reply['openconfig-platform:components']
+
+        if 'component' not in components:
+            raise Exception('Malformed reply. "openconfig-platform:components/component" missing')
+        component_lst = components['component']
+
+        if len(component_lst) == 0:
+            MSG = '[get] No components are reported'
+            LOGGER.debug(MSG)
+            return list()
+        
+        entries : List[Tuple[str, Dict]] = list()
+        for component in component_lst:
+            if 'state' not in component:
+                MSG = 'Malformed component. "state" missing: {:s}'
+                raise Exception(MSG.format(str(component)))
+            comp_state = component['state']
+
+            if 'type' not in comp_state:
+                MSG = 'Malformed component. "state/type" missing: {:s}'
+                raise Exception(MSG.format(str(component)))
+            comp_type : str = comp_state['type']
+            comp_type = comp_type.split(':')[-1]
+            if comp_type  != 'PORT': continue
+
+            if 'name' not in component:
+                MSG = 'Malformed component. "name" missing: {:s}'
+                raise Exception(MSG.format(str(component)))
+            comp_name = component['name']
+
+            if comp_name.startswith('cali'): continue # calico port
+            if comp_name.startswith('vxlan'): continue # vxlan.calico port
+            if comp_name.startswith('docker'): continue # docker port
+            if comp_name in {'lo', 'loop', 'loopback'}: continue # loopback port
+
+            endpoint = {'uuid': comp_name, 'type': '-'}
+            entries.append(('/endpoints/endpoint[{:s}]'.format(endpoint['uuid']), endpoint))
+
+        return entries
diff --git a/src/device/service/drivers/restconf_openconfig/handlers/__init__.py b/src/device/service/drivers/restconf_openconfig/handlers/__init__.py
new file mode 100644
index 000000000..7363515f0
--- /dev/null
+++ b/src/device/service/drivers/restconf_openconfig/handlers/__init__.py
@@ -0,0 +1,13 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/device/tests/restconf_openconfig/__init__.py b/src/device/tests/restconf_openconfig/__init__.py
new file mode 100644
index 000000000..3ccc21c7d
--- /dev/null
+++ b/src/device/tests/restconf_openconfig/__init__.py
@@ -0,0 +1,14 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/device/tests/restconf_openconfig/data/accept_30435_from_10_0_2_10.json b/src/device/tests/restconf_openconfig/data/accept_30435_from_10_0_2_10.json
new file mode 100644
index 000000000..edb3b9177
--- /dev/null
+++ b/src/device/tests/restconf_openconfig/data/accept_30435_from_10_0_2_10.json
@@ -0,0 +1,19 @@
+{
+    "endpoint_id": {
+        "device_id": {"device_uuid": {"uuid": "my-firewall"}},
+        "endpoint_uuid": {"uuid": "enp0s3"}
+    },
+    "direction": "ACLDIRECTION_INGRESS",
+    "rule_set": {
+        "name"        : "accept-30435-from-10-0-2-10",
+        "type"        : "ACLRULETYPE_IPV4",
+        "description" : "accept-30435-from-10-0-2-10",
+        "user_id"     : "teraflowsdn",
+        "entries"     : [{
+            "sequence_id" : 1,
+            "description" : "accept-30435-from-10-0-2-10",
+            "match"       : {"src_address": "10.0.2.10/32", "protocol": 6, "dst_port": 30435},
+            "action"      : {"forward_action": "ACLFORWARDINGACTION_ACCEPT"}
+        }]
+    }
+}
diff --git a/src/device/tests/restconf_openconfig/data/accept_30435_from_10_0_2_2.json b/src/device/tests/restconf_openconfig/data/accept_30435_from_10_0_2_2.json
new file mode 100644
index 000000000..9a2b7c7c1
--- /dev/null
+++ b/src/device/tests/restconf_openconfig/data/accept_30435_from_10_0_2_2.json
@@ -0,0 +1,19 @@
+{
+    "endpoint_id": {
+        "device_id": {"device_uuid": {"uuid": "my-firewall"}},
+        "endpoint_uuid": {"uuid": "enp0s3"}
+    },
+    "direction": "ACLDIRECTION_INGRESS",
+    "rule_set": {
+        "name"        : "accept-30435-from-10-0-2-2",
+        "type"        : "ACLRULETYPE_IPV4",
+        "description" : "accept-30435-from-10-0-2-2",
+        "user_id"     : "teraflowsdn",
+        "entries"     : [{
+            "sequence_id" : 1,
+            "description" : "accept-30435-from-10-0-2-2",
+            "match"       : {"src_address": "10.0.2.2/32", "protocol": 6, "dst_port": 30435},
+            "action"      : {"forward_action": "ACLFORWARDINGACTION_ACCEPT"}
+        }]
+    }
+}
diff --git a/src/device/tests/restconf_openconfig/data/reject_30435_from_all.json b/src/device/tests/restconf_openconfig/data/reject_30435_from_all.json
new file mode 100644
index 000000000..79a87086a
--- /dev/null
+++ b/src/device/tests/restconf_openconfig/data/reject_30435_from_all.json
@@ -0,0 +1,19 @@
+{
+    "endpoint_id": {
+        "device_id": {"device_uuid": {"uuid": "my-firewall"}},
+        "endpoint_uuid": {"uuid": "enp0s3"}
+    },
+    "direction": "ACLDIRECTION_INGRESS",
+    "rule_set": {
+        "name"        : "reject-30435-from-all",
+        "type"        : "ACLRULETYPE_IPV4",
+        "description" : "reject-30435-from-all",
+        "user_id"     : "teraflowsdn",
+        "entries"     : [{
+            "sequence_id" : 10000,
+            "description" : "reject-30435-from-all",
+            "match"       : {"protocol": 6, "dst_port": 30435},
+            "action"      : {"forward_action": "ACLFORWARDINGACTION_REJECT"}
+        }]
+    }
+}
diff --git a/src/device/tests/restconf_openconfig/test_unitary_restconf_openconfig.py b/src/device/tests/restconf_openconfig/test_unitary_restconf_openconfig.py
new file mode 100644
index 000000000..0d4aa6253
--- /dev/null
+++ b/src/device/tests/restconf_openconfig/test_unitary_restconf_openconfig.py
@@ -0,0 +1,150 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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
+os.environ['DEVICE_EMULATED_ONLY'] = 'YES'
+
+
+# pylint: disable=wrong-import-position
+import json, logging, pytest, time
+from typing import Dict, List, Tuple, Union
+from device.service.driver_api._Driver import RESOURCE_ACL, RESOURCE_ENDPOINTS
+from device.service.drivers.restconf_openconfig.RestConfOpenConfigDriver import RestConfOpenConfigDriver
+
+
+DATA_FILE_PATH = 'device/tests/restconf_openconfig/data/'
+
+##### LOGGERS ##########################################################################################################
+
+logging.basicConfig(level=logging.DEBUG)
+LOGGER = logging.getLogger(__name__)
+LOGGER.setLevel(logging.DEBUG)
+
+
+##### DRIVER FIXTURE ###################################################################################################
+
+DRIVER_ADDRESS  = '10.0.2.25'
+DRIVER_PORT     = 8888
+DRIVER_SETTINGS = dict(
+    scheme='http', username='admin', password='admin',
+    timeout=30, verify_certs=False, allow_redirects=True,
+)
+
+@pytest.fixture(scope='session')
+def driver() -> RestConfOpenConfigDriver:
+    _driver = RestConfOpenConfigDriver(
+        DRIVER_ADDRESS, DRIVER_PORT, **DRIVER_SETTINGS
+    )
+    _driver.Connect()
+    yield _driver
+    time.sleep(1)
+    _driver.Disconnect()
+
+
+##### HELPER METHODS ###################################################################################################
+
+def get_config(
+    driver : RestConfOpenConfigDriver, resources_to_get : List[str]
+) -> List[Tuple[str, Dict]]:
+    LOGGER.info('[get_config] resources_to_get = {:s}'.format(str(resources_to_get)))
+    results_getconfig = driver.GetConfig(resources_to_get)
+    LOGGER.info('[get_config] results_getconfig = {:s}'.format(str(results_getconfig)))
+    return results_getconfig
+
+def set_config(
+    driver : RestConfOpenConfigDriver, resources_to_set : List[Tuple[str, Dict]]
+) -> List[Tuple[str, Union[bool, Exception]]]:
+    LOGGER.info('[set_config] resources_to_set = {:s}'.format(str(resources_to_set)))
+    results_setconfig = driver.SetConfig(resources_to_set)
+    LOGGER.info('[set_config] results_setconfig = {:s}'.format(str(results_setconfig)))
+    return results_setconfig
+
+def del_config(
+    driver : RestConfOpenConfigDriver, resources_to_delete : List[Tuple[str, Dict]]
+) -> List[Tuple[str, Union[bool, Exception]]]:
+    LOGGER.info('[del_config] resources_to_delete = {:s}'.format(str(resources_to_delete)))
+    results_deleteconfig = driver.DeleteConfig(resources_to_delete)
+    LOGGER.info('[del_config] results_deleteconfig = {:s}'.format(str(results_deleteconfig)))
+    return results_deleteconfig
+
+def create_acl_from_file(file_name : str) -> Tuple[str, Dict]:
+    with open(DATA_FILE_PATH + file_name, 'r', encoding='UTF-8') as f:
+        acl_data = json.load(f)
+        device_uuid   = acl_data['endpoint_id']['device_id']['device_uuid']['uuid']
+        endpoint_uuid = acl_data['endpoint_id']['endpoint_uuid']['uuid']
+        aclset_name   = acl_data['rule_set']['name']
+        key_or_path = '/device[{:s}]/endpoint[{:s}]/acl_ruleset[{:s}]'.format(
+            device_uuid, endpoint_uuid, aclset_name
+        )
+        return key_or_path, acl_data
+
+
+##### TEST METHODS #####################################################################################################
+
+def test_get_endpoints(
+    driver : RestConfOpenConfigDriver,  # pylint: disable=redefined-outer-name
+) -> None:
+    results_getconfig = get_config(driver, [RESOURCE_ENDPOINTS])
+    assert len(results_getconfig) > 0
+    endpoint_names = {res_val['uuid'] for _, res_val in results_getconfig}
+    assert len(endpoint_names) == 1
+    assert 'enp0s3' in endpoint_names
+
+
+def test_get_acls(
+    driver : RestConfOpenConfigDriver,  # pylint: disable=redefined-outer-name
+) -> None:
+    get_config(driver, [RESOURCE_ACL])
+
+
+def test_set_acl_reject_30435_from_all(
+    driver : RestConfOpenConfigDriver,  # pylint: disable=redefined-outer-name
+) -> None:
+    resources_to_set = [create_acl_from_file('reject_30435_from_all.json')]
+    set_config(driver, resources_to_set)
+
+
+def test_set_acl_accept_30435_from_10_0_2_2(
+    driver : RestConfOpenConfigDriver,  # pylint: disable=redefined-outer-name
+) -> None:
+    resources_to_set = [create_acl_from_file('accept_30435_from_10_0_2_2.json')]
+    set_config(driver, resources_to_set)
+
+
+def test_set_acl_accept_30435_from_10_0_2_10(
+    driver : RestConfOpenConfigDriver,  # pylint: disable=redefined-outer-name
+) -> None:
+    resources_to_set = [create_acl_from_file('accept_30435_from_10_0_2_10.json')]
+    set_config(driver, resources_to_set)
+
+
+def test_del_acl_accept_30435_from_10_0_2_10(
+    driver : RestConfOpenConfigDriver,  # pylint: disable=redefined-outer-name
+) -> None:
+    resources_to_delete = [create_acl_from_file('accept_30435_from_10_0_2_10.json')]
+    del_config(driver, resources_to_delete)
+
+
+def test_del_acl_accept_30435_from_10_0_2_2(
+    driver : RestConfOpenConfigDriver,  # pylint: disable=redefined-outer-name
+) -> None:
+    resources_to_delete = [create_acl_from_file('accept_30435_from_10_0_2_2.json')]
+    del_config(driver, resources_to_delete)
+
+
+def test_del_acl_reject_30435_from_all(
+    driver : RestConfOpenConfigDriver,  # pylint: disable=redefined-outer-name
+) -> None:
+    resources_to_delete = [create_acl_from_file('reject_30435_from_all.json')]
+    del_config(driver, resources_to_delete)
-- 
GitLab


From 509c62d4d9a435491d69ced5561e25854cdba1dd Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Fri, 7 Nov 2025 15:36:57 +0000
Subject: [PATCH 087/111] Common - Device Types:

- Added packet firewall device type
---
 src/common/DeviceTypes.py | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/common/DeviceTypes.py b/src/common/DeviceTypes.py
index a8006b3da..948de0e98 100644
--- a/src/common/DeviceTypes.py
+++ b/src/common/DeviceTypes.py
@@ -33,6 +33,7 @@ class DeviceTypeEnum(Enum):
     EMULATED_OPEN_ROADM             = 'emu-optical-openroadm'
     EMULATED_OPTICAL_SPLITTER       = 'emu-optical-splitter'        # passive component required for XR Constellation
     EMULATED_P4_SWITCH              = 'emu-p4-switch'
+    EMULATED_PACKET_FIREWALL        = 'emu-packet-firewall'
     EMULATED_PACKET_RADIO_ROUTER    = 'emu-packet-radio-router'
     EMULATED_PACKET_ROUTER          = 'emu-packet-router'
     EMULATED_PACKET_SWITCH          = 'emu-packet-switch'
@@ -51,6 +52,7 @@ class DeviceTypeEnum(Enum):
     OPTICAL_ROADM                   = 'optical-roadm'
     OPTICAL_TRANSPONDER             = 'optical-transponder'
     P4_SWITCH                       = 'p4-switch'
+    PACKET_FIREWALL                 = 'packet-firewall'
     PACKET_POP                      = 'packet-pop'
     PACKET_RADIO_ROUTER             = 'packet-radio-router'
     PACKET_ROUTER                   = 'packet-router'
-- 
GitLab


From 933bcb6bdde1f2dc6ee6b4af0a91c8b9b9ad92da Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Fri, 7 Nov 2025 15:37:20 +0000
Subject: [PATCH 088/111] WebUI component:

- Fixed names of firewall icons
---
 .../{emu-firewall.png => emu-packet-firewall.png}   | Bin
 .../{firewall.png => packet-firewall.png}           | Bin
 2 files changed, 0 insertions(+), 0 deletions(-)
 rename src/webui/service/static/topology_icons/{emu-firewall.png => emu-packet-firewall.png} (100%)
 rename src/webui/service/static/topology_icons/{firewall.png => packet-firewall.png} (100%)

diff --git a/src/webui/service/static/topology_icons/emu-firewall.png b/src/webui/service/static/topology_icons/emu-packet-firewall.png
similarity index 100%
rename from src/webui/service/static/topology_icons/emu-firewall.png
rename to src/webui/service/static/topology_icons/emu-packet-firewall.png
diff --git a/src/webui/service/static/topology_icons/firewall.png b/src/webui/service/static/topology_icons/packet-firewall.png
similarity index 100%
rename from src/webui/service/static/topology_icons/firewall.png
rename to src/webui/service/static/topology_icons/packet-firewall.png
-- 
GitLab


From 4c3399f3830c95e28430129459700c9079e9893b Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Fri, 7 Nov 2025 15:37:42 +0000
Subject: [PATCH 089/111] Device component:

- Registered RESTCONF/OpenConfig Driver
---
 src/device/service/drivers/__init__.py | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/src/device/service/drivers/__init__.py b/src/device/service/drivers/__init__.py
index ba5298292..ff0419a3e 100644
--- a/src/device/service/drivers/__init__.py
+++ b/src/device/service/drivers/__init__.py
@@ -249,3 +249,24 @@ if LOAD_ALL_DEVICE_DRIVERS:
                 FilterFieldEnum.DRIVER     : DeviceDriverEnum.DEVICEDRIVER_QKD,
             }
         ]))
+
+if LOAD_ALL_DEVICE_DRIVERS:
+    # pylint: disable=wrong-import-position
+    from .restconf_openconfig.RestConfOpenConfigDriver import RestConfOpenConfigDriver
+    DRIVERS.append(
+        (RestConfOpenConfigDriver, [
+            {
+                FilterFieldEnum.DEVICE_TYPE: [
+                    DeviceTypeEnum.CLIENT,
+                    DeviceTypeEnum.DATACENTER,
+                    DeviceTypeEnum.EMULATED_CLIENT,
+                    DeviceTypeEnum.EMULATED_COMPUTER,
+                    DeviceTypeEnum.EMULATED_DATACENTER,
+                    DeviceTypeEnum.EMULATED_PACKET_FIREWALL,
+                    DeviceTypeEnum.EMULATED_VIRTUAL_MACHINE,
+                    DeviceTypeEnum.NETWORK,
+                    DeviceTypeEnum.PACKET_FIREWALL,
+                ],
+                FilterFieldEnum.DRIVER : DeviceDriverEnum.DEVICEDRIVER_RESTCONF_OPENCONFIG,
+            }
+        ]))
-- 
GitLab


From 9b4d71cb4d4860d7c2448487b89f3c7dab8a37f4 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Fri, 7 Nov 2025 15:48:58 +0000
Subject: [PATCH 090/111] Load Generator component:

- Fixed Python requirements
---
 src/load_generator/requirements.in | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/load_generator/requirements.in b/src/load_generator/requirements.in
index a2ee41d83..aa83a97e3 100644
--- a/src/load_generator/requirements.in
+++ b/src/load_generator/requirements.in
@@ -13,3 +13,4 @@
 # limitations under the License.
 
 APScheduler>=3.10.4
+pytz>=2025.2
-- 
GitLab


From c414bac83714be22bd3d8a7f0987ee5a85407ddd Mon Sep 17 00:00:00 2001
From: "Georgios P. Katsikas" 
Date: Fri, 7 Nov 2025 17:00:52 +0000
Subject: [PATCH 091/111] fix: telemetry INT collector misplacement issue

---
 src/telemetry/backend/service/HelperMethods.py               | 5 +++--
 src/telemetry/backend/service/collectors/__init__.py         | 3 +--
 .../backend/service/collectors/gnmi_oc/SubscriptionNew.py    | 4 ++--
 .../{ => service}/collectors/intcollector/INTCollector.py    | 2 +-
 .../collectors/intcollector/INTCollectorCommon.py            | 0
 .../{ => service}/collectors/intcollector/__init__.py        | 0
 6 files changed, 7 insertions(+), 7 deletions(-)
 rename src/telemetry/backend/{ => service}/collectors/intcollector/INTCollector.py (99%)
 rename src/telemetry/backend/{ => service}/collectors/intcollector/INTCollectorCommon.py (100%)
 rename src/telemetry/backend/{ => service}/collectors/intcollector/__init__.py (100%)

diff --git a/src/telemetry/backend/service/HelperMethods.py b/src/telemetry/backend/service/HelperMethods.py
index db56c9a76..332b3f10d 100644
--- a/src/telemetry/backend/service/HelperMethods.py
+++ b/src/telemetry/backend/service/HelperMethods.py
@@ -19,12 +19,13 @@ from .collector_api.DriverInstanceCache      import get_driver
 from common.proto.kpi_manager_pb2            import KpiId
 from common.tools.context_queries.Device     import get_device
 from common.tools.context_queries.EndPoint   import get_endpoint_names
+from typing import List, Tuple, Optional
 
 LOGGER = logging.getLogger(__name__)
 
 def get_subscription_parameters(
         kpi_id : str, kpi_manager_client, context_client, duration, interval
-        ) -> list[tuple] | None:
+        ) -> Optional[List[Tuple]]:
     """
     Method to get subscription parameters based on KPI ID.
     Returns a list of tuples with subscription parameters.
@@ -95,7 +96,7 @@ def get_subscription_parameters(
 
 
 def get_collector_by_kpi_id(kpi_id: str, kpi_manager_client, context_client, driver_instance_cache
-                            ) -> _Collector | None:
+                            ) -> Optional[_Collector]:
     """
     Method to get a collector instance based on KPI ID.
     Preconditions:
diff --git a/src/telemetry/backend/service/collectors/__init__.py b/src/telemetry/backend/service/collectors/__init__.py
index 1e07dc43f..b2391d623 100644
--- a/src/telemetry/backend/service/collectors/__init__.py
+++ b/src/telemetry/backend/service/collectors/__init__.py
@@ -49,7 +49,7 @@ if LOAD_ALL_DEVICE_DRIVERS:
     )
 
 if LOAD_ALL_DEVICE_DRIVERS:
-    from ...collectors.intcollector.INTCollector import INTCollector # pylint: disable=wrong-import-position
+    from .intcollector.INTCollector import INTCollector # pylint: disable=wrong-import-position
     COLLECTORS.append(
         (INTCollector, [
             {
@@ -58,4 +58,3 @@ if LOAD_ALL_DEVICE_DRIVERS:
             }
         ])
     )
-
diff --git a/src/telemetry/backend/service/collectors/gnmi_oc/SubscriptionNew.py b/src/telemetry/backend/service/collectors/gnmi_oc/SubscriptionNew.py
index e34b2e472..cbf0ebf42 100644
--- a/src/telemetry/backend/service/collectors/gnmi_oc/SubscriptionNew.py
+++ b/src/telemetry/backend/service/collectors/gnmi_oc/SubscriptionNew.py
@@ -41,7 +41,7 @@ class Subscription:
         metric_queue:          Queue,
         mode:                  str        = "stream",
         sample_interval_ns:    int        = 10_000_000_000,
-        heartbeat_interval_ns: int | None = None,  # ← NEW
+        heartbeat_interval_ns: Optional[int] = None,  # ← NEW
         encoding:              str        = "json_ietf",
         on_update:             Optional[Callable[[dict], None]] = None,
     ) -> None:
@@ -82,7 +82,7 @@ class Subscription:
         path_list: List[str],
         mode: str,
         sample_interval_ns: int,
-        heartbeat_interval_ns: int | None,
+        heartbeat_interval_ns: Optional[int],
         encoding: str,
         on_update: Optional[Callable[[dict], None]],
     ) -> None:  # pragma: no cover
diff --git a/src/telemetry/backend/collectors/intcollector/INTCollector.py b/src/telemetry/backend/service/collectors/intcollector/INTCollector.py
similarity index 99%
rename from src/telemetry/backend/collectors/intcollector/INTCollector.py
rename to src/telemetry/backend/service/collectors/intcollector/INTCollector.py
index 9d89827f4..5931f33f3 100644
--- a/src/telemetry/backend/collectors/intcollector/INTCollector.py
+++ b/src/telemetry/backend/service/collectors/intcollector/INTCollector.py
@@ -20,7 +20,7 @@ from apscheduler.schedulers.background import BackgroundScheduler
 from apscheduler.jobstores.memory import MemoryJobStore
 from apscheduler.executors.pool import ThreadPoolExecutor
 from datetime import datetime
-from telemetry.backend.collector_api._Collector import _Collector
+from telemetry.backend.service.collector_api._Collector import _Collector
 
 from scapy.all import *
 import struct
diff --git a/src/telemetry/backend/collectors/intcollector/INTCollectorCommon.py b/src/telemetry/backend/service/collectors/intcollector/INTCollectorCommon.py
similarity index 100%
rename from src/telemetry/backend/collectors/intcollector/INTCollectorCommon.py
rename to src/telemetry/backend/service/collectors/intcollector/INTCollectorCommon.py
diff --git a/src/telemetry/backend/collectors/intcollector/__init__.py b/src/telemetry/backend/service/collectors/intcollector/__init__.py
similarity index 100%
rename from src/telemetry/backend/collectors/intcollector/__init__.py
rename to src/telemetry/backend/service/collectors/intcollector/__init__.py
-- 
GitLab


From 48cb70eb7b51abf30853d0b10ccd3524ffc1e283 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Fri, 7 Nov 2025 18:45:11 +0000
Subject: [PATCH 092/111] NBI component - IETF ACL:

- Add support for REJECT action
---
 src/nbi/service/ietf_acl/ietf_acl_parser.py | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/nbi/service/ietf_acl/ietf_acl_parser.py b/src/nbi/service/ietf_acl/ietf_acl_parser.py
index 65e9129a2..7305775b8 100644
--- a/src/nbi/service/ietf_acl/ietf_acl_parser.py
+++ b/src/nbi/service/ietf_acl/ietf_acl_parser.py
@@ -118,7 +118,8 @@ IETF_TFS_RULE_TYPE_MAPPING = {
 
 IETF_TFS_FORWARDING_ACTION_MAPPING = {
     'accept': 'ACLFORWARDINGACTION_ACCEPT',
-    'drop': 'ACLFORWARDINGACTION_DROP',
+    'drop'  : 'ACLFORWARDINGACTION_DROP',
+    'reject': 'ACLFORWARDINGACTION_REJECT',
 }
 
 TFS_IETF_RULE_TYPE_MAPPING = {
@@ -128,7 +129,8 @@ TFS_IETF_RULE_TYPE_MAPPING = {
 
 TFS_IETF_FORWARDING_ACTION_MAPPING = {
     'ACLFORWARDINGACTION_ACCEPT': 'accept',
-    'ACLFORWARDINGACTION_DROP': 'drop',
+    'ACLFORWARDINGACTION_DROP'  : 'drop',
+    'ACLFORWARDINGACTION_REJECT': 'reject',
 }
 
 
-- 
GitLab


From 51fb0c5145ae6fb4b3f3edf9cb582b4e33c6a8ce Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Fri, 7 Nov 2025 18:45:53 +0000
Subject: [PATCH 093/111] Device component - RESTCONF OpenConfig Driver:

- Filter out default values to prevent injecting wrong values on ACL rules
---
 .../restconf_openconfig/handlers/AclRuleSetHandler.py  | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/device/service/drivers/restconf_openconfig/handlers/AclRuleSetHandler.py b/src/device/service/drivers/restconf_openconfig/handlers/AclRuleSetHandler.py
index 7e52980fc..9ef029c09 100644
--- a/src/device/service/drivers/restconf_openconfig/handlers/AclRuleSetHandler.py
+++ b/src/device/service/drivers/restconf_openconfig/handlers/AclRuleSetHandler.py
@@ -185,19 +185,19 @@ class AclRuleSetHandler:
             entry_match = entry.get('match', dict())
 
             ipv4_config = dict()
-            if 'protocol' in entry_match:
+            if 'protocol' in entry_match and entry_match['protocol'] > 0:
                 ipv4_config['protocol'] = _TFS_2_OC_PROTOCOL[entry_match['protocol']]
-            if 'src_address' in entry_match:
+            if 'src_address' in entry_match and len(entry_match['src_address']) > 0:
                 ipv4_config['source-address'] = entry_match['src_address']
-            if 'dst_address' in entry_match:
+            if 'dst_address' in entry_match and len(entry_match['dst_address']) > 0:
                 ipv4_config['destination-address'] = entry_match['dst_address']
             if len(ipv4_config) > 0:
                 oc_acl_entry.setdefault('ipv4', dict())['config'] = ipv4_config
 
             transport_config = dict()
-            if 'src_port' in entry_match:
+            if 'src_port' in entry_match and entry_match['src_port'] > 0:
                 transport_config['source-port'] = entry_match['src_port']
-            if 'dst_port' in entry_match:
+            if 'dst_port' in entry_match and entry_match['dst_port'] > 0:
                 transport_config['destination-port'] = entry_match['dst_port']
             if len(transport_config) > 0:
                 oc_acl_entry.setdefault('transport', dict())['config'] = transport_config
-- 
GitLab


From 3ca92b519079bf6c9694694bf08e0bfbcc0e4594 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 11 Nov 2025 16:12:08 +0000
Subject: [PATCH 094/111] Tests - Tools - Firewall Agent:

- Added missing firewall Table types
- Enhanced NFT parser to skip additional unknown rules
- Enhanced command executor to skip changes on pre-existing rules
- Added deployability as Kubernetes workload
---
 .../tools/firewall_agent/DeploymentSet.yaml   | 42 +++++++++++++++++++
 .../resources/nft_model/Chain.py              | 11 ++++-
 .../nft_model/NFTablesParserTools.py          |  3 ++
 .../resources/nft_model/Rule.py               |  8 +++-
 .../resources/nft_model/Table.py              |  6 +++
 .../resources/nft_model/TableEnum.py          |  2 +
 .../{redeploy.sh => redeploy-docker.sh}       |  0
 .../firewall_agent/redeploy-kubernetes.sh     | 26 ++++++++++++
 8 files changed, 94 insertions(+), 4 deletions(-)
 create mode 100644 src/tests/tools/firewall_agent/DeploymentSet.yaml
 rename src/tests/tools/firewall_agent/{redeploy.sh => redeploy-docker.sh} (100%)
 create mode 100755 src/tests/tools/firewall_agent/redeploy-kubernetes.sh

diff --git a/src/tests/tools/firewall_agent/DeploymentSet.yaml b/src/tests/tools/firewall_agent/DeploymentSet.yaml
new file mode 100644
index 000000000..d4271e63e
--- /dev/null
+++ b/src/tests/tools/firewall_agent/DeploymentSet.yaml
@@ -0,0 +1,42 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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: firewall-agent
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      app: firewall-agent
+  template:
+    metadata:
+      labels:
+        app: firewall-agent
+    spec:
+      hostNetwork: true               # like --network host
+      dnsPolicy: ClusterFirstWithHostNet
+      containers:
+        - name: firewall-agent
+          image: firewall-agent:dev
+          #image: localhost:32000/tfs/firewall-agent:dev
+          securityContext:
+            capabilities:
+              add: ["NET_ADMIN"]      # like --cap-add=NET_ADMIN
+            # privileged: true        # uncomment if your code needs full net admin / sysctl
+          ports:
+            - containerPort: 8888     # container listens on 8888 on the host now
+              hostPort: 8888          # optional, but makes it explicit
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py
index f9b67ad3e..3cd0ff769 100644
--- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Chain.py
@@ -117,12 +117,15 @@ class Chain:
 
     def get_commands(self, removal : bool = False) -> List[Tuple[int, str]]:
         commands : List[Tuple[int, str]] = list()
+
         if removal:
             # NOTE: For now, do not remove chains. We do not process all kinds of
             # chains and their removal might cause side effects on NFTables.
             pass
+        elif self.handle is not None:
+            # NOTE: Chain was already there, do not modify it
+            pass
         else:
-            chain_hook = str(self.chain).lower()
             parts = [
                 'add', 'chain', self.family.value, self.table.value, self.chain,
                 '{',
@@ -131,6 +134,10 @@ class Chain:
                 '}'
             ]
             commands.append((-1, ' '.join(parts)))
+
         for rule in self.rules:
-            commands.append(rule.get_command(removal=removal))
+            rule_cmd = rule.get_command(removal=removal)
+            if rule_cmd is None: continue
+            commands.append(rule_cmd)
+
         return commands
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesParserTools.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesParserTools.py
index cf9c97523..0546787d8 100644
--- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesParserTools.py
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/NFTablesParserTools.py
@@ -81,6 +81,9 @@ def parse_nft_match(rule : 'Rule', match : Dict) -> int:
                 raise UnsupportedElementException('rule.expr.match', match)
         else:
             raise UnsupportedElementException('rule.expr.match', match)
+    elif '&' in match_left:
+        # matches on masks and marks are skipped
+        pass
     else:
         raise UnsupportedElementException('rule.expr.match', match)
 
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py
index 5a839f3e1..040a03ca8 100644
--- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Rule.py
@@ -252,7 +252,7 @@ class Rule:
         if self.handle is not None: rule['handle'] = self.handle
         return [{'rule': rule}]
 
-    def get_command(self, removal : bool = False) -> Tuple[int, str]:
+    def get_command(self, removal : bool = False) -> Optional[Tuple[int, str]]:
         if removal:
             if self.handle is None: raise MissingFieldException('handle', asdict(self))
             parts = [
@@ -260,6 +260,10 @@ class Rule:
                 self.family.value, self.table.value, self.chain,
                 'handle', str(self.handle)
             ]
+            return self.sequence_id, ' '.join(parts)
+        elif self.handle is not None:
+            # NOTE: Rule was already there, do not modify it
+            return None
         else:
             # NOTE: if sequence_id < 10000: insert the rules to the top;
             # otherwise, append to the bottom. Anyways, sort rules by sequence_id.
@@ -273,4 +277,4 @@ class Rule:
             if self.dst_port is not None: parts.extend([self.ip_protocol.value, 'dport', str(self.dst_port)])
             if self.action is not None: parts.append(self.action.value)
             if self.comment is not None: parts.extend(['comment', f'"{self.comment}"'])
-        return self.sequence_id, ' '.join(parts)
+            return self.sequence_id, ' '.join(parts)
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py
index 9522772e3..85512f352 100644
--- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/Table.py
@@ -78,13 +78,19 @@ class Table:
 
     def get_commands(self, removal : bool = False) -> List[Tuple[int, str]]:
         commands : List[Tuple[int, str]] = list()
+
         if removal:
             # NOTE: For now, do not remove tables. We do not process all kinds of
             # tables and their removal might cause side effects on NFTables.
             pass
+        elif self.handle is not None:
+            # NOTE: Table was already there, do not modify it
+            pass
         else:
             parts = ['add', 'table', self.family.value, self.table.value]
             commands.append((-2, ' '.join(parts)))
+
         for chain in self.chains.values():
             commands.extend(chain.get_commands(removal=removal))
+
         return commands
diff --git a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/TableEnum.py b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/TableEnum.py
index fa8658d24..8388b2abe 100644
--- a/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/TableEnum.py
+++ b/src/tests/tools/firewall_agent/firewall_agent/resources/nft_model/TableEnum.py
@@ -17,7 +17,9 @@ import enum
 
 class TableEnum(enum.Enum):
     FILTER = 'filter'
+    MANGLE = 'mangle'
     NAT    = 'nat'
+    RAW    = 'raw'
     ROUTE  = 'route'
 
 def get_table_from_str(table : str) -> TableEnum:
diff --git a/src/tests/tools/firewall_agent/redeploy.sh b/src/tests/tools/firewall_agent/redeploy-docker.sh
similarity index 100%
rename from src/tests/tools/firewall_agent/redeploy.sh
rename to src/tests/tools/firewall_agent/redeploy-docker.sh
diff --git a/src/tests/tools/firewall_agent/redeploy-kubernetes.sh b/src/tests/tools/firewall_agent/redeploy-kubernetes.sh
new file mode 100755
index 000000000..ad42c14c4
--- /dev/null
+++ b/src/tests/tools/firewall_agent/redeploy-kubernetes.sh
@@ -0,0 +1,26 @@
+#!/usr/bin/env bash
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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.
+
+
+set -euo pipefail
+
+docker build --tag "firewall-agent:dev" .
+docker tag "firewall-agent:dev" "http://localhost:32000/tfs/firewall-agent:dev"
+docker push "http://localhost:32000/tfs/firewall-agent:dev"
+
+kubectl delete namespace firewall-agent
+kubectl create namespace firewall-agent
+kubectl apply --namespace firewall-agent --filename=DeploymentSet.yaml
+kubectl logs --namespace firewall-agent deployment/firewall-agent --follow
-- 
GitLab


From 243dfd4950f97035f82ad6a4bb206fe2189542b6 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 11 Nov 2025 16:26:38 +0000
Subject: [PATCH 095/111] Tests - Tools - Firewall Agent:

- Added Kubernetes readinessProbe and livenessProbe
---
 src/tests/tools/firewall_agent/DeploymentSet.yaml | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/src/tests/tools/firewall_agent/DeploymentSet.yaml b/src/tests/tools/firewall_agent/DeploymentSet.yaml
index d4271e63e..a8a01c28c 100644
--- a/src/tests/tools/firewall_agent/DeploymentSet.yaml
+++ b/src/tests/tools/firewall_agent/DeploymentSet.yaml
@@ -40,3 +40,15 @@ spec:
           ports:
             - containerPort: 8888     # container listens on 8888 on the host now
               hostPort: 8888          # optional, but makes it explicit
+          readinessProbe:
+            httpGet:
+              path: /restconf/data
+              port: 8888
+            initialDelaySeconds: 5
+            timeoutSeconds: 1
+          livenessProbe:
+            httpGet:
+              path: /restconf/data
+              port: 8888
+            initialDelaySeconds: 5
+            timeoutSeconds: 1
-- 
GitLab


From e8d37cd0b6226f89b3caba3eb9eb1d3eca9f75ba Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 11 Nov 2025 17:33:44 +0000
Subject: [PATCH 096/111] Restored CI/CD pipeline

---
 .gitlab-ci.yml | 100 ++++++++++++++++++++++++-------------------------
 1 file changed, 50 insertions(+), 50 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 0985a50c1..e11c8474a 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -13,53 +13,53 @@
 # limitations under the License.
 
 
-## stages of the cicd pipeline
-#stages:
-#  #- dependencies
-#  - build
-#  - unit_test
-#  - end2end_test
-#
-## 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/nbi/.gitlab-ci.yml'
-#  - local: '/src/context/.gitlab-ci.yml'
-#  - local: '/src/device/.gitlab-ci.yml'
-#  - local: '/src/service/.gitlab-ci.yml'
-#  - local: '/src/qkd_app/.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/automation/.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'
-#  #- local: '/src/l3_attackmitigator/.gitlab-ci.yml'
-#  - local: '/src/slice/.gitlab-ci.yml'
-#  #- 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/kpi_manager/.gitlab-ci.yml'
-#  - local: '/src/kpi_value_api/.gitlab-ci.yml'
-#  #- local: '/src/kpi_value_writer/.gitlab-ci.yml'
-#  #- local: '/src/telemetry/.gitlab-ci.yml'
-#  - local: '/src/analytics/.gitlab-ci.yml'
-#  - local: '/src/qos_profile/.gitlab-ci.yml'
-#  - local: '/src/vnt_manager/.gitlab-ci.yml'
-#  - local: '/src/e2e_orchestrator/.gitlab-ci.yml'
-#  - local: '/src/ztp_server/.gitlab-ci.yml'
-#  - local: '/src/osm_client/.gitlab-ci.yml'
-#  - local: '/src/simap_connector/.gitlab-ci.yml'
-#  - local: '/src/pluggables/.gitlab-ci.yml'
-#
-#  # This should be last one: end-to-end integration tests
-#  - local: '/src/tests/.gitlab-ci.yml'
+# stages of the cicd pipeline
+stages:
+  #- dependencies
+  - build
+  - unit_test
+  - end2end_test
+
+# 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/nbi/.gitlab-ci.yml'
+  - local: '/src/context/.gitlab-ci.yml'
+  - local: '/src/device/.gitlab-ci.yml'
+  - local: '/src/service/.gitlab-ci.yml'
+  - local: '/src/qkd_app/.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/automation/.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'
+  #- local: '/src/l3_attackmitigator/.gitlab-ci.yml'
+  - local: '/src/slice/.gitlab-ci.yml'
+  #- 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/kpi_manager/.gitlab-ci.yml'
+  - local: '/src/kpi_value_api/.gitlab-ci.yml'
+  #- local: '/src/kpi_value_writer/.gitlab-ci.yml'
+  #- local: '/src/telemetry/.gitlab-ci.yml'
+  - local: '/src/analytics/.gitlab-ci.yml'
+  - local: '/src/qos_profile/.gitlab-ci.yml'
+  - local: '/src/vnt_manager/.gitlab-ci.yml'
+  - local: '/src/e2e_orchestrator/.gitlab-ci.yml'
+  - local: '/src/ztp_server/.gitlab-ci.yml'
+  - local: '/src/osm_client/.gitlab-ci.yml'
+  - local: '/src/simap_connector/.gitlab-ci.yml'
+  - local: '/src/pluggables/.gitlab-ci.yml'
+
+  # This should be last one: end-to-end integration tests
+  - local: '/src/tests/.gitlab-ci.yml'
-- 
GitLab


From 7cdaeb78eec82efa8783763fcf0e1abab01d9ce0 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 11 Nov 2025 17:34:25 +0000
Subject: [PATCH 097/111] Tests - Tools - Firewall Agent:

- Fixed Dockerfile
- Fixed requirements.txt
---
 src/tests/tools/firewall_agent/Dockerfile       | 6 +++---
 src/tests/tools/firewall_agent/requirements.txt | 2 --
 2 files changed, 3 insertions(+), 5 deletions(-)

diff --git a/src/tests/tools/firewall_agent/Dockerfile b/src/tests/tools/firewall_agent/Dockerfile
index dec746c5c..3207a5fff 100644
--- a/src/tests/tools/firewall_agent/Dockerfile
+++ b/src/tests/tools/firewall_agent/Dockerfile
@@ -17,9 +17,9 @@ FROM python:3.11-slim
 
 ENV PYTHONUNBUFFERED=0
 
-RUN apt-get update -y
-RUN apt-get install -y --no-install-recommends libxtables-dev iptables gcc libc6-dev python3-nftables
-RUN apt-get clean -y && rm -rf /var/lib/apt/lists/*
+RUN apt-get --yes --quiet --quiet update && \
+    apt-get --yes --quiet --quiet install --no-install-recommends libxtables-dev iptables gcc libc6-dev python3-nftables && \
+    apt-get clean -y && rm -rf /var/lib/apt/lists/*
 
 WORKDIR /app
 COPY requirements.txt ./
diff --git a/src/tests/tools/firewall_agent/requirements.txt b/src/tests/tools/firewall_agent/requirements.txt
index af4fe3e7c..4ed5d0f4e 100644
--- a/src/tests/tools/firewall_agent/requirements.txt
+++ b/src/tests/tools/firewall_agent/requirements.txt
@@ -17,5 +17,3 @@ flask-restful>=0.3.9
 Flask>=2.0
 netifaces>=0.11
 pip-nftables==1.0.2.post1
-pytest>=7.0
-requests>=2.0
-- 
GitLab


From 59066ee916761c04f91078d8bc6060eaf07764d7 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 11 Nov 2025 19:00:43 +0000
Subject: [PATCH 098/111] Tests - Tools - Firewall Agent:

- Fixed DeploymentSet
---
 .../tools/firewall_agent/DeploymentSet.yaml   | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/src/tests/tools/firewall_agent/DeploymentSet.yaml b/src/tests/tools/firewall_agent/DeploymentSet.yaml
index a8a01c28c..f23b33f26 100644
--- a/src/tests/tools/firewall_agent/DeploymentSet.yaml
+++ b/src/tests/tools/firewall_agent/DeploymentSet.yaml
@@ -33,6 +33,7 @@ spec:
         - name: firewall-agent
           image: firewall-agent:dev
           #image: localhost:32000/tfs/firewall-agent:dev
+          imagePullPolicy: Always
           securityContext:
             capabilities:
               add: ["NET_ADMIN"]      # like --cap-add=NET_ADMIN
@@ -52,3 +53,21 @@ spec:
               port: 8888
             initialDelaySeconds: 5
             timeoutSeconds: 1
+## Service not needed as pod is directly exposed on host network
+#---
+#apiVersion: v1
+#kind: Service
+#metadata:
+#  name: firewall-agent
+#  labels:
+#    app: firewall-agent
+#spec:
+#  type: NodePort
+#  selector:
+#    app: firewall-agent
+#  ports:
+#    - name: mgmt
+#      protocol: TCP
+#      port: 8888
+#      targetPort: 8888
+#      nodePort: 30888
-- 
GitLab


From 011890de6d6852d8308c9774d504a002cbbeca55 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 11 Nov 2025 19:17:18 +0000
Subject: [PATCH 099/111] ZTP component:

- Regenerated gRPC code
---
 .../grpc/context/ContextOuterClass.java       | 13 +++++++-
 src/ztp/target/kubernetes/kubernetes.yml      | 32 +++++++++----------
 2 files changed, 28 insertions(+), 17 deletions(-)

diff --git a/src/ztp/target/generated-sources/grpc/context/ContextOuterClass.java b/src/ztp/target/generated-sources/grpc/context/ContextOuterClass.java
index 558aa9778..27cde66fb 100644
--- a/src/ztp/target/generated-sources/grpc/context/ContextOuterClass.java
+++ b/src/ztp/target/generated-sources/grpc/context/ContextOuterClass.java
@@ -231,6 +231,10 @@ public final class ContextOuterClass {
          * DEVICEDRIVER_OPENROADM = 20;
          */
         DEVICEDRIVER_OPENROADM(20),
+        /**
+         * DEVICEDRIVER_RESTCONF_OPENCONFIG = 21;
+         */
+        DEVICEDRIVER_RESTCONF_OPENCONFIG(21),
         UNRECOGNIZED(-1);
 
         /**
@@ -342,6 +346,11 @@ public final class ContextOuterClass {
          */
         public static final int DEVICEDRIVER_OPENROADM_VALUE = 20;
 
+        /**
+         * DEVICEDRIVER_RESTCONF_OPENCONFIG = 21;
+         */
+        public static final int DEVICEDRIVER_RESTCONF_OPENCONFIG_VALUE = 21;
+
         public final int getNumber() {
             if (this == UNRECOGNIZED) {
                 throw new java.lang.IllegalArgumentException("Can't get the number of an unknown enum value.");
@@ -407,6 +416,8 @@ public final class ContextOuterClass {
                     return DEVICEDRIVER_GNMI_NOKIA_SRLINUX;
                 case 20:
                     return DEVICEDRIVER_OPENROADM;
+                case 21:
+                    return DEVICEDRIVER_RESTCONF_OPENCONFIG;
                 default:
                     return null;
             }
@@ -90370,7 +90381,7 @@ public final class ContextOuterClass {
     private static com.google.protobuf.Descriptors.FileDescriptor descriptor;
 
     static {
-        java.lang.String[] descriptorData = { "\n\rcontext.proto\022\007context\032\031google/protobu" + "f/any.proto\032\tacl.proto\032\014ipowdm.proto\032\rip" + "_link.proto\032\026kpi_sample_types.proto\032\016tap" + "i_lsp.proto\"\007\n\005Empty\"\024\n\004Uuid\022\014\n\004uuid\030\001 \001" + "(\t\"\036\n\tTimestamp\022\021\n\ttimestamp\030\001 \001(\001\"Z\n\005Ev" + "ent\022%\n\ttimestamp\030\001 \001(\0132\022.context.Timesta" + "mp\022*\n\nevent_type\030\002 \001(\0162\026.context.EventTy" + "peEnum\"\265\002\n\010AnyEvent\022(\n\007context\030\001 \001(\0132\025.c" + "ontext.ContextEventH\000\022*\n\010topology\030\002 \001(\0132" + "\026.context.TopologyEventH\000\022&\n\006device\030\003 \001(" + "\0132\024.context.DeviceEventH\000\022\"\n\004link\030\004 \001(\0132" + "\022.context.LinkEventH\000\022(\n\007service\030\005 \001(\0132\025" + ".context.ServiceEventH\000\022$\n\005slice\030\006 \001(\0132\023" + ".context.SliceEventH\000\022.\n\nconnection\030\007 \001(" + "\0132\030.context.ConnectionEventH\000B\007\n\005event\"0" + "\n\tContextId\022#\n\014context_uuid\030\001 \001(\0132\r.cont" + "ext.Uuid\"\351\001\n\007Context\022&\n\ncontext_id\030\001 \001(\013" + "2\022.context.ContextId\022\014\n\004name\030\002 \001(\t\022)\n\014to" + "pology_ids\030\003 \003(\0132\023.context.TopologyId\022\'\n" + "\013service_ids\030\004 \003(\0132\022.context.ServiceId\022#" + "\n\tslice_ids\030\005 \003(\0132\020.context.SliceId\022/\n\nc" + "ontroller\030\006 \001(\0132\033.context.TeraFlowContro" + "ller\"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.context.Context\"U\n\014Con" + "textEvent\022\035\n\005event\030\001 \001(\0132\016.context.Event" + "\022&\n\ncontext_id\030\002 \001(\0132\022.context.ContextId" + "\"Z\n\nTopologyId\022&\n\ncontext_id\030\001 \001(\0132\022.con" + "text.ContextId\022$\n\rtopology_uuid\030\002 \001(\0132\r." + "context.Uuid\"\267\001\n\010Topology\022(\n\013topology_id" + "\030\001 \001(\0132\023.context.TopologyId\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.context.LinkId\022)\n\020o" + "ptical_link_ids\030\005 \003(\0132\017.context.LinkId\"\266" + "\001\n\017TopologyDetails\022(\n\013topology_id\030\001 \001(\0132" + "\023.context.TopologyId\022\014\n\004name\030\002 \001(\t\022 \n\007de" + "vices\030\003 \003(\0132\017.context.Device\022\034\n\005links\030\004 " + "\003(\0132\r.context.Link\022+\n\roptical_links\030\005 \003(" + "\0132\024.context.OpticalLink\";\n\016TopologyIdLis" + "t\022)\n\014topology_ids\030\001 \003(\0132\023.context.Topolo" + "gyId\"5\n\014TopologyList\022%\n\ntopologies\030\001 \003(\013" + "2\021.context.Topology\"X\n\rTopologyEvent\022\035\n\005" + "event\030\001 \001(\0132\016.context.Event\022(\n\013topology_" + "id\030\002 \001(\0132\023.context.TopologyId\".\n\010DeviceI" + "d\022\"\n\013device_uuid\030\001 \001(\0132\r.context.Uuid\"\372\002" + "\n\006Device\022$\n\tdevice_id\030\001 \001(\0132\021.context.De" + "viceId\022\014\n\004name\030\002 \001(\t\022\023\n\013device_type\030\003 \001(" + "\t\022,\n\rdevice_config\030\004 \001(\0132\025.context.Devic" + "eConfig\022G\n\031device_operational_status\030\005 \001" + "(\0162$.context.DeviceOperationalStatusEnum" + "\0221\n\016device_drivers\030\006 \003(\0162\031.context.Devic" + "eDriverEnum\022+\n\020device_endpoints\030\007 \003(\0132\021." + "context.EndPoint\022&\n\ncomponents\030\010 \003(\0132\022.c" + "ontext.Component\022(\n\rcontroller_id\030\t \001(\0132" + "\021.context.DeviceId\"\311\001\n\tComponent\022%\n\016comp" + "onent_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\nattributes\030\004 \003(\0132" + "\".context.Component.AttributesEntry\022\016\n\006p" + "arent\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\014DeviceConfig\022)" + "\n\014config_rules\030\001 \003(\0132\023.context.ConfigRul" + "e\"5\n\014DeviceIdList\022%\n\ndevice_ids\030\001 \003(\0132\021." + "context.DeviceId\".\n\nDeviceList\022 \n\007device" + "s\030\001 \003(\0132\017.context.Device\"\216\001\n\014DeviceFilte" + "r\022)\n\ndevice_ids\030\001 \001(\0132\025.context.DeviceId" + "List\022\031\n\021include_endpoints\030\002 \001(\010\022\034\n\024inclu" + "de_config_rules\030\003 \001(\010\022\032\n\022include_compone" + "nts\030\004 \001(\010\"\200\001\n\013DeviceEvent\022\035\n\005event\030\001 \001(\013" + "2\016.context.Event\022$\n\tdevice_id\030\002 \001(\0132\021.co" + "ntext.DeviceId\022,\n\rdevice_config\030\003 \001(\0132\025." + "context.DeviceConfig\"*\n\006LinkId\022 \n\tlink_u" + "uid\030\001 \001(\0132\r.context.Uuid\"c\n\016LinkAttribut" + "es\022\030\n\020is_bidirectional\030\001 \001(\010\022\033\n\023total_ca" + "pacity_gbps\030\002 \001(\002\022\032\n\022used_capacity_gbps\030" + "\003 \001(\002\"\275\001\n\004Link\022 \n\007link_id\030\001 \001(\0132\017.contex" + "t.LinkId\022\014\n\004name\030\002 \001(\t\022(\n\tlink_type\030\003 \001(" + "\0162\025.context.LinkTypeEnum\022.\n\021link_endpoin" + "t_ids\030\004 \003(\0132\023.context.EndPointId\022+\n\nattr" + "ibutes\030\005 \001(\0132\027.context.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.cont" + "ext.Link\"L\n\tLinkEvent\022\035\n\005event\030\001 \001(\0132\016.c" + "ontext.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.ServiceId\022\014\n\004name\030\002 \001" + "(\t\022.\n\014service_type\030\003 \001(\0162\030.context.Servi" + "ceTypeEnum\0221\n\024service_endpoint_ids\030\004 \003(\013" + "2\023.context.EndPointId\0220\n\023service_constra" + "ints\030\005 \003(\0132\023.context.Constraint\022.\n\016servi" + "ce_status\030\006 \001(\0132\026.context.ServiceStatus\022" + ".\n\016service_config\030\007 \001(\0132\026.context.Servic" + "eConfig\022%\n\ttimestamp\030\010 \001(\0132\022.context.Tim" + "estamp\"C\n\rServiceStatus\0222\n\016service_statu" + "s\030\001 \001(\0162\032.context.ServiceStatusEnum\":\n\rS" + "erviceConfig\022)\n\014config_rules\030\001 \003(\0132\023.con" + "text.ConfigRule\"8\n\rServiceIdList\022\'\n\013serv" + "ice_ids\030\001 \003(\0132\022.context.ServiceId\"1\n\013Ser" + "viceList\022\"\n\010services\030\001 \003(\0132\020.context.Ser" + "vice\"\225\001\n\rServiceFilter\022+\n\013service_ids\030\001 " + "\001(\0132\026.context.ServiceIdList\022\034\n\024include_e" + "ndpoint_ids\030\002 \001(\010\022\033\n\023include_constraints" + "\030\003 \001(\010\022\034\n\024include_config_rules\030\004 \001(\010\"U\n\014" + "ServiceEvent\022\035\n\005event\030\001 \001(\0132\016.context.Ev" + "ent\022&\n\nservice_id\030\002 \001(\0132\022.context.Servic" + "eId\"T\n\007SliceId\022&\n\ncontext_id\030\001 \001(\0132\022.con" + "text.ContextId\022!\n\nslice_uuid\030\002 \001(\0132\r.con" + "text.Uuid\"\240\003\n\005Slice\022\"\n\010slice_id\030\001 \001(\0132\020." + "context.SliceId\022\014\n\004name\030\002 \001(\t\022/\n\022slice_e" + "ndpoint_ids\030\003 \003(\0132\023.context.EndPointId\022." + "\n\021slice_constraints\030\004 \003(\0132\023.context.Cons" + "traint\022-\n\021slice_service_ids\030\005 \003(\0132\022.cont" + "ext.ServiceId\022,\n\022slice_subslice_ids\030\006 \003(" + "\0132\020.context.SliceId\022*\n\014slice_status\030\007 \001(" + "\0132\024.context.SliceStatus\022*\n\014slice_config\030" + "\010 \001(\0132\024.context.SliceConfig\022(\n\013slice_own" + "er\030\t \001(\0132\023.context.SliceOwner\022%\n\ttimesta" + "mp\030\n \001(\0132\022.context.Timestamp\"E\n\nSliceOwn" + "er\022!\n\nowner_uuid\030\001 \001(\0132\r.context.Uuid\022\024\n" + "\014owner_string\030\002 \001(\t\"=\n\013SliceStatus\022.\n\014sl" + "ice_status\030\001 \001(\0162\030.context.SliceStatusEn" + "um\"8\n\013SliceConfig\022)\n\014config_rules\030\001 \003(\0132" + "\023.context.ConfigRule\"2\n\013SliceIdList\022#\n\ts" + "lice_ids\030\001 \003(\0132\020.context.SliceId\"+\n\tSlic" + "eList\022\036\n\006slices\030\001 \003(\0132\016.context.Slice\"\312\001" + "\n\013SliceFilter\022\'\n\tslice_ids\030\001 \001(\0132\024.conte" + "xt.SliceIdList\022\034\n\024include_endpoint_ids\030\002" + " \001(\010\022\033\n\023include_constraints\030\003 \001(\010\022\033\n\023inc" + "lude_service_ids\030\004 \001(\010\022\034\n\024include_subsli" + "ce_ids\030\005 \001(\010\022\034\n\024include_config_rules\030\006 \001" + "(\010\"O\n\nSliceEvent\022\035\n\005event\030\001 \001(\0132\016.contex" + "t.Event\022\"\n\010slice_id\030\002 \001(\0132\020.context.Slic" + "eId\"6\n\014ConnectionId\022&\n\017connection_uuid\030\001" + " \001(\0132\r.context.Uuid\"2\n\025ConnectionSetting" + "s_L0\022\031\n\021lsp_symbolic_name\030\001 \001(\t\"\236\001\n\025Conn" + "ectionSettings_L2\022\027\n\017src_mac_address\030\001 \001" + "(\t\022\027\n\017dst_mac_address\030\002 \001(\t\022\022\n\nether_typ" + "e\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\025Conn" + "ectionSettings_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\025Connec" + "tionSettings_L4\022\020\n\010src_port\030\001 \001(\r\022\020\n\010dst" + "_port\030\002 \001(\r\022\021\n\ttcp_flags\030\003 \001(\r\022\013\n\003ttl\030\004 " + "\001(\r\"\304\001\n\022ConnectionSettings\022*\n\002l0\030\001 \001(\0132\036" + ".context.ConnectionSettings_L0\022*\n\002l2\030\002 \001" + "(\0132\036.context.ConnectionSettings_L2\022*\n\002l3" + "\030\003 \001(\0132\036.context.ConnectionSettings_L3\022*" + "\n\002l4\030\004 \001(\0132\036.context.ConnectionSettings_" + "L4\"\363\001\n\nConnection\022,\n\rconnection_id\030\001 \001(\013" + "2\025.context.ConnectionId\022&\n\nservice_id\030\002 " + "\001(\0132\022.context.ServiceId\0223\n\026path_hops_end" + "point_ids\030\003 \003(\0132\023.context.EndPointId\022+\n\017" + "sub_service_ids\030\004 \003(\0132\022.context.ServiceI" + "d\022-\n\010settings\030\005 \001(\0132\033.context.Connection" + "Settings\"A\n\020ConnectionIdList\022-\n\016connecti" + "on_ids\030\001 \003(\0132\025.context.ConnectionId\":\n\016C" + "onnectionList\022(\n\013connections\030\001 \003(\0132\023.con" + "text.Connection\"^\n\017ConnectionEvent\022\035\n\005ev" + "ent\030\001 \001(\0132\016.context.Event\022,\n\rconnection_" + "id\030\002 \001(\0132\025.context.ConnectionId\"\202\001\n\nEndP" + "ointId\022(\n\013topology_id\030\001 \001(\0132\023.context.To" + "pologyId\022$\n\tdevice_id\030\002 \001(\0132\021.context.De" + "viceId\022$\n\rendpoint_uuid\030\003 \001(\0132\r.context." + "Uuid\"\310\002\n\010EndPoint\022(\n\013endpoint_id\030\001 \001(\0132\023" + ".context.EndPointId\022\014\n\004name\030\002 \001(\t\022\025\n\rend" + "point_type\030\003 \001(\t\0229\n\020kpi_sample_types\030\004 \003" + "(\0162\037.kpi_sample_types.KpiSampleType\022,\n\021e" + "ndpoint_location\030\005 \001(\0132\021.context.Locatio" + "n\0229\n\014capabilities\030\006 \003(\0132#.context.EndPoi" + "nt.CapabilitiesEntry\032I\n\021CapabilitiesEntr" + "y\022\013\n\003key\030\001 \001(\t\022#\n\005value\030\002 \001(\0132\024.google.p" + "rotobuf.Any:\0028\001\"{\n\014EndPointName\022(\n\013endpo" + "int_id\030\001 \001(\0132\023.context.EndPointId\022\023\n\013dev" + "ice_name\030\002 \001(\t\022\025\n\rendpoint_name\030\003 \001(\t\022\025\n" + "\rendpoint_type\030\004 \001(\t\";\n\016EndPointIdList\022)" + "\n\014endpoint_ids\030\001 \003(\0132\023.context.EndPointI" + "d\"A\n\020EndPointNameList\022-\n\016endpoint_names\030" + "\001 \003(\0132\025.context.EndPointName\"A\n\021ConfigRu" + "le_Custom\022\024\n\014resource_key\030\001 \001(\t\022\026\n\016resou" + "rce_value\030\002 \001(\t\"\213\001\n\016ConfigRule_ACL\022(\n\013en" + "dpoint_id\030\001 \001(\0132\023.context.EndPointId\022,\n\t" + "direction\030\002 \001(\0162\031.context.AclDirectionEn" + "um\022!\n\010rule_set\030\003 \001(\0132\017.acl.AclRuleSet\"f\n" + "\021ConfigRule_IPOWDM\022(\n\013endpoint_id\030\001 \001(\0132" + "\023.context.EndPointId\022\'\n\010rule_set\030\002 \001(\0132\025" + ".ipowdm.IpowdmRuleSet\"k\n\023ConfigRule_TAPI" + "_LSP\022(\n\013endpoint_id\030\001 \001(\0132\023.context.EndP" + "ointId\022*\n\010rule_set\030\002 \003(\0132\030.tapi_lsp.Tapi" + "LspRuleSet\"h\n\022ConfigRule_IP_LINK\022(\n\013endp" + "oint_id\030\001 \001(\0132\023.context.EndPointId\022(\n\010ru" + "le_set\030\002 \001(\0132\026.ip_link.IpLinkRuleSet\"\254\002\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\000\022.\n\007ip_link\030\004 \001(\0132\033." + "context.ConfigRule_IP_LINKH\000\0220\n\010tapi_lsp" + "\030\005 \001(\0132\034.context.ConfigRule_TAPI_LSPH\000\022," + "\n\006ipowdm\030\006 \001(\0132\032.context.ConfigRule_IPOW" + "DMH\000B\r\n\013config_rule\"F\n\021Constraint_Custom" + "\022\027\n\017constraint_type\030\001 \001(\t\022\030\n\020constraint_" + "value\030\002 \001(\t\"E\n\023Constraint_Schedule\022\027\n\017st" + "art_timestamp\030\001 \001(\001\022\025\n\rduration_days\030\002 \001" + "(\002\"3\n\014GPS_Position\022\020\n\010latitude\030\001 \001(\002\022\021\n\t" + "longitude\030\002 \001(\002\"\204\001\n\010Location\022\020\n\006region\030\001" + " \001(\tH\000\022-\n\014gps_position\030\002 \001(\0132\025.context.G" + "PS_PositionH\000\022\023\n\tinterface\030\003 \001(\tH\000\022\026\n\014ci" + "rcuit_pack\030\004 \001(\tH\000B\n\n\010location\"l\n\033Constr" + "aint_EndPointLocation\022(\n\013endpoint_id\030\001 \001" + "(\0132\023.context.EndPointId\022#\n\010location\030\002 \001(" + "\0132\021.context.Location\"Y\n\033Constraint_EndPo" + "intPriority\022(\n\013endpoint_id\030\001 \001(\0132\023.conte" + "xt.EndPointId\022\020\n\010priority\030\002 \001(\r\"0\n\026Const" + "raint_SLA_Latency\022\026\n\016e2e_latency_ms\030\001 \001(" + "\002\"0\n\027Constraint_SLA_Capacity\022\025\n\rcapacity" + "_gbps\030\001 \001(\002\"c\n\033Constraint_SLA_Availabili" + "ty\022\032\n\022num_disjoint_paths\030\001 \001(\r\022\022\n\nall_ac" + "tive\030\002 \001(\010\022\024\n\014availability\030\003 \001(\002\"V\n\036Cons" + "traint_SLA_Isolation_level\0224\n\017isolation_" + "level\030\001 \003(\0162\033.context.IsolationLevelEnum" + "\"\242\001\n\025Constraint_Exclusions\022\024\n\014is_permane" + "nt\030\001 \001(\010\022%\n\ndevice_ids\030\002 \003(\0132\021.context.D" + "eviceId\022)\n\014endpoint_ids\030\003 \003(\0132\023.context." + "EndPointId\022!\n\010link_ids\030\004 \003(\0132\017.context.L" + "inkId\"5\n\014QoSProfileId\022%\n\016qos_profile_id\030" + "\001 \001(\0132\r.context.Uuid\"`\n\025Constraint_QoSPr" + "ofile\022-\n\016qos_profile_id\030\001 \001(\0132\025.context." + "QoSProfileId\022\030\n\020qos_profile_name\030\002 \001(\t\"\222" + "\005\n\nConstraint\022-\n\006action\030\001 \001(\0162\035.context." + "ConstraintActionEnum\022,\n\006custom\030\002 \001(\0132\032.c" + "ontext.Constraint_CustomH\000\0220\n\010schedule\030\003" + " \001(\0132\034.context.Constraint_ScheduleH\000\022A\n\021" + "endpoint_location\030\004 \001(\0132$.context.Constr" + "aint_EndPointLocationH\000\022A\n\021endpoint_prio" + "rity\030\005 \001(\0132$.context.Constraint_EndPoint" + "PriorityH\000\0228\n\014sla_capacity\030\006 \001(\0132 .conte" + "xt.Constraint_SLA_CapacityH\000\0226\n\013sla_late" + "ncy\030\007 \001(\0132\037.context.Constraint_SLA_Laten" + "cyH\000\022@\n\020sla_availability\030\010 \001(\0132$.context" + ".Constraint_SLA_AvailabilityH\000\022@\n\rsla_is" + "olation\030\t \001(\0132\'.context.Constraint_SLA_I" + "solation_levelH\000\0224\n\nexclusions\030\n \001(\0132\036.c" + "ontext.Constraint_ExclusionsH\000\0225\n\013qos_pr" + "ofile\030\013 \001(\0132\036.context.Constraint_QoSProf" + "ileH\000B\014\n\nconstraint\"^\n\022TeraFlowControlle" + "r\022&\n\ncontext_id\030\001 \001(\0132\022.context.ContextI" + "d\022\022\n\nip_address\030\002 \001(\t\022\014\n\004port\030\003 \001(\r\"U\n\024A" + "uthenticationResult\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_u" + "uid\030\001 \001(\t\"y\n\rOpticalConfig\0222\n\020opticalcon" + "fig_id\030\001 \001(\0132\030.context.OpticalConfigId\022\016" + "\n\006config\030\002 \001(\t\022$\n\tdevice_id\030\003 \001(\0132\021.cont" + "ext.DeviceId\"C\n\021OpticalConfigList\022.\n\016opt" + "icalconfigs\030\001 \003(\0132\026.context.OpticalConfi" + "g\"g\n\022OpticalConfigEvent\022\035\n\005event\030\001 \001(\0132\016" + ".context.Event\0222\n\020opticalconfig_id\030\002 \001(\013" + "2\030.context.OpticalConfigId\"_\n\021OpticalEnd" + "PointId\022$\n\tdevice_id\030\002 \001(\0132\021.context.Dev" + "iceId\022$\n\rendpoint_uuid\030\003 \001(\0132\r.context.U" + "uid\">\n\017OpticalLinkList\022+\n\roptical_links\030" + "\001 \003(\0132\024.context.OpticalLink\"\304\003\n\022OpticalL" + "inkDetails\022\016\n\006length\030\001 \001(\002\022\020\n\010src_port\030\002" + " \001(\t\022\020\n\010dst_port\030\003 \001(\t\022\027\n\017local_peer_por" + "t\030\004 \001(\t\022\030\n\020remote_peer_port\030\005 \001(\t\022\014\n\004use" + "d\030\006 \001(\010\0228\n\007c_slots\030\007 \003(\0132\'.context.Optic" + "alLinkDetails.CSlotsEntry\0228\n\007l_slots\030\010 \003" + "(\0132\'.context.OpticalLinkDetails.LSlotsEn" + "try\0228\n\007s_slots\030\t \003(\0132\'.context.OpticalLi" + "nkDetails.SSlotsEntry\032-\n\013CSlotsEntry\022\013\n\003" + "key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\0028\001\032-\n\013LSlotsEn" + "try\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\0028\001\032-\n\013S" + "SlotsEntry\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\002" + "8\001\"\243\001\n\013OpticalLink\022\014\n\004name\030\001 \001(\t\0224\n\017opti" + "cal_details\030\002 \001(\0132\033.context.OpticalLinkD" + "etails\022 \n\007link_id\030\003 \001(\0132\017.context.LinkId" + "\022.\n\021link_endpoint_ids\030\004 \003(\0132\023.context.En" + "dPointId\"0\n\tChannelId\022#\n\014channel_uuid\030\001 " + "\001(\0132\r.context.Uuid\"8\n\rOpticalBandId\022\'\n\020o" + "pticalband_uuid\030\001 \001(\0132\r.context.Uuid\"\247\002\n" + "\013OpticalBand\022.\n\016opticalband_id\030\001 \001(\0132\026.c" + "ontext.OpticalBandId\022,\n\rconnection_id\030\002 " + "\001(\0132\025.context.ConnectionId\022&\n\nchannel_id" + "\030\003 \001(\0132\022.context.ChannelId\022&\n\nservice_id" + "\030\004 \001(\0132\022.context.ServiceId\022#\n\007service\030\005 " + "\001(\0132\020.context.ServiceH\000\022)\n\nconnection\030\006 " + "\001(\0132\023.context.ConnectionH\000\022\021\n\007channel\030\007 " + "\001(\tH\000B\007\n\005field\"=\n\017OpticalBandList\022*\n\014opt" + "icalbands\030\001 \003(\0132\024.context.OpticalBand\"r\n" + "\021ServiceConfigRule\022&\n\nservice_id\030\001 \001(\0132\022" + ".context.ServiceId\0225\n\021configrule_custom\030" + "\002 \001(\0132\032.context.ConfigRule_Custom*j\n\rEve" + "ntTypeEnum\022\027\n\023EVENTTYPE_UNDEFINED\020\000\022\024\n\020E" + "VENTTYPE_CREATE\020\001\022\024\n\020EVENTTYPE_UPDATE\020\002\022" + "\024\n\020EVENTTYPE_REMOVE\020\003*\333\004\n\020DeviceDriverEn" + "um\022\032\n\026DEVICEDRIVER_UNDEFINED\020\000\022\033\n\027DEVICE" + "DRIVER_OPENCONFIG\020\001\022\036\n\032DEVICEDRIVER_TRAN" + "SPORT_API\020\002\022\023\n\017DEVICEDRIVER_P4\020\003\022&\n\"DEVI" + "CEDRIVER_IETF_NETWORK_TOPOLOGY\020\004\022\033\n\027DEVI" + "CEDRIVER_ONF_TR_532\020\005\022\023\n\017DEVICEDRIVER_XR" + "\020\006\022\033\n\027DEVICEDRIVER_IETF_L2VPN\020\007\022 \n\034DEVIC" + "EDRIVER_GNMI_OPENCONFIG\020\010\022\034\n\030DEVICEDRIVE" + "R_OPTICAL_TFS\020\t\022\032\n\026DEVICEDRIVER_IETF_ACT" + "N\020\n\022\023\n\017DEVICEDRIVER_OC\020\013\022\024\n\020DEVICEDRIVER" + "_QKD\020\014\022\033\n\027DEVICEDRIVER_IETF_L3VPN\020\r\022\033\n\027D" + "EVICEDRIVER_IETF_SLICE\020\016\022\024\n\020DEVICEDRIVER" + "_NCE\020\017\022\031\n\025DEVICEDRIVER_SMARTNIC\020\020\022\031\n\025DEV" + "ICEDRIVER_MORPHEUS\020\021\022\024\n\020DEVICEDRIVER_RYU" + "\020\022\022#\n\037DEVICEDRIVER_GNMI_NOKIA_SRLINUX\020\023\022" + "\032\n\026DEVICEDRIVER_OPENROADM\020\024*\217\001\n\033DeviceOp" + "erationalStatusEnum\022%\n!DEVICEOPERATIONAL" + "STATUS_UNDEFINED\020\000\022$\n DEVICEOPERATIONALS" + "TATUS_DISABLED\020\001\022#\n\037DEVICEOPERATIONALSTA" + "TUS_ENABLED\020\002*\245\001\n\014LinkTypeEnum\022\024\n\020LINKTY" + "PE_UNKNOWN\020\000\022\023\n\017LINKTYPE_COPPER\020\001\022\022\n\016LIN" + "KTYPE_FIBER\020\002\022\022\n\016LINKTYPE_RADIO\020\003\022\024\n\020LIN" + "KTYPE_VIRTUAL\020\004\022\027\n\023LINKTYPE_MANAGEMENT\020\005" + "\022\023\n\017LINKTYPE_REMOTE\020\006*\360\002\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\022\023\n\017SERV" + "ICETYPE_QKD\020\007\022\024\n\020SERVICETYPE_L1NM\020\010\022\023\n\017S" + "ERVICETYPE_INT\020\t\022\023\n\017SERVICETYPE_ACL\020\n\022\027\n" + "\023SERVICETYPE_IP_LINK\020\013\022\030\n\024SERVICETYPE_TA" + "PI_LSP\020\014\022\026\n\022SERVICETYPE_IPOWDM\020\r*\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*\\\n\020AclDirectionEnum\022\025" + "\n\021ACLDIRECTION_BOTH\020\000\022\030\n\024ACLDIRECTION_IN" + "GRESS\020\001\022\027\n\023ACLDIRECTION_EGRESS\020\002*m\n\024Cons" + "traintActionEnum\022\036\n\032CONSTRAINTACTION_UND" + "EFINED\020\000\022\030\n\024CONSTRAINTACTION_SET\020\001\022\033\n\027CO" + "NSTRAINTACTION_DELETE\020\002*\203\002\n\022IsolationLev" + "elEnum\022\020\n\014NO_ISOLATION\020\000\022\026\n\022PHYSICAL_ISO" + "LATION\020\001\022\025\n\021LOGICAL_ISOLATION\020\002\022\025\n\021PROCE" + "SS_ISOLATION\020\003\022\035\n\031PHYSICAL_MEMORY_ISOLAT" + "ION\020\004\022\036\n\032PHYSICAL_NETWORK_ISOLATION\020\005\022\036\n" + "\032VIRTUAL_RESOURCE_ISOLATION\020\006\022\037\n\033NETWORK" + "_FUNCTIONS_ISOLATION\020\007\022\025\n\021SERVICE_ISOLAT" + "ION\020\0102\274\035\n\016ContextService\022:\n\016ListContextI" + "ds\022\016.context.Empty\032\026.context.ContextIdLi" + "st\"\000\0226\n\014ListContexts\022\016.context.Empty\032\024.c" + "ontext.ContextList\"\000\0224\n\nGetContext\022\022.con" + "text.ContextId\032\020.context.Context\"\000\0224\n\nSe" + "tContext\022\020.context.Context\032\022.context.Con" + "textId\"\000\0225\n\rRemoveContext\022\022.context.Cont" + "extId\032\016.context.Empty\"\000\022=\n\020GetContextEve" + "nts\022\016.context.Empty\032\025.context.ContextEve" + "nt\"\0000\001\022@\n\017ListTopologyIds\022\022.context.Cont" + "extId\032\027.context.TopologyIdList\"\000\022=\n\016List" + "Topologies\022\022.context.ContextId\032\025.context" + ".TopologyList\"\000\0227\n\013GetTopology\022\023.context" + ".TopologyId\032\021.context.Topology\"\000\022E\n\022GetT" + "opologyDetails\022\023.context.TopologyId\032\030.co" + "ntext.TopologyDetails\"\000\0227\n\013SetTopology\022\021" + ".context.Topology\032\023.context.TopologyId\"\000" + "\0227\n\016RemoveTopology\022\023.context.TopologyId\032" + "\016.context.Empty\"\000\022?\n\021GetTopologyEvents\022\016" + ".context.Empty\032\026.context.TopologyEvent\"\000" + "0\001\0228\n\rListDeviceIds\022\016.context.Empty\032\025.co" + "ntext.DeviceIdList\"\000\0224\n\013ListDevices\022\016.co" + "ntext.Empty\032\023.context.DeviceList\"\000\0221\n\tGe" + "tDevice\022\021.context.DeviceId\032\017.context.Dev" + "ice\"\000\0221\n\tSetDevice\022\017.context.Device\032\021.co" + "ntext.DeviceId\"\000\0223\n\014RemoveDevice\022\021.conte" + "xt.DeviceId\032\016.context.Empty\"\000\022;\n\017GetDevi" + "ceEvents\022\016.context.Empty\032\024.context.Devic" + "eEvent\"\0000\001\022<\n\014SelectDevice\022\025.context.Dev" + "iceFilter\032\023.context.DeviceList\"\000\022I\n\021List" + "EndPointNames\022\027.context.EndPointIdList\032\031" + ".context.EndPointNameList\"\000\0224\n\013ListLinkI" + "ds\022\016.context.Empty\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.Li" + "nk\032\017.context.LinkId\"\000\022/\n\nRemoveLink\022\017.co" + "ntext.LinkId\032\016.context.Empty\"\000\0227\n\rGetLin" + "kEvents\022\016.context.Empty\032\022.context.LinkEv" + "ent\"\0000\001\022>\n\016ListServiceIds\022\022.context.Cont" + "extId\032\026.context.ServiceIdList\"\000\022:\n\014ListS" + "ervices\022\022.context.ContextId\032\024.context.Se" + "rviceList\"\000\0224\n\nGetService\022\022.context.Serv" + "iceId\032\020.context.Service\"\000\0224\n\nSetService\022" + "\020.context.Service\032\022.context.ServiceId\"\000\022" + "6\n\014UnsetService\022\020.context.Service\032\022.cont" + "ext.ServiceId\"\000\0225\n\rRemoveService\022\022.conte" + "xt.ServiceId\032\016.context.Empty\"\000\022=\n\020GetSer" + "viceEvents\022\016.context.Empty\032\025.context.Ser", "viceEvent\"\0000\001\022?\n\rSelectService\022\026.context" + ".ServiceFilter\032\024.context.ServiceList\"\000\022:" + "\n\014ListSliceIds\022\022.context.ContextId\032\024.con" + "text.SliceIdList\"\000\0226\n\nListSlices\022\022.conte" + "xt.ContextId\032\022.context.SliceList\"\000\022.\n\010Ge" + "tSlice\022\020.context.SliceId\032\016.context.Slice" + "\"\000\022.\n\010SetSlice\022\016.context.Slice\032\020.context" + ".SliceId\"\000\0220\n\nUnsetSlice\022\016.context.Slice" + "\032\020.context.SliceId\"\000\0221\n\013RemoveSlice\022\020.co" + "ntext.SliceId\032\016.context.Empty\"\000\0229\n\016GetSl" + "iceEvents\022\016.context.Empty\032\023.context.Slic" + "eEvent\"\0000\001\0229\n\013SelectSlice\022\024.context.Slic" + "eFilter\032\022.context.SliceList\"\000\022D\n\021ListCon" + "nectionIds\022\022.context.ServiceId\032\031.context" + ".ConnectionIdList\"\000\022@\n\017ListConnections\022\022" + ".context.ServiceId\032\027.context.ConnectionL" + "ist\"\000\022=\n\rGetConnection\022\025.context.Connect" + "ionId\032\023.context.Connection\"\000\022=\n\rSetConne" + "ction\022\023.context.Connection\032\025.context.Con" + "nectionId\"\000\022;\n\020RemoveConnection\022\025.contex" + "t.ConnectionId\032\016.context.Empty\"\000\022C\n\023GetC" + "onnectionEvents\022\016.context.Empty\032\030.contex" + "t.ConnectionEvent\"\0000\001\0225\n\014GetAllEvents\022\016." + "context.Empty\032\021.context.AnyEvent\"\0000\001\022@\n\020" + "GetOpticalConfig\022\016.context.Empty\032\032.conte" + "xt.OpticalConfigList\"\000\022F\n\020SetOpticalConf" + "ig\022\026.context.OpticalConfig\032\030.context.Opt" + "icalConfigId\"\000\022I\n\023UpdateOpticalConfig\022\026." + "context.OpticalConfig\032\030.context.OpticalC" + "onfigId\"\000\022I\n\023SelectOpticalConfig\022\030.conte" + "xt.OpticalConfigId\032\026.context.OpticalConf" + "ig\"\000\022A\n\023DeleteOpticalConfig\022\030.context.Op" + "ticalConfigId\032\016.context.Empty\"\000\022@\n\024Delet" + "eOpticalChannel\022\026.context.OpticalConfig\032" + "\016.context.Empty\"\000\0228\n\016SetOpticalLink\022\024.co" + "ntext.OpticalLink\032\016.context.Empty\"\000\0229\n\016G" + "etOpticalLink\022\017.context.LinkId\032\024.context" + ".OpticalLink\"\000\0226\n\021DeleteOpticalLink\022\017.co" + "ntext.LinkId\032\016.context.Empty\"\000\022@\n\022GetOpt" + "icalLinkList\022\016.context.Empty\032\030.context.O" + "pticalLinkList\"\000\022<\n\016GetOpticalBand\022\016.con" + "text.Empty\032\030.context.OpticalBandList\"\000\022C" + "\n\021SelectOpticalBand\022\026.context.OpticalBan" + "dId\032\024.context.OpticalBand\"\000\022G\n\027DeleteSer" + "viceConfigRule\022\032.context.ServiceConfigRu" + "le\032\016.context.Empty\"\000b\006proto3" };
+        java.lang.String[] descriptorData = { "\n\rcontext.proto\022\007context\032\031google/protobu" + "f/any.proto\032\tacl.proto\032\014ipowdm.proto\032\rip" + "_link.proto\032\026kpi_sample_types.proto\032\016tap" + "i_lsp.proto\"\007\n\005Empty\"\024\n\004Uuid\022\014\n\004uuid\030\001 \001" + "(\t\"\036\n\tTimestamp\022\021\n\ttimestamp\030\001 \001(\001\"Z\n\005Ev" + "ent\022%\n\ttimestamp\030\001 \001(\0132\022.context.Timesta" + "mp\022*\n\nevent_type\030\002 \001(\0162\026.context.EventTy" + "peEnum\"\265\002\n\010AnyEvent\022(\n\007context\030\001 \001(\0132\025.c" + "ontext.ContextEventH\000\022*\n\010topology\030\002 \001(\0132" + "\026.context.TopologyEventH\000\022&\n\006device\030\003 \001(" + "\0132\024.context.DeviceEventH\000\022\"\n\004link\030\004 \001(\0132" + "\022.context.LinkEventH\000\022(\n\007service\030\005 \001(\0132\025" + ".context.ServiceEventH\000\022$\n\005slice\030\006 \001(\0132\023" + ".context.SliceEventH\000\022.\n\nconnection\030\007 \001(" + "\0132\030.context.ConnectionEventH\000B\007\n\005event\"0" + "\n\tContextId\022#\n\014context_uuid\030\001 \001(\0132\r.cont" + "ext.Uuid\"\351\001\n\007Context\022&\n\ncontext_id\030\001 \001(\013" + "2\022.context.ContextId\022\014\n\004name\030\002 \001(\t\022)\n\014to" + "pology_ids\030\003 \003(\0132\023.context.TopologyId\022\'\n" + "\013service_ids\030\004 \003(\0132\022.context.ServiceId\022#" + "\n\tslice_ids\030\005 \003(\0132\020.context.SliceId\022/\n\nc" + "ontroller\030\006 \001(\0132\033.context.TeraFlowContro" + "ller\"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.context.Context\"U\n\014Con" + "textEvent\022\035\n\005event\030\001 \001(\0132\016.context.Event" + "\022&\n\ncontext_id\030\002 \001(\0132\022.context.ContextId" + "\"Z\n\nTopologyId\022&\n\ncontext_id\030\001 \001(\0132\022.con" + "text.ContextId\022$\n\rtopology_uuid\030\002 \001(\0132\r." + "context.Uuid\"\267\001\n\010Topology\022(\n\013topology_id" + "\030\001 \001(\0132\023.context.TopologyId\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.context.LinkId\022)\n\020o" + "ptical_link_ids\030\005 \003(\0132\017.context.LinkId\"\266" + "\001\n\017TopologyDetails\022(\n\013topology_id\030\001 \001(\0132" + "\023.context.TopologyId\022\014\n\004name\030\002 \001(\t\022 \n\007de" + "vices\030\003 \003(\0132\017.context.Device\022\034\n\005links\030\004 " + "\003(\0132\r.context.Link\022+\n\roptical_links\030\005 \003(" + "\0132\024.context.OpticalLink\";\n\016TopologyIdLis" + "t\022)\n\014topology_ids\030\001 \003(\0132\023.context.Topolo" + "gyId\"5\n\014TopologyList\022%\n\ntopologies\030\001 \003(\013" + "2\021.context.Topology\"X\n\rTopologyEvent\022\035\n\005" + "event\030\001 \001(\0132\016.context.Event\022(\n\013topology_" + "id\030\002 \001(\0132\023.context.TopologyId\".\n\010DeviceI" + "d\022\"\n\013device_uuid\030\001 \001(\0132\r.context.Uuid\"\372\002" + "\n\006Device\022$\n\tdevice_id\030\001 \001(\0132\021.context.De" + "viceId\022\014\n\004name\030\002 \001(\t\022\023\n\013device_type\030\003 \001(" + "\t\022,\n\rdevice_config\030\004 \001(\0132\025.context.Devic" + "eConfig\022G\n\031device_operational_status\030\005 \001" + "(\0162$.context.DeviceOperationalStatusEnum" + "\0221\n\016device_drivers\030\006 \003(\0162\031.context.Devic" + "eDriverEnum\022+\n\020device_endpoints\030\007 \003(\0132\021." + "context.EndPoint\022&\n\ncomponents\030\010 \003(\0132\022.c" + "ontext.Component\022(\n\rcontroller_id\030\t \001(\0132" + "\021.context.DeviceId\"\311\001\n\tComponent\022%\n\016comp" + "onent_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\nattributes\030\004 \003(\0132" + "\".context.Component.AttributesEntry\022\016\n\006p" + "arent\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\014DeviceConfig\022)" + "\n\014config_rules\030\001 \003(\0132\023.context.ConfigRul" + "e\"5\n\014DeviceIdList\022%\n\ndevice_ids\030\001 \003(\0132\021." + "context.DeviceId\".\n\nDeviceList\022 \n\007device" + "s\030\001 \003(\0132\017.context.Device\"\216\001\n\014DeviceFilte" + "r\022)\n\ndevice_ids\030\001 \001(\0132\025.context.DeviceId" + "List\022\031\n\021include_endpoints\030\002 \001(\010\022\034\n\024inclu" + "de_config_rules\030\003 \001(\010\022\032\n\022include_compone" + "nts\030\004 \001(\010\"\200\001\n\013DeviceEvent\022\035\n\005event\030\001 \001(\013" + "2\016.context.Event\022$\n\tdevice_id\030\002 \001(\0132\021.co" + "ntext.DeviceId\022,\n\rdevice_config\030\003 \001(\0132\025." + "context.DeviceConfig\"*\n\006LinkId\022 \n\tlink_u" + "uid\030\001 \001(\0132\r.context.Uuid\"c\n\016LinkAttribut" + "es\022\030\n\020is_bidirectional\030\001 \001(\010\022\033\n\023total_ca" + "pacity_gbps\030\002 \001(\002\022\032\n\022used_capacity_gbps\030" + "\003 \001(\002\"\275\001\n\004Link\022 \n\007link_id\030\001 \001(\0132\017.contex" + "t.LinkId\022\014\n\004name\030\002 \001(\t\022(\n\tlink_type\030\003 \001(" + "\0162\025.context.LinkTypeEnum\022.\n\021link_endpoin" + "t_ids\030\004 \003(\0132\023.context.EndPointId\022+\n\nattr" + "ibutes\030\005 \001(\0132\027.context.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.cont" + "ext.Link\"L\n\tLinkEvent\022\035\n\005event\030\001 \001(\0132\016.c" + "ontext.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.ServiceId\022\014\n\004name\030\002 \001" + "(\t\022.\n\014service_type\030\003 \001(\0162\030.context.Servi" + "ceTypeEnum\0221\n\024service_endpoint_ids\030\004 \003(\013" + "2\023.context.EndPointId\0220\n\023service_constra" + "ints\030\005 \003(\0132\023.context.Constraint\022.\n\016servi" + "ce_status\030\006 \001(\0132\026.context.ServiceStatus\022" + ".\n\016service_config\030\007 \001(\0132\026.context.Servic" + "eConfig\022%\n\ttimestamp\030\010 \001(\0132\022.context.Tim" + "estamp\"C\n\rServiceStatus\0222\n\016service_statu" + "s\030\001 \001(\0162\032.context.ServiceStatusEnum\":\n\rS" + "erviceConfig\022)\n\014config_rules\030\001 \003(\0132\023.con" + "text.ConfigRule\"8\n\rServiceIdList\022\'\n\013serv" + "ice_ids\030\001 \003(\0132\022.context.ServiceId\"1\n\013Ser" + "viceList\022\"\n\010services\030\001 \003(\0132\020.context.Ser" + "vice\"\225\001\n\rServiceFilter\022+\n\013service_ids\030\001 " + "\001(\0132\026.context.ServiceIdList\022\034\n\024include_e" + "ndpoint_ids\030\002 \001(\010\022\033\n\023include_constraints" + "\030\003 \001(\010\022\034\n\024include_config_rules\030\004 \001(\010\"U\n\014" + "ServiceEvent\022\035\n\005event\030\001 \001(\0132\016.context.Ev" + "ent\022&\n\nservice_id\030\002 \001(\0132\022.context.Servic" + "eId\"T\n\007SliceId\022&\n\ncontext_id\030\001 \001(\0132\022.con" + "text.ContextId\022!\n\nslice_uuid\030\002 \001(\0132\r.con" + "text.Uuid\"\240\003\n\005Slice\022\"\n\010slice_id\030\001 \001(\0132\020." + "context.SliceId\022\014\n\004name\030\002 \001(\t\022/\n\022slice_e" + "ndpoint_ids\030\003 \003(\0132\023.context.EndPointId\022." + "\n\021slice_constraints\030\004 \003(\0132\023.context.Cons" + "traint\022-\n\021slice_service_ids\030\005 \003(\0132\022.cont" + "ext.ServiceId\022,\n\022slice_subslice_ids\030\006 \003(" + "\0132\020.context.SliceId\022*\n\014slice_status\030\007 \001(" + "\0132\024.context.SliceStatus\022*\n\014slice_config\030" + "\010 \001(\0132\024.context.SliceConfig\022(\n\013slice_own" + "er\030\t \001(\0132\023.context.SliceOwner\022%\n\ttimesta" + "mp\030\n \001(\0132\022.context.Timestamp\"E\n\nSliceOwn" + "er\022!\n\nowner_uuid\030\001 \001(\0132\r.context.Uuid\022\024\n" + "\014owner_string\030\002 \001(\t\"=\n\013SliceStatus\022.\n\014sl" + "ice_status\030\001 \001(\0162\030.context.SliceStatusEn" + "um\"8\n\013SliceConfig\022)\n\014config_rules\030\001 \003(\0132" + "\023.context.ConfigRule\"2\n\013SliceIdList\022#\n\ts" + "lice_ids\030\001 \003(\0132\020.context.SliceId\"+\n\tSlic" + "eList\022\036\n\006slices\030\001 \003(\0132\016.context.Slice\"\312\001" + "\n\013SliceFilter\022\'\n\tslice_ids\030\001 \001(\0132\024.conte" + "xt.SliceIdList\022\034\n\024include_endpoint_ids\030\002" + " \001(\010\022\033\n\023include_constraints\030\003 \001(\010\022\033\n\023inc" + "lude_service_ids\030\004 \001(\010\022\034\n\024include_subsli" + "ce_ids\030\005 \001(\010\022\034\n\024include_config_rules\030\006 \001" + "(\010\"O\n\nSliceEvent\022\035\n\005event\030\001 \001(\0132\016.contex" + "t.Event\022\"\n\010slice_id\030\002 \001(\0132\020.context.Slic" + "eId\"6\n\014ConnectionId\022&\n\017connection_uuid\030\001" + " \001(\0132\r.context.Uuid\"2\n\025ConnectionSetting" + "s_L0\022\031\n\021lsp_symbolic_name\030\001 \001(\t\"\236\001\n\025Conn" + "ectionSettings_L2\022\027\n\017src_mac_address\030\001 \001" + "(\t\022\027\n\017dst_mac_address\030\002 \001(\t\022\022\n\nether_typ" + "e\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\025Conn" + "ectionSettings_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\025Connec" + "tionSettings_L4\022\020\n\010src_port\030\001 \001(\r\022\020\n\010dst" + "_port\030\002 \001(\r\022\021\n\ttcp_flags\030\003 \001(\r\022\013\n\003ttl\030\004 " + "\001(\r\"\304\001\n\022ConnectionSettings\022*\n\002l0\030\001 \001(\0132\036" + ".context.ConnectionSettings_L0\022*\n\002l2\030\002 \001" + "(\0132\036.context.ConnectionSettings_L2\022*\n\002l3" + "\030\003 \001(\0132\036.context.ConnectionSettings_L3\022*" + "\n\002l4\030\004 \001(\0132\036.context.ConnectionSettings_" + "L4\"\363\001\n\nConnection\022,\n\rconnection_id\030\001 \001(\013" + "2\025.context.ConnectionId\022&\n\nservice_id\030\002 " + "\001(\0132\022.context.ServiceId\0223\n\026path_hops_end" + "point_ids\030\003 \003(\0132\023.context.EndPointId\022+\n\017" + "sub_service_ids\030\004 \003(\0132\022.context.ServiceI" + "d\022-\n\010settings\030\005 \001(\0132\033.context.Connection" + "Settings\"A\n\020ConnectionIdList\022-\n\016connecti" + "on_ids\030\001 \003(\0132\025.context.ConnectionId\":\n\016C" + "onnectionList\022(\n\013connections\030\001 \003(\0132\023.con" + "text.Connection\"^\n\017ConnectionEvent\022\035\n\005ev" + "ent\030\001 \001(\0132\016.context.Event\022,\n\rconnection_" + "id\030\002 \001(\0132\025.context.ConnectionId\"\202\001\n\nEndP" + "ointId\022(\n\013topology_id\030\001 \001(\0132\023.context.To" + "pologyId\022$\n\tdevice_id\030\002 \001(\0132\021.context.De" + "viceId\022$\n\rendpoint_uuid\030\003 \001(\0132\r.context." + "Uuid\"\310\002\n\010EndPoint\022(\n\013endpoint_id\030\001 \001(\0132\023" + ".context.EndPointId\022\014\n\004name\030\002 \001(\t\022\025\n\rend" + "point_type\030\003 \001(\t\0229\n\020kpi_sample_types\030\004 \003" + "(\0162\037.kpi_sample_types.KpiSampleType\022,\n\021e" + "ndpoint_location\030\005 \001(\0132\021.context.Locatio" + "n\0229\n\014capabilities\030\006 \003(\0132#.context.EndPoi" + "nt.CapabilitiesEntry\032I\n\021CapabilitiesEntr" + "y\022\013\n\003key\030\001 \001(\t\022#\n\005value\030\002 \001(\0132\024.google.p" + "rotobuf.Any:\0028\001\"{\n\014EndPointName\022(\n\013endpo" + "int_id\030\001 \001(\0132\023.context.EndPointId\022\023\n\013dev" + "ice_name\030\002 \001(\t\022\025\n\rendpoint_name\030\003 \001(\t\022\025\n" + "\rendpoint_type\030\004 \001(\t\";\n\016EndPointIdList\022)" + "\n\014endpoint_ids\030\001 \003(\0132\023.context.EndPointI" + "d\"A\n\020EndPointNameList\022-\n\016endpoint_names\030" + "\001 \003(\0132\025.context.EndPointName\"A\n\021ConfigRu" + "le_Custom\022\024\n\014resource_key\030\001 \001(\t\022\026\n\016resou" + "rce_value\030\002 \001(\t\"\213\001\n\016ConfigRule_ACL\022(\n\013en" + "dpoint_id\030\001 \001(\0132\023.context.EndPointId\022,\n\t" + "direction\030\002 \001(\0162\031.context.AclDirectionEn" + "um\022!\n\010rule_set\030\003 \001(\0132\017.acl.AclRuleSet\"f\n" + "\021ConfigRule_IPOWDM\022(\n\013endpoint_id\030\001 \001(\0132" + "\023.context.EndPointId\022\'\n\010rule_set\030\002 \001(\0132\025" + ".ipowdm.IpowdmRuleSet\"k\n\023ConfigRule_TAPI" + "_LSP\022(\n\013endpoint_id\030\001 \001(\0132\023.context.EndP" + "ointId\022*\n\010rule_set\030\002 \003(\0132\030.tapi_lsp.Tapi" + "LspRuleSet\"h\n\022ConfigRule_IP_LINK\022(\n\013endp" + "oint_id\030\001 \001(\0132\023.context.EndPointId\022(\n\010ru" + "le_set\030\002 \001(\0132\026.ip_link.IpLinkRuleSet\"\254\002\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\000\022.\n\007ip_link\030\004 \001(\0132\033." + "context.ConfigRule_IP_LINKH\000\0220\n\010tapi_lsp" + "\030\005 \001(\0132\034.context.ConfigRule_TAPI_LSPH\000\022," + "\n\006ipowdm\030\006 \001(\0132\032.context.ConfigRule_IPOW" + "DMH\000B\r\n\013config_rule\"F\n\021Constraint_Custom" + "\022\027\n\017constraint_type\030\001 \001(\t\022\030\n\020constraint_" + "value\030\002 \001(\t\"E\n\023Constraint_Schedule\022\027\n\017st" + "art_timestamp\030\001 \001(\001\022\025\n\rduration_days\030\002 \001" + "(\002\"3\n\014GPS_Position\022\020\n\010latitude\030\001 \001(\002\022\021\n\t" + "longitude\030\002 \001(\002\"\204\001\n\010Location\022\020\n\006region\030\001" + " \001(\tH\000\022-\n\014gps_position\030\002 \001(\0132\025.context.G" + "PS_PositionH\000\022\023\n\tinterface\030\003 \001(\tH\000\022\026\n\014ci" + "rcuit_pack\030\004 \001(\tH\000B\n\n\010location\"l\n\033Constr" + "aint_EndPointLocation\022(\n\013endpoint_id\030\001 \001" + "(\0132\023.context.EndPointId\022#\n\010location\030\002 \001(" + "\0132\021.context.Location\"Y\n\033Constraint_EndPo" + "intPriority\022(\n\013endpoint_id\030\001 \001(\0132\023.conte" + "xt.EndPointId\022\020\n\010priority\030\002 \001(\r\"0\n\026Const" + "raint_SLA_Latency\022\026\n\016e2e_latency_ms\030\001 \001(" + "\002\"0\n\027Constraint_SLA_Capacity\022\025\n\rcapacity" + "_gbps\030\001 \001(\002\"c\n\033Constraint_SLA_Availabili" + "ty\022\032\n\022num_disjoint_paths\030\001 \001(\r\022\022\n\nall_ac" + "tive\030\002 \001(\010\022\024\n\014availability\030\003 \001(\002\"V\n\036Cons" + "traint_SLA_Isolation_level\0224\n\017isolation_" + "level\030\001 \003(\0162\033.context.IsolationLevelEnum" + "\"\242\001\n\025Constraint_Exclusions\022\024\n\014is_permane" + "nt\030\001 \001(\010\022%\n\ndevice_ids\030\002 \003(\0132\021.context.D" + "eviceId\022)\n\014endpoint_ids\030\003 \003(\0132\023.context." + "EndPointId\022!\n\010link_ids\030\004 \003(\0132\017.context.L" + "inkId\"5\n\014QoSProfileId\022%\n\016qos_profile_id\030" + "\001 \001(\0132\r.context.Uuid\"`\n\025Constraint_QoSPr" + "ofile\022-\n\016qos_profile_id\030\001 \001(\0132\025.context." + "QoSProfileId\022\030\n\020qos_profile_name\030\002 \001(\t\"\222" + "\005\n\nConstraint\022-\n\006action\030\001 \001(\0162\035.context." + "ConstraintActionEnum\022,\n\006custom\030\002 \001(\0132\032.c" + "ontext.Constraint_CustomH\000\0220\n\010schedule\030\003" + " \001(\0132\034.context.Constraint_ScheduleH\000\022A\n\021" + "endpoint_location\030\004 \001(\0132$.context.Constr" + "aint_EndPointLocationH\000\022A\n\021endpoint_prio" + "rity\030\005 \001(\0132$.context.Constraint_EndPoint" + "PriorityH\000\0228\n\014sla_capacity\030\006 \001(\0132 .conte" + "xt.Constraint_SLA_CapacityH\000\0226\n\013sla_late" + "ncy\030\007 \001(\0132\037.context.Constraint_SLA_Laten" + "cyH\000\022@\n\020sla_availability\030\010 \001(\0132$.context" + ".Constraint_SLA_AvailabilityH\000\022@\n\rsla_is" + "olation\030\t \001(\0132\'.context.Constraint_SLA_I" + "solation_levelH\000\0224\n\nexclusions\030\n \001(\0132\036.c" + "ontext.Constraint_ExclusionsH\000\0225\n\013qos_pr" + "ofile\030\013 \001(\0132\036.context.Constraint_QoSProf" + "ileH\000B\014\n\nconstraint\"^\n\022TeraFlowControlle" + "r\022&\n\ncontext_id\030\001 \001(\0132\022.context.ContextI" + "d\022\022\n\nip_address\030\002 \001(\t\022\014\n\004port\030\003 \001(\r\"U\n\024A" + "uthenticationResult\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_u" + "uid\030\001 \001(\t\"y\n\rOpticalConfig\0222\n\020opticalcon" + "fig_id\030\001 \001(\0132\030.context.OpticalConfigId\022\016" + "\n\006config\030\002 \001(\t\022$\n\tdevice_id\030\003 \001(\0132\021.cont" + "ext.DeviceId\"C\n\021OpticalConfigList\022.\n\016opt" + "icalconfigs\030\001 \003(\0132\026.context.OpticalConfi" + "g\"g\n\022OpticalConfigEvent\022\035\n\005event\030\001 \001(\0132\016" + ".context.Event\0222\n\020opticalconfig_id\030\002 \001(\013" + "2\030.context.OpticalConfigId\"_\n\021OpticalEnd" + "PointId\022$\n\tdevice_id\030\002 \001(\0132\021.context.Dev" + "iceId\022$\n\rendpoint_uuid\030\003 \001(\0132\r.context.U" + "uid\">\n\017OpticalLinkList\022+\n\roptical_links\030" + "\001 \003(\0132\024.context.OpticalLink\"\304\003\n\022OpticalL" + "inkDetails\022\016\n\006length\030\001 \001(\002\022\020\n\010src_port\030\002" + " \001(\t\022\020\n\010dst_port\030\003 \001(\t\022\027\n\017local_peer_por" + "t\030\004 \001(\t\022\030\n\020remote_peer_port\030\005 \001(\t\022\014\n\004use" + "d\030\006 \001(\010\0228\n\007c_slots\030\007 \003(\0132\'.context.Optic" + "alLinkDetails.CSlotsEntry\0228\n\007l_slots\030\010 \003" + "(\0132\'.context.OpticalLinkDetails.LSlotsEn" + "try\0228\n\007s_slots\030\t \003(\0132\'.context.OpticalLi" + "nkDetails.SSlotsEntry\032-\n\013CSlotsEntry\022\013\n\003" + "key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\0028\001\032-\n\013LSlotsEn" + "try\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\0028\001\032-\n\013S" + "SlotsEntry\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\002" + "8\001\"\243\001\n\013OpticalLink\022\014\n\004name\030\001 \001(\t\0224\n\017opti" + "cal_details\030\002 \001(\0132\033.context.OpticalLinkD" + "etails\022 \n\007link_id\030\003 \001(\0132\017.context.LinkId" + "\022.\n\021link_endpoint_ids\030\004 \003(\0132\023.context.En" + "dPointId\"0\n\tChannelId\022#\n\014channel_uuid\030\001 " + "\001(\0132\r.context.Uuid\"8\n\rOpticalBandId\022\'\n\020o" + "pticalband_uuid\030\001 \001(\0132\r.context.Uuid\"\247\002\n" + "\013OpticalBand\022.\n\016opticalband_id\030\001 \001(\0132\026.c" + "ontext.OpticalBandId\022,\n\rconnection_id\030\002 " + "\001(\0132\025.context.ConnectionId\022&\n\nchannel_id" + "\030\003 \001(\0132\022.context.ChannelId\022&\n\nservice_id" + "\030\004 \001(\0132\022.context.ServiceId\022#\n\007service\030\005 " + "\001(\0132\020.context.ServiceH\000\022)\n\nconnection\030\006 " + "\001(\0132\023.context.ConnectionH\000\022\021\n\007channel\030\007 " + "\001(\tH\000B\007\n\005field\"=\n\017OpticalBandList\022*\n\014opt" + "icalbands\030\001 \003(\0132\024.context.OpticalBand\"r\n" + "\021ServiceConfigRule\022&\n\nservice_id\030\001 \001(\0132\022" + ".context.ServiceId\0225\n\021configrule_custom\030" + "\002 \001(\0132\032.context.ConfigRule_Custom*j\n\rEve" + "ntTypeEnum\022\027\n\023EVENTTYPE_UNDEFINED\020\000\022\024\n\020E" + "VENTTYPE_CREATE\020\001\022\024\n\020EVENTTYPE_UPDATE\020\002\022" + "\024\n\020EVENTTYPE_REMOVE\020\003*\201\005\n\020DeviceDriverEn" + "um\022\032\n\026DEVICEDRIVER_UNDEFINED\020\000\022\033\n\027DEVICE" + "DRIVER_OPENCONFIG\020\001\022\036\n\032DEVICEDRIVER_TRAN" + "SPORT_API\020\002\022\023\n\017DEVICEDRIVER_P4\020\003\022&\n\"DEVI" + "CEDRIVER_IETF_NETWORK_TOPOLOGY\020\004\022\033\n\027DEVI" + "CEDRIVER_ONF_TR_532\020\005\022\023\n\017DEVICEDRIVER_XR" + "\020\006\022\033\n\027DEVICEDRIVER_IETF_L2VPN\020\007\022 \n\034DEVIC" + "EDRIVER_GNMI_OPENCONFIG\020\010\022\034\n\030DEVICEDRIVE" + "R_OPTICAL_TFS\020\t\022\032\n\026DEVICEDRIVER_IETF_ACT" + "N\020\n\022\023\n\017DEVICEDRIVER_OC\020\013\022\024\n\020DEVICEDRIVER" + "_QKD\020\014\022\033\n\027DEVICEDRIVER_IETF_L3VPN\020\r\022\033\n\027D" + "EVICEDRIVER_IETF_SLICE\020\016\022\024\n\020DEVICEDRIVER" + "_NCE\020\017\022\031\n\025DEVICEDRIVER_SMARTNIC\020\020\022\031\n\025DEV" + "ICEDRIVER_MORPHEUS\020\021\022\024\n\020DEVICEDRIVER_RYU" + "\020\022\022#\n\037DEVICEDRIVER_GNMI_NOKIA_SRLINUX\020\023\022" + "\032\n\026DEVICEDRIVER_OPENROADM\020\024\022$\n DEVICEDRI" + "VER_RESTCONF_OPENCONFIG\020\025*\217\001\n\033DeviceOper" + "ationalStatusEnum\022%\n!DEVICEOPERATIONALST" + "ATUS_UNDEFINED\020\000\022$\n DEVICEOPERATIONALSTA" + "TUS_DISABLED\020\001\022#\n\037DEVICEOPERATIONALSTATU" + "S_ENABLED\020\002*\245\001\n\014LinkTypeEnum\022\024\n\020LINKTYPE" + "_UNKNOWN\020\000\022\023\n\017LINKTYPE_COPPER\020\001\022\022\n\016LINKT" + "YPE_FIBER\020\002\022\022\n\016LINKTYPE_RADIO\020\003\022\024\n\020LINKT" + "YPE_VIRTUAL\020\004\022\027\n\023LINKTYPE_MANAGEMENT\020\005\022\023" + "\n\017LINKTYPE_REMOTE\020\006*\360\002\n\017ServiceTypeEnum\022" + "\027\n\023SERVICETYPE_UNKNOWN\020\000\022\024\n\020SERVICETYPE_" + "L3NM\020\001\022\024\n\020SERVICETYPE_L2NM\020\002\022)\n%SERVICET" + "YPE_TAPI_CONNECTIVITY_SERVICE\020\003\022\022\n\016SERVI" + "CETYPE_TE\020\004\022\023\n\017SERVICETYPE_E2E\020\005\022$\n SERV" + "ICETYPE_OPTICAL_CONNECTIVITY\020\006\022\023\n\017SERVIC" + "ETYPE_QKD\020\007\022\024\n\020SERVICETYPE_L1NM\020\010\022\023\n\017SER" + "VICETYPE_INT\020\t\022\023\n\017SERVICETYPE_ACL\020\n\022\027\n\023S" + "ERVICETYPE_IP_LINK\020\013\022\030\n\024SERVICETYPE_TAPI" + "_LSP\020\014\022\026\n\022SERVICETYPE_IPOWDM\020\r*\304\001\n\021Servi" + "ceStatusEnum\022\033\n\027SERVICESTATUS_UNDEFINED\020" + "\000\022\031\n\025SERVICESTATUS_PLANNED\020\001\022\030\n\024SERVICES" + "TATUS_ACTIVE\020\002\022\032\n\026SERVICESTATUS_UPDATING" + "\020\003\022!\n\035SERVICESTATUS_PENDING_REMOVAL\020\004\022\036\n" + "\032SERVICESTATUS_SLA_VIOLATED\020\005*\251\001\n\017SliceS" + "tatusEnum\022\031\n\025SLICESTATUS_UNDEFINED\020\000\022\027\n\023" + "SLICESTATUS_PLANNED\020\001\022\024\n\020SLICESTATUS_INI" + "T\020\002\022\026\n\022SLICESTATUS_ACTIVE\020\003\022\026\n\022SLICESTAT" + "US_DEINIT\020\004\022\034\n\030SLICESTATUS_SLA_VIOLATED\020" + "\005*]\n\020ConfigActionEnum\022\032\n\026CONFIGACTION_UN" + "DEFINED\020\000\022\024\n\020CONFIGACTION_SET\020\001\022\027\n\023CONFI" + "GACTION_DELETE\020\002*\\\n\020AclDirectionEnum\022\025\n\021" + "ACLDIRECTION_BOTH\020\000\022\030\n\024ACLDIRECTION_INGR" + "ESS\020\001\022\027\n\023ACLDIRECTION_EGRESS\020\002*m\n\024Constr" + "aintActionEnum\022\036\n\032CONSTRAINTACTION_UNDEF" + "INED\020\000\022\030\n\024CONSTRAINTACTION_SET\020\001\022\033\n\027CONS" + "TRAINTACTION_DELETE\020\002*\203\002\n\022IsolationLevel" + "Enum\022\020\n\014NO_ISOLATION\020\000\022\026\n\022PHYSICAL_ISOLA" + "TION\020\001\022\025\n\021LOGICAL_ISOLATION\020\002\022\025\n\021PROCESS" + "_ISOLATION\020\003\022\035\n\031PHYSICAL_MEMORY_ISOLATIO" + "N\020\004\022\036\n\032PHYSICAL_NETWORK_ISOLATION\020\005\022\036\n\032V" + "IRTUAL_RESOURCE_ISOLATION\020\006\022\037\n\033NETWORK_F" + "UNCTIONS_ISOLATION\020\007\022\025\n\021SERVICE_ISOLATIO" + "N\020\0102\274\035\n\016ContextService\022:\n\016ListContextIds" + "\022\016.context.Empty\032\026.context.ContextIdList" + "\"\000\0226\n\014ListContexts\022\016.context.Empty\032\024.con" + "text.ContextList\"\000\0224\n\nGetContext\022\022.conte" + "xt.ContextId\032\020.context.Context\"\000\0224\n\nSetC" + "ontext\022\020.context.Context\032\022.context.Conte" + "xtId\"\000\0225\n\rRemoveContext\022\022.context.Contex" + "tId\032\016.context.Empty\"\000\022=\n\020GetContextEvent" + "s\022\016.context.Empty\032\025.context.ContextEvent" + "\"\0000\001\022@\n\017ListTopologyIds\022\022.context.Contex" + "tId\032\027.context.TopologyIdList\"\000\022=\n\016ListTo" + "pologies\022\022.context.ContextId\032\025.context.T" + "opologyList\"\000\0227\n\013GetTopology\022\023.context.T" + "opologyId\032\021.context.Topology\"\000\022E\n\022GetTop" + "ologyDetails\022\023.context.TopologyId\032\030.cont" + "ext.TopologyDetails\"\000\0227\n\013SetTopology\022\021.c" + "ontext.Topology\032\023.context.TopologyId\"\000\0227" + "\n\016RemoveTopology\022\023.context.TopologyId\032\016." + "context.Empty\"\000\022?\n\021GetTopologyEvents\022\016.c" + "ontext.Empty\032\026.context.TopologyEvent\"\0000\001" + "\0228\n\rListDeviceIds\022\016.context.Empty\032\025.cont" + "ext.DeviceIdList\"\000\0224\n\013ListDevices\022\016.cont" + "ext.Empty\032\023.context.DeviceList\"\000\0221\n\tGetD" + "evice\022\021.context.DeviceId\032\017.context.Devic" + "e\"\000\0221\n\tSetDevice\022\017.context.Device\032\021.cont" + "ext.DeviceId\"\000\0223\n\014RemoveDevice\022\021.context" + ".DeviceId\032\016.context.Empty\"\000\022;\n\017GetDevice" + "Events\022\016.context.Empty\032\024.context.DeviceE" + "vent\"\0000\001\022<\n\014SelectDevice\022\025.context.Devic" + "eFilter\032\023.context.DeviceList\"\000\022I\n\021ListEn" + "dPointNames\022\027.context.EndPointIdList\032\031.c" + "ontext.EndPointNameList\"\000\0224\n\013ListLinkIds" + "\022\016.context.Empty\032\023.context.LinkIdList\"\000\022" + "0\n\tListLinks\022\016.context.Empty\032\021.context.L" + "inkList\"\000\022+\n\007GetLink\022\017.context.LinkId\032\r." + "context.Link\"\000\022+\n\007SetLink\022\r.context.Link" + "\032\017.context.LinkId\"\000\022/\n\nRemoveLink\022\017.cont" + "ext.LinkId\032\016.context.Empty\"\000\0227\n\rGetLinkE" + "vents\022\016.context.Empty\032\022.context.LinkEven" + "t\"\0000\001\022>\n\016ListServiceIds\022\022.context.Contex" + "tId\032\026.context.ServiceIdList\"\000\022:\n\014ListSer" + "vices\022\022.context.ContextId\032\024.context.Serv" + "iceList\"\000\0224\n\nGetService\022\022.context.Servic" + "eId\032\020.context.Service\"\000\0224\n\nSetService\022\020." + "context.Service\032\022.context.ServiceId\"\000\0226\n" + "\014UnsetService\022\020.context.Service\032\022.contex" + "t.ServiceId\"\000\0225\n\rRemoveService\022\022.context" + ".ServiceId\032\016.context.Empty\"\000\022=\n\020GetServi", "ceEvents\022\016.context.Empty\032\025.context.Servi" + "ceEvent\"\0000\001\022?\n\rSelectService\022\026.context.S" + "erviceFilter\032\024.context.ServiceList\"\000\022:\n\014" + "ListSliceIds\022\022.context.ContextId\032\024.conte" + "xt.SliceIdList\"\000\0226\n\nListSlices\022\022.context" + ".ContextId\032\022.context.SliceList\"\000\022.\n\010GetS" + "lice\022\020.context.SliceId\032\016.context.Slice\"\000" + "\022.\n\010SetSlice\022\016.context.Slice\032\020.context.S" + "liceId\"\000\0220\n\nUnsetSlice\022\016.context.Slice\032\020" + ".context.SliceId\"\000\0221\n\013RemoveSlice\022\020.cont" + "ext.SliceId\032\016.context.Empty\"\000\0229\n\016GetSlic" + "eEvents\022\016.context.Empty\032\023.context.SliceE" + "vent\"\0000\001\0229\n\013SelectSlice\022\024.context.SliceF" + "ilter\032\022.context.SliceList\"\000\022D\n\021ListConne" + "ctionIds\022\022.context.ServiceId\032\031.context.C" + "onnectionIdList\"\000\022@\n\017ListConnections\022\022.c" + "ontext.ServiceId\032\027.context.ConnectionLis" + "t\"\000\022=\n\rGetConnection\022\025.context.Connectio" + "nId\032\023.context.Connection\"\000\022=\n\rSetConnect" + "ion\022\023.context.Connection\032\025.context.Conne" + "ctionId\"\000\022;\n\020RemoveConnection\022\025.context." + "ConnectionId\032\016.context.Empty\"\000\022C\n\023GetCon" + "nectionEvents\022\016.context.Empty\032\030.context." + "ConnectionEvent\"\0000\001\0225\n\014GetAllEvents\022\016.co" + "ntext.Empty\032\021.context.AnyEvent\"\0000\001\022@\n\020Ge" + "tOpticalConfig\022\016.context.Empty\032\032.context" + ".OpticalConfigList\"\000\022F\n\020SetOpticalConfig" + "\022\026.context.OpticalConfig\032\030.context.Optic" + "alConfigId\"\000\022I\n\023UpdateOpticalConfig\022\026.co" + "ntext.OpticalConfig\032\030.context.OpticalCon" + "figId\"\000\022I\n\023SelectOpticalConfig\022\030.context" + ".OpticalConfigId\032\026.context.OpticalConfig" + "\"\000\022A\n\023DeleteOpticalConfig\022\030.context.Opti" + "calConfigId\032\016.context.Empty\"\000\022@\n\024DeleteO" + "pticalChannel\022\026.context.OpticalConfig\032\016." + "context.Empty\"\000\0228\n\016SetOpticalLink\022\024.cont" + "ext.OpticalLink\032\016.context.Empty\"\000\0229\n\016Get" + "OpticalLink\022\017.context.LinkId\032\024.context.O" + "pticalLink\"\000\0226\n\021DeleteOpticalLink\022\017.cont" + "ext.LinkId\032\016.context.Empty\"\000\022@\n\022GetOptic" + "alLinkList\022\016.context.Empty\032\030.context.Opt" + "icalLinkList\"\000\022<\n\016GetOpticalBand\022\016.conte" + "xt.Empty\032\030.context.OpticalBandList\"\000\022C\n\021" + "SelectOpticalBand\022\026.context.OpticalBandI" + "d\032\024.context.OpticalBand\"\000\022G\n\027DeleteServi" + "ceConfigRule\022\032.context.ServiceConfigRule" + "\032\016.context.Empty\"\000b\006proto3" };
         descriptor = com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] { com.google.protobuf.AnyProto.getDescriptor(), acl.Acl.getDescriptor(), ipowdm.Ipowdm.getDescriptor(), ip_link.IpLink.getDescriptor(), kpi_sample_types.KpiSampleTypes.getDescriptor(), tapi_lsp.TapiLsp.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/kubernetes/kubernetes.yml b/src/ztp/target/kubernetes/kubernetes.yml
index 23494d5c7..0e964529c 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: 0539e363a3349889ebd7d3d7b0509744e2a4d0aa
-    app.quarkus.io/build-timestamp: 2025-10-28 - 10:09:20 +0000
+    app.quarkus.io/commit-id: 59066ee916761c04f91078d8bc6060eaf07764d7
+    app.quarkus.io/build-timestamp: 2025-11-11 - 19:16:03 +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: grpc
+      port: 5050
       protocol: TCP
-      targetPort: 8443
+      targetPort: 5050
     - name: http
       port: 9192
       protocol: TCP
       targetPort: 8080
-    - name: grpc
-      port: 5050
+    - name: https
+      port: 443
       protocol: TCP
-      targetPort: 5050
+      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: 0539e363a3349889ebd7d3d7b0509744e2a4d0aa
-    app.quarkus.io/build-timestamp: 2025-10-28 - 10:09:20 +0000
+    app.quarkus.io/commit-id: 59066ee916761c04f91078d8bc6060eaf07764d7
+    app.quarkus.io/build-timestamp: 2025-11-11 - 19:16:03 +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: 0539e363a3349889ebd7d3d7b0509744e2a4d0aa
-        app.quarkus.io/build-timestamp: 2025-10-28 - 10:09:20 +0000
+        app.quarkus.io/commit-id: 59066ee916761c04f91078d8bc6060eaf07764d7
+        app.quarkus.io/build-timestamp: 2025-11-11 - 19:16:03 +0000
         prometheus.io/scrape: "true"
         prometheus.io/path: /q/metrics
         prometheus.io/port: "8080"
@@ -93,14 +93,14 @@ spec:
             timeoutSeconds: 10
           name: ztpservice
           ports:
-            - containerPort: 8443
-              name: https
+            - containerPort: 5050
+              name: grpc
               protocol: TCP
             - containerPort: 8080
               name: http
               protocol: TCP
-            - containerPort: 5050
-              name: grpc
+            - containerPort: 8443
+              name: https
               protocol: TCP
           readinessProbe:
             failureThreshold: 3
-- 
GitLab


From a12b1122d1b8859d89746c4dc49c60fec4e5dcb6 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Tue, 11 Nov 2025 19:24:42 +0000
Subject: [PATCH 100/111] Policy component:

- Regenerated gRPC code
---
 .../grpc/context/ContextOuterClass.java       | 13 +++++-
 src/policy/target/kubernetes/kubernetes.yml   | 44 +++++++++----------
 2 files changed, 34 insertions(+), 23 deletions(-)

diff --git a/src/policy/target/generated-sources/grpc/context/ContextOuterClass.java b/src/policy/target/generated-sources/grpc/context/ContextOuterClass.java
index 558aa9778..27cde66fb 100644
--- a/src/policy/target/generated-sources/grpc/context/ContextOuterClass.java
+++ b/src/policy/target/generated-sources/grpc/context/ContextOuterClass.java
@@ -231,6 +231,10 @@ public final class ContextOuterClass {
          * DEVICEDRIVER_OPENROADM = 20;
          */
         DEVICEDRIVER_OPENROADM(20),
+        /**
+         * DEVICEDRIVER_RESTCONF_OPENCONFIG = 21;
+         */
+        DEVICEDRIVER_RESTCONF_OPENCONFIG(21),
         UNRECOGNIZED(-1);
 
         /**
@@ -342,6 +346,11 @@ public final class ContextOuterClass {
          */
         public static final int DEVICEDRIVER_OPENROADM_VALUE = 20;
 
+        /**
+         * DEVICEDRIVER_RESTCONF_OPENCONFIG = 21;
+         */
+        public static final int DEVICEDRIVER_RESTCONF_OPENCONFIG_VALUE = 21;
+
         public final int getNumber() {
             if (this == UNRECOGNIZED) {
                 throw new java.lang.IllegalArgumentException("Can't get the number of an unknown enum value.");
@@ -407,6 +416,8 @@ public final class ContextOuterClass {
                     return DEVICEDRIVER_GNMI_NOKIA_SRLINUX;
                 case 20:
                     return DEVICEDRIVER_OPENROADM;
+                case 21:
+                    return DEVICEDRIVER_RESTCONF_OPENCONFIG;
                 default:
                     return null;
             }
@@ -90370,7 +90381,7 @@ public final class ContextOuterClass {
     private static com.google.protobuf.Descriptors.FileDescriptor descriptor;
 
     static {
-        java.lang.String[] descriptorData = { "\n\rcontext.proto\022\007context\032\031google/protobu" + "f/any.proto\032\tacl.proto\032\014ipowdm.proto\032\rip" + "_link.proto\032\026kpi_sample_types.proto\032\016tap" + "i_lsp.proto\"\007\n\005Empty\"\024\n\004Uuid\022\014\n\004uuid\030\001 \001" + "(\t\"\036\n\tTimestamp\022\021\n\ttimestamp\030\001 \001(\001\"Z\n\005Ev" + "ent\022%\n\ttimestamp\030\001 \001(\0132\022.context.Timesta" + "mp\022*\n\nevent_type\030\002 \001(\0162\026.context.EventTy" + "peEnum\"\265\002\n\010AnyEvent\022(\n\007context\030\001 \001(\0132\025.c" + "ontext.ContextEventH\000\022*\n\010topology\030\002 \001(\0132" + "\026.context.TopologyEventH\000\022&\n\006device\030\003 \001(" + "\0132\024.context.DeviceEventH\000\022\"\n\004link\030\004 \001(\0132" + "\022.context.LinkEventH\000\022(\n\007service\030\005 \001(\0132\025" + ".context.ServiceEventH\000\022$\n\005slice\030\006 \001(\0132\023" + ".context.SliceEventH\000\022.\n\nconnection\030\007 \001(" + "\0132\030.context.ConnectionEventH\000B\007\n\005event\"0" + "\n\tContextId\022#\n\014context_uuid\030\001 \001(\0132\r.cont" + "ext.Uuid\"\351\001\n\007Context\022&\n\ncontext_id\030\001 \001(\013" + "2\022.context.ContextId\022\014\n\004name\030\002 \001(\t\022)\n\014to" + "pology_ids\030\003 \003(\0132\023.context.TopologyId\022\'\n" + "\013service_ids\030\004 \003(\0132\022.context.ServiceId\022#" + "\n\tslice_ids\030\005 \003(\0132\020.context.SliceId\022/\n\nc" + "ontroller\030\006 \001(\0132\033.context.TeraFlowContro" + "ller\"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.context.Context\"U\n\014Con" + "textEvent\022\035\n\005event\030\001 \001(\0132\016.context.Event" + "\022&\n\ncontext_id\030\002 \001(\0132\022.context.ContextId" + "\"Z\n\nTopologyId\022&\n\ncontext_id\030\001 \001(\0132\022.con" + "text.ContextId\022$\n\rtopology_uuid\030\002 \001(\0132\r." + "context.Uuid\"\267\001\n\010Topology\022(\n\013topology_id" + "\030\001 \001(\0132\023.context.TopologyId\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.context.LinkId\022)\n\020o" + "ptical_link_ids\030\005 \003(\0132\017.context.LinkId\"\266" + "\001\n\017TopologyDetails\022(\n\013topology_id\030\001 \001(\0132" + "\023.context.TopologyId\022\014\n\004name\030\002 \001(\t\022 \n\007de" + "vices\030\003 \003(\0132\017.context.Device\022\034\n\005links\030\004 " + "\003(\0132\r.context.Link\022+\n\roptical_links\030\005 \003(" + "\0132\024.context.OpticalLink\";\n\016TopologyIdLis" + "t\022)\n\014topology_ids\030\001 \003(\0132\023.context.Topolo" + "gyId\"5\n\014TopologyList\022%\n\ntopologies\030\001 \003(\013" + "2\021.context.Topology\"X\n\rTopologyEvent\022\035\n\005" + "event\030\001 \001(\0132\016.context.Event\022(\n\013topology_" + "id\030\002 \001(\0132\023.context.TopologyId\".\n\010DeviceI" + "d\022\"\n\013device_uuid\030\001 \001(\0132\r.context.Uuid\"\372\002" + "\n\006Device\022$\n\tdevice_id\030\001 \001(\0132\021.context.De" + "viceId\022\014\n\004name\030\002 \001(\t\022\023\n\013device_type\030\003 \001(" + "\t\022,\n\rdevice_config\030\004 \001(\0132\025.context.Devic" + "eConfig\022G\n\031device_operational_status\030\005 \001" + "(\0162$.context.DeviceOperationalStatusEnum" + "\0221\n\016device_drivers\030\006 \003(\0162\031.context.Devic" + "eDriverEnum\022+\n\020device_endpoints\030\007 \003(\0132\021." + "context.EndPoint\022&\n\ncomponents\030\010 \003(\0132\022.c" + "ontext.Component\022(\n\rcontroller_id\030\t \001(\0132" + "\021.context.DeviceId\"\311\001\n\tComponent\022%\n\016comp" + "onent_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\nattributes\030\004 \003(\0132" + "\".context.Component.AttributesEntry\022\016\n\006p" + "arent\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\014DeviceConfig\022)" + "\n\014config_rules\030\001 \003(\0132\023.context.ConfigRul" + "e\"5\n\014DeviceIdList\022%\n\ndevice_ids\030\001 \003(\0132\021." + "context.DeviceId\".\n\nDeviceList\022 \n\007device" + "s\030\001 \003(\0132\017.context.Device\"\216\001\n\014DeviceFilte" + "r\022)\n\ndevice_ids\030\001 \001(\0132\025.context.DeviceId" + "List\022\031\n\021include_endpoints\030\002 \001(\010\022\034\n\024inclu" + "de_config_rules\030\003 \001(\010\022\032\n\022include_compone" + "nts\030\004 \001(\010\"\200\001\n\013DeviceEvent\022\035\n\005event\030\001 \001(\013" + "2\016.context.Event\022$\n\tdevice_id\030\002 \001(\0132\021.co" + "ntext.DeviceId\022,\n\rdevice_config\030\003 \001(\0132\025." + "context.DeviceConfig\"*\n\006LinkId\022 \n\tlink_u" + "uid\030\001 \001(\0132\r.context.Uuid\"c\n\016LinkAttribut" + "es\022\030\n\020is_bidirectional\030\001 \001(\010\022\033\n\023total_ca" + "pacity_gbps\030\002 \001(\002\022\032\n\022used_capacity_gbps\030" + "\003 \001(\002\"\275\001\n\004Link\022 \n\007link_id\030\001 \001(\0132\017.contex" + "t.LinkId\022\014\n\004name\030\002 \001(\t\022(\n\tlink_type\030\003 \001(" + "\0162\025.context.LinkTypeEnum\022.\n\021link_endpoin" + "t_ids\030\004 \003(\0132\023.context.EndPointId\022+\n\nattr" + "ibutes\030\005 \001(\0132\027.context.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.cont" + "ext.Link\"L\n\tLinkEvent\022\035\n\005event\030\001 \001(\0132\016.c" + "ontext.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.ServiceId\022\014\n\004name\030\002 \001" + "(\t\022.\n\014service_type\030\003 \001(\0162\030.context.Servi" + "ceTypeEnum\0221\n\024service_endpoint_ids\030\004 \003(\013" + "2\023.context.EndPointId\0220\n\023service_constra" + "ints\030\005 \003(\0132\023.context.Constraint\022.\n\016servi" + "ce_status\030\006 \001(\0132\026.context.ServiceStatus\022" + ".\n\016service_config\030\007 \001(\0132\026.context.Servic" + "eConfig\022%\n\ttimestamp\030\010 \001(\0132\022.context.Tim" + "estamp\"C\n\rServiceStatus\0222\n\016service_statu" + "s\030\001 \001(\0162\032.context.ServiceStatusEnum\":\n\rS" + "erviceConfig\022)\n\014config_rules\030\001 \003(\0132\023.con" + "text.ConfigRule\"8\n\rServiceIdList\022\'\n\013serv" + "ice_ids\030\001 \003(\0132\022.context.ServiceId\"1\n\013Ser" + "viceList\022\"\n\010services\030\001 \003(\0132\020.context.Ser" + "vice\"\225\001\n\rServiceFilter\022+\n\013service_ids\030\001 " + "\001(\0132\026.context.ServiceIdList\022\034\n\024include_e" + "ndpoint_ids\030\002 \001(\010\022\033\n\023include_constraints" + "\030\003 \001(\010\022\034\n\024include_config_rules\030\004 \001(\010\"U\n\014" + "ServiceEvent\022\035\n\005event\030\001 \001(\0132\016.context.Ev" + "ent\022&\n\nservice_id\030\002 \001(\0132\022.context.Servic" + "eId\"T\n\007SliceId\022&\n\ncontext_id\030\001 \001(\0132\022.con" + "text.ContextId\022!\n\nslice_uuid\030\002 \001(\0132\r.con" + "text.Uuid\"\240\003\n\005Slice\022\"\n\010slice_id\030\001 \001(\0132\020." + "context.SliceId\022\014\n\004name\030\002 \001(\t\022/\n\022slice_e" + "ndpoint_ids\030\003 \003(\0132\023.context.EndPointId\022." + "\n\021slice_constraints\030\004 \003(\0132\023.context.Cons" + "traint\022-\n\021slice_service_ids\030\005 \003(\0132\022.cont" + "ext.ServiceId\022,\n\022slice_subslice_ids\030\006 \003(" + "\0132\020.context.SliceId\022*\n\014slice_status\030\007 \001(" + "\0132\024.context.SliceStatus\022*\n\014slice_config\030" + "\010 \001(\0132\024.context.SliceConfig\022(\n\013slice_own" + "er\030\t \001(\0132\023.context.SliceOwner\022%\n\ttimesta" + "mp\030\n \001(\0132\022.context.Timestamp\"E\n\nSliceOwn" + "er\022!\n\nowner_uuid\030\001 \001(\0132\r.context.Uuid\022\024\n" + "\014owner_string\030\002 \001(\t\"=\n\013SliceStatus\022.\n\014sl" + "ice_status\030\001 \001(\0162\030.context.SliceStatusEn" + "um\"8\n\013SliceConfig\022)\n\014config_rules\030\001 \003(\0132" + "\023.context.ConfigRule\"2\n\013SliceIdList\022#\n\ts" + "lice_ids\030\001 \003(\0132\020.context.SliceId\"+\n\tSlic" + "eList\022\036\n\006slices\030\001 \003(\0132\016.context.Slice\"\312\001" + "\n\013SliceFilter\022\'\n\tslice_ids\030\001 \001(\0132\024.conte" + "xt.SliceIdList\022\034\n\024include_endpoint_ids\030\002" + " \001(\010\022\033\n\023include_constraints\030\003 \001(\010\022\033\n\023inc" + "lude_service_ids\030\004 \001(\010\022\034\n\024include_subsli" + "ce_ids\030\005 \001(\010\022\034\n\024include_config_rules\030\006 \001" + "(\010\"O\n\nSliceEvent\022\035\n\005event\030\001 \001(\0132\016.contex" + "t.Event\022\"\n\010slice_id\030\002 \001(\0132\020.context.Slic" + "eId\"6\n\014ConnectionId\022&\n\017connection_uuid\030\001" + " \001(\0132\r.context.Uuid\"2\n\025ConnectionSetting" + "s_L0\022\031\n\021lsp_symbolic_name\030\001 \001(\t\"\236\001\n\025Conn" + "ectionSettings_L2\022\027\n\017src_mac_address\030\001 \001" + "(\t\022\027\n\017dst_mac_address\030\002 \001(\t\022\022\n\nether_typ" + "e\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\025Conn" + "ectionSettings_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\025Connec" + "tionSettings_L4\022\020\n\010src_port\030\001 \001(\r\022\020\n\010dst" + "_port\030\002 \001(\r\022\021\n\ttcp_flags\030\003 \001(\r\022\013\n\003ttl\030\004 " + "\001(\r\"\304\001\n\022ConnectionSettings\022*\n\002l0\030\001 \001(\0132\036" + ".context.ConnectionSettings_L0\022*\n\002l2\030\002 \001" + "(\0132\036.context.ConnectionSettings_L2\022*\n\002l3" + "\030\003 \001(\0132\036.context.ConnectionSettings_L3\022*" + "\n\002l4\030\004 \001(\0132\036.context.ConnectionSettings_" + "L4\"\363\001\n\nConnection\022,\n\rconnection_id\030\001 \001(\013" + "2\025.context.ConnectionId\022&\n\nservice_id\030\002 " + "\001(\0132\022.context.ServiceId\0223\n\026path_hops_end" + "point_ids\030\003 \003(\0132\023.context.EndPointId\022+\n\017" + "sub_service_ids\030\004 \003(\0132\022.context.ServiceI" + "d\022-\n\010settings\030\005 \001(\0132\033.context.Connection" + "Settings\"A\n\020ConnectionIdList\022-\n\016connecti" + "on_ids\030\001 \003(\0132\025.context.ConnectionId\":\n\016C" + "onnectionList\022(\n\013connections\030\001 \003(\0132\023.con" + "text.Connection\"^\n\017ConnectionEvent\022\035\n\005ev" + "ent\030\001 \001(\0132\016.context.Event\022,\n\rconnection_" + "id\030\002 \001(\0132\025.context.ConnectionId\"\202\001\n\nEndP" + "ointId\022(\n\013topology_id\030\001 \001(\0132\023.context.To" + "pologyId\022$\n\tdevice_id\030\002 \001(\0132\021.context.De" + "viceId\022$\n\rendpoint_uuid\030\003 \001(\0132\r.context." + "Uuid\"\310\002\n\010EndPoint\022(\n\013endpoint_id\030\001 \001(\0132\023" + ".context.EndPointId\022\014\n\004name\030\002 \001(\t\022\025\n\rend" + "point_type\030\003 \001(\t\0229\n\020kpi_sample_types\030\004 \003" + "(\0162\037.kpi_sample_types.KpiSampleType\022,\n\021e" + "ndpoint_location\030\005 \001(\0132\021.context.Locatio" + "n\0229\n\014capabilities\030\006 \003(\0132#.context.EndPoi" + "nt.CapabilitiesEntry\032I\n\021CapabilitiesEntr" + "y\022\013\n\003key\030\001 \001(\t\022#\n\005value\030\002 \001(\0132\024.google.p" + "rotobuf.Any:\0028\001\"{\n\014EndPointName\022(\n\013endpo" + "int_id\030\001 \001(\0132\023.context.EndPointId\022\023\n\013dev" + "ice_name\030\002 \001(\t\022\025\n\rendpoint_name\030\003 \001(\t\022\025\n" + "\rendpoint_type\030\004 \001(\t\";\n\016EndPointIdList\022)" + "\n\014endpoint_ids\030\001 \003(\0132\023.context.EndPointI" + "d\"A\n\020EndPointNameList\022-\n\016endpoint_names\030" + "\001 \003(\0132\025.context.EndPointName\"A\n\021ConfigRu" + "le_Custom\022\024\n\014resource_key\030\001 \001(\t\022\026\n\016resou" + "rce_value\030\002 \001(\t\"\213\001\n\016ConfigRule_ACL\022(\n\013en" + "dpoint_id\030\001 \001(\0132\023.context.EndPointId\022,\n\t" + "direction\030\002 \001(\0162\031.context.AclDirectionEn" + "um\022!\n\010rule_set\030\003 \001(\0132\017.acl.AclRuleSet\"f\n" + "\021ConfigRule_IPOWDM\022(\n\013endpoint_id\030\001 \001(\0132" + "\023.context.EndPointId\022\'\n\010rule_set\030\002 \001(\0132\025" + ".ipowdm.IpowdmRuleSet\"k\n\023ConfigRule_TAPI" + "_LSP\022(\n\013endpoint_id\030\001 \001(\0132\023.context.EndP" + "ointId\022*\n\010rule_set\030\002 \003(\0132\030.tapi_lsp.Tapi" + "LspRuleSet\"h\n\022ConfigRule_IP_LINK\022(\n\013endp" + "oint_id\030\001 \001(\0132\023.context.EndPointId\022(\n\010ru" + "le_set\030\002 \001(\0132\026.ip_link.IpLinkRuleSet\"\254\002\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\000\022.\n\007ip_link\030\004 \001(\0132\033." + "context.ConfigRule_IP_LINKH\000\0220\n\010tapi_lsp" + "\030\005 \001(\0132\034.context.ConfigRule_TAPI_LSPH\000\022," + "\n\006ipowdm\030\006 \001(\0132\032.context.ConfigRule_IPOW" + "DMH\000B\r\n\013config_rule\"F\n\021Constraint_Custom" + "\022\027\n\017constraint_type\030\001 \001(\t\022\030\n\020constraint_" + "value\030\002 \001(\t\"E\n\023Constraint_Schedule\022\027\n\017st" + "art_timestamp\030\001 \001(\001\022\025\n\rduration_days\030\002 \001" + "(\002\"3\n\014GPS_Position\022\020\n\010latitude\030\001 \001(\002\022\021\n\t" + "longitude\030\002 \001(\002\"\204\001\n\010Location\022\020\n\006region\030\001" + " \001(\tH\000\022-\n\014gps_position\030\002 \001(\0132\025.context.G" + "PS_PositionH\000\022\023\n\tinterface\030\003 \001(\tH\000\022\026\n\014ci" + "rcuit_pack\030\004 \001(\tH\000B\n\n\010location\"l\n\033Constr" + "aint_EndPointLocation\022(\n\013endpoint_id\030\001 \001" + "(\0132\023.context.EndPointId\022#\n\010location\030\002 \001(" + "\0132\021.context.Location\"Y\n\033Constraint_EndPo" + "intPriority\022(\n\013endpoint_id\030\001 \001(\0132\023.conte" + "xt.EndPointId\022\020\n\010priority\030\002 \001(\r\"0\n\026Const" + "raint_SLA_Latency\022\026\n\016e2e_latency_ms\030\001 \001(" + "\002\"0\n\027Constraint_SLA_Capacity\022\025\n\rcapacity" + "_gbps\030\001 \001(\002\"c\n\033Constraint_SLA_Availabili" + "ty\022\032\n\022num_disjoint_paths\030\001 \001(\r\022\022\n\nall_ac" + "tive\030\002 \001(\010\022\024\n\014availability\030\003 \001(\002\"V\n\036Cons" + "traint_SLA_Isolation_level\0224\n\017isolation_" + "level\030\001 \003(\0162\033.context.IsolationLevelEnum" + "\"\242\001\n\025Constraint_Exclusions\022\024\n\014is_permane" + "nt\030\001 \001(\010\022%\n\ndevice_ids\030\002 \003(\0132\021.context.D" + "eviceId\022)\n\014endpoint_ids\030\003 \003(\0132\023.context." + "EndPointId\022!\n\010link_ids\030\004 \003(\0132\017.context.L" + "inkId\"5\n\014QoSProfileId\022%\n\016qos_profile_id\030" + "\001 \001(\0132\r.context.Uuid\"`\n\025Constraint_QoSPr" + "ofile\022-\n\016qos_profile_id\030\001 \001(\0132\025.context." + "QoSProfileId\022\030\n\020qos_profile_name\030\002 \001(\t\"\222" + "\005\n\nConstraint\022-\n\006action\030\001 \001(\0162\035.context." + "ConstraintActionEnum\022,\n\006custom\030\002 \001(\0132\032.c" + "ontext.Constraint_CustomH\000\0220\n\010schedule\030\003" + " \001(\0132\034.context.Constraint_ScheduleH\000\022A\n\021" + "endpoint_location\030\004 \001(\0132$.context.Constr" + "aint_EndPointLocationH\000\022A\n\021endpoint_prio" + "rity\030\005 \001(\0132$.context.Constraint_EndPoint" + "PriorityH\000\0228\n\014sla_capacity\030\006 \001(\0132 .conte" + "xt.Constraint_SLA_CapacityH\000\0226\n\013sla_late" + "ncy\030\007 \001(\0132\037.context.Constraint_SLA_Laten" + "cyH\000\022@\n\020sla_availability\030\010 \001(\0132$.context" + ".Constraint_SLA_AvailabilityH\000\022@\n\rsla_is" + "olation\030\t \001(\0132\'.context.Constraint_SLA_I" + "solation_levelH\000\0224\n\nexclusions\030\n \001(\0132\036.c" + "ontext.Constraint_ExclusionsH\000\0225\n\013qos_pr" + "ofile\030\013 \001(\0132\036.context.Constraint_QoSProf" + "ileH\000B\014\n\nconstraint\"^\n\022TeraFlowControlle" + "r\022&\n\ncontext_id\030\001 \001(\0132\022.context.ContextI" + "d\022\022\n\nip_address\030\002 \001(\t\022\014\n\004port\030\003 \001(\r\"U\n\024A" + "uthenticationResult\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_u" + "uid\030\001 \001(\t\"y\n\rOpticalConfig\0222\n\020opticalcon" + "fig_id\030\001 \001(\0132\030.context.OpticalConfigId\022\016" + "\n\006config\030\002 \001(\t\022$\n\tdevice_id\030\003 \001(\0132\021.cont" + "ext.DeviceId\"C\n\021OpticalConfigList\022.\n\016opt" + "icalconfigs\030\001 \003(\0132\026.context.OpticalConfi" + "g\"g\n\022OpticalConfigEvent\022\035\n\005event\030\001 \001(\0132\016" + ".context.Event\0222\n\020opticalconfig_id\030\002 \001(\013" + "2\030.context.OpticalConfigId\"_\n\021OpticalEnd" + "PointId\022$\n\tdevice_id\030\002 \001(\0132\021.context.Dev" + "iceId\022$\n\rendpoint_uuid\030\003 \001(\0132\r.context.U" + "uid\">\n\017OpticalLinkList\022+\n\roptical_links\030" + "\001 \003(\0132\024.context.OpticalLink\"\304\003\n\022OpticalL" + "inkDetails\022\016\n\006length\030\001 \001(\002\022\020\n\010src_port\030\002" + " \001(\t\022\020\n\010dst_port\030\003 \001(\t\022\027\n\017local_peer_por" + "t\030\004 \001(\t\022\030\n\020remote_peer_port\030\005 \001(\t\022\014\n\004use" + "d\030\006 \001(\010\0228\n\007c_slots\030\007 \003(\0132\'.context.Optic" + "alLinkDetails.CSlotsEntry\0228\n\007l_slots\030\010 \003" + "(\0132\'.context.OpticalLinkDetails.LSlotsEn" + "try\0228\n\007s_slots\030\t \003(\0132\'.context.OpticalLi" + "nkDetails.SSlotsEntry\032-\n\013CSlotsEntry\022\013\n\003" + "key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\0028\001\032-\n\013LSlotsEn" + "try\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\0028\001\032-\n\013S" + "SlotsEntry\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\002" + "8\001\"\243\001\n\013OpticalLink\022\014\n\004name\030\001 \001(\t\0224\n\017opti" + "cal_details\030\002 \001(\0132\033.context.OpticalLinkD" + "etails\022 \n\007link_id\030\003 \001(\0132\017.context.LinkId" + "\022.\n\021link_endpoint_ids\030\004 \003(\0132\023.context.En" + "dPointId\"0\n\tChannelId\022#\n\014channel_uuid\030\001 " + "\001(\0132\r.context.Uuid\"8\n\rOpticalBandId\022\'\n\020o" + "pticalband_uuid\030\001 \001(\0132\r.context.Uuid\"\247\002\n" + "\013OpticalBand\022.\n\016opticalband_id\030\001 \001(\0132\026.c" + "ontext.OpticalBandId\022,\n\rconnection_id\030\002 " + "\001(\0132\025.context.ConnectionId\022&\n\nchannel_id" + "\030\003 \001(\0132\022.context.ChannelId\022&\n\nservice_id" + "\030\004 \001(\0132\022.context.ServiceId\022#\n\007service\030\005 " + "\001(\0132\020.context.ServiceH\000\022)\n\nconnection\030\006 " + "\001(\0132\023.context.ConnectionH\000\022\021\n\007channel\030\007 " + "\001(\tH\000B\007\n\005field\"=\n\017OpticalBandList\022*\n\014opt" + "icalbands\030\001 \003(\0132\024.context.OpticalBand\"r\n" + "\021ServiceConfigRule\022&\n\nservice_id\030\001 \001(\0132\022" + ".context.ServiceId\0225\n\021configrule_custom\030" + "\002 \001(\0132\032.context.ConfigRule_Custom*j\n\rEve" + "ntTypeEnum\022\027\n\023EVENTTYPE_UNDEFINED\020\000\022\024\n\020E" + "VENTTYPE_CREATE\020\001\022\024\n\020EVENTTYPE_UPDATE\020\002\022" + "\024\n\020EVENTTYPE_REMOVE\020\003*\333\004\n\020DeviceDriverEn" + "um\022\032\n\026DEVICEDRIVER_UNDEFINED\020\000\022\033\n\027DEVICE" + "DRIVER_OPENCONFIG\020\001\022\036\n\032DEVICEDRIVER_TRAN" + "SPORT_API\020\002\022\023\n\017DEVICEDRIVER_P4\020\003\022&\n\"DEVI" + "CEDRIVER_IETF_NETWORK_TOPOLOGY\020\004\022\033\n\027DEVI" + "CEDRIVER_ONF_TR_532\020\005\022\023\n\017DEVICEDRIVER_XR" + "\020\006\022\033\n\027DEVICEDRIVER_IETF_L2VPN\020\007\022 \n\034DEVIC" + "EDRIVER_GNMI_OPENCONFIG\020\010\022\034\n\030DEVICEDRIVE" + "R_OPTICAL_TFS\020\t\022\032\n\026DEVICEDRIVER_IETF_ACT" + "N\020\n\022\023\n\017DEVICEDRIVER_OC\020\013\022\024\n\020DEVICEDRIVER" + "_QKD\020\014\022\033\n\027DEVICEDRIVER_IETF_L3VPN\020\r\022\033\n\027D" + "EVICEDRIVER_IETF_SLICE\020\016\022\024\n\020DEVICEDRIVER" + "_NCE\020\017\022\031\n\025DEVICEDRIVER_SMARTNIC\020\020\022\031\n\025DEV" + "ICEDRIVER_MORPHEUS\020\021\022\024\n\020DEVICEDRIVER_RYU" + "\020\022\022#\n\037DEVICEDRIVER_GNMI_NOKIA_SRLINUX\020\023\022" + "\032\n\026DEVICEDRIVER_OPENROADM\020\024*\217\001\n\033DeviceOp" + "erationalStatusEnum\022%\n!DEVICEOPERATIONAL" + "STATUS_UNDEFINED\020\000\022$\n DEVICEOPERATIONALS" + "TATUS_DISABLED\020\001\022#\n\037DEVICEOPERATIONALSTA" + "TUS_ENABLED\020\002*\245\001\n\014LinkTypeEnum\022\024\n\020LINKTY" + "PE_UNKNOWN\020\000\022\023\n\017LINKTYPE_COPPER\020\001\022\022\n\016LIN" + "KTYPE_FIBER\020\002\022\022\n\016LINKTYPE_RADIO\020\003\022\024\n\020LIN" + "KTYPE_VIRTUAL\020\004\022\027\n\023LINKTYPE_MANAGEMENT\020\005" + "\022\023\n\017LINKTYPE_REMOTE\020\006*\360\002\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\022\023\n\017SERV" + "ICETYPE_QKD\020\007\022\024\n\020SERVICETYPE_L1NM\020\010\022\023\n\017S" + "ERVICETYPE_INT\020\t\022\023\n\017SERVICETYPE_ACL\020\n\022\027\n" + "\023SERVICETYPE_IP_LINK\020\013\022\030\n\024SERVICETYPE_TA" + "PI_LSP\020\014\022\026\n\022SERVICETYPE_IPOWDM\020\r*\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*\\\n\020AclDirectionEnum\022\025" + "\n\021ACLDIRECTION_BOTH\020\000\022\030\n\024ACLDIRECTION_IN" + "GRESS\020\001\022\027\n\023ACLDIRECTION_EGRESS\020\002*m\n\024Cons" + "traintActionEnum\022\036\n\032CONSTRAINTACTION_UND" + "EFINED\020\000\022\030\n\024CONSTRAINTACTION_SET\020\001\022\033\n\027CO" + "NSTRAINTACTION_DELETE\020\002*\203\002\n\022IsolationLev" + "elEnum\022\020\n\014NO_ISOLATION\020\000\022\026\n\022PHYSICAL_ISO" + "LATION\020\001\022\025\n\021LOGICAL_ISOLATION\020\002\022\025\n\021PROCE" + "SS_ISOLATION\020\003\022\035\n\031PHYSICAL_MEMORY_ISOLAT" + "ION\020\004\022\036\n\032PHYSICAL_NETWORK_ISOLATION\020\005\022\036\n" + "\032VIRTUAL_RESOURCE_ISOLATION\020\006\022\037\n\033NETWORK" + "_FUNCTIONS_ISOLATION\020\007\022\025\n\021SERVICE_ISOLAT" + "ION\020\0102\274\035\n\016ContextService\022:\n\016ListContextI" + "ds\022\016.context.Empty\032\026.context.ContextIdLi" + "st\"\000\0226\n\014ListContexts\022\016.context.Empty\032\024.c" + "ontext.ContextList\"\000\0224\n\nGetContext\022\022.con" + "text.ContextId\032\020.context.Context\"\000\0224\n\nSe" + "tContext\022\020.context.Context\032\022.context.Con" + "textId\"\000\0225\n\rRemoveContext\022\022.context.Cont" + "extId\032\016.context.Empty\"\000\022=\n\020GetContextEve" + "nts\022\016.context.Empty\032\025.context.ContextEve" + "nt\"\0000\001\022@\n\017ListTopologyIds\022\022.context.Cont" + "extId\032\027.context.TopologyIdList\"\000\022=\n\016List" + "Topologies\022\022.context.ContextId\032\025.context" + ".TopologyList\"\000\0227\n\013GetTopology\022\023.context" + ".TopologyId\032\021.context.Topology\"\000\022E\n\022GetT" + "opologyDetails\022\023.context.TopologyId\032\030.co" + "ntext.TopologyDetails\"\000\0227\n\013SetTopology\022\021" + ".context.Topology\032\023.context.TopologyId\"\000" + "\0227\n\016RemoveTopology\022\023.context.TopologyId\032" + "\016.context.Empty\"\000\022?\n\021GetTopologyEvents\022\016" + ".context.Empty\032\026.context.TopologyEvent\"\000" + "0\001\0228\n\rListDeviceIds\022\016.context.Empty\032\025.co" + "ntext.DeviceIdList\"\000\0224\n\013ListDevices\022\016.co" + "ntext.Empty\032\023.context.DeviceList\"\000\0221\n\tGe" + "tDevice\022\021.context.DeviceId\032\017.context.Dev" + "ice\"\000\0221\n\tSetDevice\022\017.context.Device\032\021.co" + "ntext.DeviceId\"\000\0223\n\014RemoveDevice\022\021.conte" + "xt.DeviceId\032\016.context.Empty\"\000\022;\n\017GetDevi" + "ceEvents\022\016.context.Empty\032\024.context.Devic" + "eEvent\"\0000\001\022<\n\014SelectDevice\022\025.context.Dev" + "iceFilter\032\023.context.DeviceList\"\000\022I\n\021List" + "EndPointNames\022\027.context.EndPointIdList\032\031" + ".context.EndPointNameList\"\000\0224\n\013ListLinkI" + "ds\022\016.context.Empty\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.Li" + "nk\032\017.context.LinkId\"\000\022/\n\nRemoveLink\022\017.co" + "ntext.LinkId\032\016.context.Empty\"\000\0227\n\rGetLin" + "kEvents\022\016.context.Empty\032\022.context.LinkEv" + "ent\"\0000\001\022>\n\016ListServiceIds\022\022.context.Cont" + "extId\032\026.context.ServiceIdList\"\000\022:\n\014ListS" + "ervices\022\022.context.ContextId\032\024.context.Se" + "rviceList\"\000\0224\n\nGetService\022\022.context.Serv" + "iceId\032\020.context.Service\"\000\0224\n\nSetService\022" + "\020.context.Service\032\022.context.ServiceId\"\000\022" + "6\n\014UnsetService\022\020.context.Service\032\022.cont" + "ext.ServiceId\"\000\0225\n\rRemoveService\022\022.conte" + "xt.ServiceId\032\016.context.Empty\"\000\022=\n\020GetSer" + "viceEvents\022\016.context.Empty\032\025.context.Ser", "viceEvent\"\0000\001\022?\n\rSelectService\022\026.context" + ".ServiceFilter\032\024.context.ServiceList\"\000\022:" + "\n\014ListSliceIds\022\022.context.ContextId\032\024.con" + "text.SliceIdList\"\000\0226\n\nListSlices\022\022.conte" + "xt.ContextId\032\022.context.SliceList\"\000\022.\n\010Ge" + "tSlice\022\020.context.SliceId\032\016.context.Slice" + "\"\000\022.\n\010SetSlice\022\016.context.Slice\032\020.context" + ".SliceId\"\000\0220\n\nUnsetSlice\022\016.context.Slice" + "\032\020.context.SliceId\"\000\0221\n\013RemoveSlice\022\020.co" + "ntext.SliceId\032\016.context.Empty\"\000\0229\n\016GetSl" + "iceEvents\022\016.context.Empty\032\023.context.Slic" + "eEvent\"\0000\001\0229\n\013SelectSlice\022\024.context.Slic" + "eFilter\032\022.context.SliceList\"\000\022D\n\021ListCon" + "nectionIds\022\022.context.ServiceId\032\031.context" + ".ConnectionIdList\"\000\022@\n\017ListConnections\022\022" + ".context.ServiceId\032\027.context.ConnectionL" + "ist\"\000\022=\n\rGetConnection\022\025.context.Connect" + "ionId\032\023.context.Connection\"\000\022=\n\rSetConne" + "ction\022\023.context.Connection\032\025.context.Con" + "nectionId\"\000\022;\n\020RemoveConnection\022\025.contex" + "t.ConnectionId\032\016.context.Empty\"\000\022C\n\023GetC" + "onnectionEvents\022\016.context.Empty\032\030.contex" + "t.ConnectionEvent\"\0000\001\0225\n\014GetAllEvents\022\016." + "context.Empty\032\021.context.AnyEvent\"\0000\001\022@\n\020" + "GetOpticalConfig\022\016.context.Empty\032\032.conte" + "xt.OpticalConfigList\"\000\022F\n\020SetOpticalConf" + "ig\022\026.context.OpticalConfig\032\030.context.Opt" + "icalConfigId\"\000\022I\n\023UpdateOpticalConfig\022\026." + "context.OpticalConfig\032\030.context.OpticalC" + "onfigId\"\000\022I\n\023SelectOpticalConfig\022\030.conte" + "xt.OpticalConfigId\032\026.context.OpticalConf" + "ig\"\000\022A\n\023DeleteOpticalConfig\022\030.context.Op" + "ticalConfigId\032\016.context.Empty\"\000\022@\n\024Delet" + "eOpticalChannel\022\026.context.OpticalConfig\032" + "\016.context.Empty\"\000\0228\n\016SetOpticalLink\022\024.co" + "ntext.OpticalLink\032\016.context.Empty\"\000\0229\n\016G" + "etOpticalLink\022\017.context.LinkId\032\024.context" + ".OpticalLink\"\000\0226\n\021DeleteOpticalLink\022\017.co" + "ntext.LinkId\032\016.context.Empty\"\000\022@\n\022GetOpt" + "icalLinkList\022\016.context.Empty\032\030.context.O" + "pticalLinkList\"\000\022<\n\016GetOpticalBand\022\016.con" + "text.Empty\032\030.context.OpticalBandList\"\000\022C" + "\n\021SelectOpticalBand\022\026.context.OpticalBan" + "dId\032\024.context.OpticalBand\"\000\022G\n\027DeleteSer" + "viceConfigRule\022\032.context.ServiceConfigRu" + "le\032\016.context.Empty\"\000b\006proto3" };
+        java.lang.String[] descriptorData = { "\n\rcontext.proto\022\007context\032\031google/protobu" + "f/any.proto\032\tacl.proto\032\014ipowdm.proto\032\rip" + "_link.proto\032\026kpi_sample_types.proto\032\016tap" + "i_lsp.proto\"\007\n\005Empty\"\024\n\004Uuid\022\014\n\004uuid\030\001 \001" + "(\t\"\036\n\tTimestamp\022\021\n\ttimestamp\030\001 \001(\001\"Z\n\005Ev" + "ent\022%\n\ttimestamp\030\001 \001(\0132\022.context.Timesta" + "mp\022*\n\nevent_type\030\002 \001(\0162\026.context.EventTy" + "peEnum\"\265\002\n\010AnyEvent\022(\n\007context\030\001 \001(\0132\025.c" + "ontext.ContextEventH\000\022*\n\010topology\030\002 \001(\0132" + "\026.context.TopologyEventH\000\022&\n\006device\030\003 \001(" + "\0132\024.context.DeviceEventH\000\022\"\n\004link\030\004 \001(\0132" + "\022.context.LinkEventH\000\022(\n\007service\030\005 \001(\0132\025" + ".context.ServiceEventH\000\022$\n\005slice\030\006 \001(\0132\023" + ".context.SliceEventH\000\022.\n\nconnection\030\007 \001(" + "\0132\030.context.ConnectionEventH\000B\007\n\005event\"0" + "\n\tContextId\022#\n\014context_uuid\030\001 \001(\0132\r.cont" + "ext.Uuid\"\351\001\n\007Context\022&\n\ncontext_id\030\001 \001(\013" + "2\022.context.ContextId\022\014\n\004name\030\002 \001(\t\022)\n\014to" + "pology_ids\030\003 \003(\0132\023.context.TopologyId\022\'\n" + "\013service_ids\030\004 \003(\0132\022.context.ServiceId\022#" + "\n\tslice_ids\030\005 \003(\0132\020.context.SliceId\022/\n\nc" + "ontroller\030\006 \001(\0132\033.context.TeraFlowContro" + "ller\"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.context.Context\"U\n\014Con" + "textEvent\022\035\n\005event\030\001 \001(\0132\016.context.Event" + "\022&\n\ncontext_id\030\002 \001(\0132\022.context.ContextId" + "\"Z\n\nTopologyId\022&\n\ncontext_id\030\001 \001(\0132\022.con" + "text.ContextId\022$\n\rtopology_uuid\030\002 \001(\0132\r." + "context.Uuid\"\267\001\n\010Topology\022(\n\013topology_id" + "\030\001 \001(\0132\023.context.TopologyId\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.context.LinkId\022)\n\020o" + "ptical_link_ids\030\005 \003(\0132\017.context.LinkId\"\266" + "\001\n\017TopologyDetails\022(\n\013topology_id\030\001 \001(\0132" + "\023.context.TopologyId\022\014\n\004name\030\002 \001(\t\022 \n\007de" + "vices\030\003 \003(\0132\017.context.Device\022\034\n\005links\030\004 " + "\003(\0132\r.context.Link\022+\n\roptical_links\030\005 \003(" + "\0132\024.context.OpticalLink\";\n\016TopologyIdLis" + "t\022)\n\014topology_ids\030\001 \003(\0132\023.context.Topolo" + "gyId\"5\n\014TopologyList\022%\n\ntopologies\030\001 \003(\013" + "2\021.context.Topology\"X\n\rTopologyEvent\022\035\n\005" + "event\030\001 \001(\0132\016.context.Event\022(\n\013topology_" + "id\030\002 \001(\0132\023.context.TopologyId\".\n\010DeviceI" + "d\022\"\n\013device_uuid\030\001 \001(\0132\r.context.Uuid\"\372\002" + "\n\006Device\022$\n\tdevice_id\030\001 \001(\0132\021.context.De" + "viceId\022\014\n\004name\030\002 \001(\t\022\023\n\013device_type\030\003 \001(" + "\t\022,\n\rdevice_config\030\004 \001(\0132\025.context.Devic" + "eConfig\022G\n\031device_operational_status\030\005 \001" + "(\0162$.context.DeviceOperationalStatusEnum" + "\0221\n\016device_drivers\030\006 \003(\0162\031.context.Devic" + "eDriverEnum\022+\n\020device_endpoints\030\007 \003(\0132\021." + "context.EndPoint\022&\n\ncomponents\030\010 \003(\0132\022.c" + "ontext.Component\022(\n\rcontroller_id\030\t \001(\0132" + "\021.context.DeviceId\"\311\001\n\tComponent\022%\n\016comp" + "onent_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\nattributes\030\004 \003(\0132" + "\".context.Component.AttributesEntry\022\016\n\006p" + "arent\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\014DeviceConfig\022)" + "\n\014config_rules\030\001 \003(\0132\023.context.ConfigRul" + "e\"5\n\014DeviceIdList\022%\n\ndevice_ids\030\001 \003(\0132\021." + "context.DeviceId\".\n\nDeviceList\022 \n\007device" + "s\030\001 \003(\0132\017.context.Device\"\216\001\n\014DeviceFilte" + "r\022)\n\ndevice_ids\030\001 \001(\0132\025.context.DeviceId" + "List\022\031\n\021include_endpoints\030\002 \001(\010\022\034\n\024inclu" + "de_config_rules\030\003 \001(\010\022\032\n\022include_compone" + "nts\030\004 \001(\010\"\200\001\n\013DeviceEvent\022\035\n\005event\030\001 \001(\013" + "2\016.context.Event\022$\n\tdevice_id\030\002 \001(\0132\021.co" + "ntext.DeviceId\022,\n\rdevice_config\030\003 \001(\0132\025." + "context.DeviceConfig\"*\n\006LinkId\022 \n\tlink_u" + "uid\030\001 \001(\0132\r.context.Uuid\"c\n\016LinkAttribut" + "es\022\030\n\020is_bidirectional\030\001 \001(\010\022\033\n\023total_ca" + "pacity_gbps\030\002 \001(\002\022\032\n\022used_capacity_gbps\030" + "\003 \001(\002\"\275\001\n\004Link\022 \n\007link_id\030\001 \001(\0132\017.contex" + "t.LinkId\022\014\n\004name\030\002 \001(\t\022(\n\tlink_type\030\003 \001(" + "\0162\025.context.LinkTypeEnum\022.\n\021link_endpoin" + "t_ids\030\004 \003(\0132\023.context.EndPointId\022+\n\nattr" + "ibutes\030\005 \001(\0132\027.context.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.cont" + "ext.Link\"L\n\tLinkEvent\022\035\n\005event\030\001 \001(\0132\016.c" + "ontext.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.ServiceId\022\014\n\004name\030\002 \001" + "(\t\022.\n\014service_type\030\003 \001(\0162\030.context.Servi" + "ceTypeEnum\0221\n\024service_endpoint_ids\030\004 \003(\013" + "2\023.context.EndPointId\0220\n\023service_constra" + "ints\030\005 \003(\0132\023.context.Constraint\022.\n\016servi" + "ce_status\030\006 \001(\0132\026.context.ServiceStatus\022" + ".\n\016service_config\030\007 \001(\0132\026.context.Servic" + "eConfig\022%\n\ttimestamp\030\010 \001(\0132\022.context.Tim" + "estamp\"C\n\rServiceStatus\0222\n\016service_statu" + "s\030\001 \001(\0162\032.context.ServiceStatusEnum\":\n\rS" + "erviceConfig\022)\n\014config_rules\030\001 \003(\0132\023.con" + "text.ConfigRule\"8\n\rServiceIdList\022\'\n\013serv" + "ice_ids\030\001 \003(\0132\022.context.ServiceId\"1\n\013Ser" + "viceList\022\"\n\010services\030\001 \003(\0132\020.context.Ser" + "vice\"\225\001\n\rServiceFilter\022+\n\013service_ids\030\001 " + "\001(\0132\026.context.ServiceIdList\022\034\n\024include_e" + "ndpoint_ids\030\002 \001(\010\022\033\n\023include_constraints" + "\030\003 \001(\010\022\034\n\024include_config_rules\030\004 \001(\010\"U\n\014" + "ServiceEvent\022\035\n\005event\030\001 \001(\0132\016.context.Ev" + "ent\022&\n\nservice_id\030\002 \001(\0132\022.context.Servic" + "eId\"T\n\007SliceId\022&\n\ncontext_id\030\001 \001(\0132\022.con" + "text.ContextId\022!\n\nslice_uuid\030\002 \001(\0132\r.con" + "text.Uuid\"\240\003\n\005Slice\022\"\n\010slice_id\030\001 \001(\0132\020." + "context.SliceId\022\014\n\004name\030\002 \001(\t\022/\n\022slice_e" + "ndpoint_ids\030\003 \003(\0132\023.context.EndPointId\022." + "\n\021slice_constraints\030\004 \003(\0132\023.context.Cons" + "traint\022-\n\021slice_service_ids\030\005 \003(\0132\022.cont" + "ext.ServiceId\022,\n\022slice_subslice_ids\030\006 \003(" + "\0132\020.context.SliceId\022*\n\014slice_status\030\007 \001(" + "\0132\024.context.SliceStatus\022*\n\014slice_config\030" + "\010 \001(\0132\024.context.SliceConfig\022(\n\013slice_own" + "er\030\t \001(\0132\023.context.SliceOwner\022%\n\ttimesta" + "mp\030\n \001(\0132\022.context.Timestamp\"E\n\nSliceOwn" + "er\022!\n\nowner_uuid\030\001 \001(\0132\r.context.Uuid\022\024\n" + "\014owner_string\030\002 \001(\t\"=\n\013SliceStatus\022.\n\014sl" + "ice_status\030\001 \001(\0162\030.context.SliceStatusEn" + "um\"8\n\013SliceConfig\022)\n\014config_rules\030\001 \003(\0132" + "\023.context.ConfigRule\"2\n\013SliceIdList\022#\n\ts" + "lice_ids\030\001 \003(\0132\020.context.SliceId\"+\n\tSlic" + "eList\022\036\n\006slices\030\001 \003(\0132\016.context.Slice\"\312\001" + "\n\013SliceFilter\022\'\n\tslice_ids\030\001 \001(\0132\024.conte" + "xt.SliceIdList\022\034\n\024include_endpoint_ids\030\002" + " \001(\010\022\033\n\023include_constraints\030\003 \001(\010\022\033\n\023inc" + "lude_service_ids\030\004 \001(\010\022\034\n\024include_subsli" + "ce_ids\030\005 \001(\010\022\034\n\024include_config_rules\030\006 \001" + "(\010\"O\n\nSliceEvent\022\035\n\005event\030\001 \001(\0132\016.contex" + "t.Event\022\"\n\010slice_id\030\002 \001(\0132\020.context.Slic" + "eId\"6\n\014ConnectionId\022&\n\017connection_uuid\030\001" + " \001(\0132\r.context.Uuid\"2\n\025ConnectionSetting" + "s_L0\022\031\n\021lsp_symbolic_name\030\001 \001(\t\"\236\001\n\025Conn" + "ectionSettings_L2\022\027\n\017src_mac_address\030\001 \001" + "(\t\022\027\n\017dst_mac_address\030\002 \001(\t\022\022\n\nether_typ" + "e\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\025Conn" + "ectionSettings_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\025Connec" + "tionSettings_L4\022\020\n\010src_port\030\001 \001(\r\022\020\n\010dst" + "_port\030\002 \001(\r\022\021\n\ttcp_flags\030\003 \001(\r\022\013\n\003ttl\030\004 " + "\001(\r\"\304\001\n\022ConnectionSettings\022*\n\002l0\030\001 \001(\0132\036" + ".context.ConnectionSettings_L0\022*\n\002l2\030\002 \001" + "(\0132\036.context.ConnectionSettings_L2\022*\n\002l3" + "\030\003 \001(\0132\036.context.ConnectionSettings_L3\022*" + "\n\002l4\030\004 \001(\0132\036.context.ConnectionSettings_" + "L4\"\363\001\n\nConnection\022,\n\rconnection_id\030\001 \001(\013" + "2\025.context.ConnectionId\022&\n\nservice_id\030\002 " + "\001(\0132\022.context.ServiceId\0223\n\026path_hops_end" + "point_ids\030\003 \003(\0132\023.context.EndPointId\022+\n\017" + "sub_service_ids\030\004 \003(\0132\022.context.ServiceI" + "d\022-\n\010settings\030\005 \001(\0132\033.context.Connection" + "Settings\"A\n\020ConnectionIdList\022-\n\016connecti" + "on_ids\030\001 \003(\0132\025.context.ConnectionId\":\n\016C" + "onnectionList\022(\n\013connections\030\001 \003(\0132\023.con" + "text.Connection\"^\n\017ConnectionEvent\022\035\n\005ev" + "ent\030\001 \001(\0132\016.context.Event\022,\n\rconnection_" + "id\030\002 \001(\0132\025.context.ConnectionId\"\202\001\n\nEndP" + "ointId\022(\n\013topology_id\030\001 \001(\0132\023.context.To" + "pologyId\022$\n\tdevice_id\030\002 \001(\0132\021.context.De" + "viceId\022$\n\rendpoint_uuid\030\003 \001(\0132\r.context." + "Uuid\"\310\002\n\010EndPoint\022(\n\013endpoint_id\030\001 \001(\0132\023" + ".context.EndPointId\022\014\n\004name\030\002 \001(\t\022\025\n\rend" + "point_type\030\003 \001(\t\0229\n\020kpi_sample_types\030\004 \003" + "(\0162\037.kpi_sample_types.KpiSampleType\022,\n\021e" + "ndpoint_location\030\005 \001(\0132\021.context.Locatio" + "n\0229\n\014capabilities\030\006 \003(\0132#.context.EndPoi" + "nt.CapabilitiesEntry\032I\n\021CapabilitiesEntr" + "y\022\013\n\003key\030\001 \001(\t\022#\n\005value\030\002 \001(\0132\024.google.p" + "rotobuf.Any:\0028\001\"{\n\014EndPointName\022(\n\013endpo" + "int_id\030\001 \001(\0132\023.context.EndPointId\022\023\n\013dev" + "ice_name\030\002 \001(\t\022\025\n\rendpoint_name\030\003 \001(\t\022\025\n" + "\rendpoint_type\030\004 \001(\t\";\n\016EndPointIdList\022)" + "\n\014endpoint_ids\030\001 \003(\0132\023.context.EndPointI" + "d\"A\n\020EndPointNameList\022-\n\016endpoint_names\030" + "\001 \003(\0132\025.context.EndPointName\"A\n\021ConfigRu" + "le_Custom\022\024\n\014resource_key\030\001 \001(\t\022\026\n\016resou" + "rce_value\030\002 \001(\t\"\213\001\n\016ConfigRule_ACL\022(\n\013en" + "dpoint_id\030\001 \001(\0132\023.context.EndPointId\022,\n\t" + "direction\030\002 \001(\0162\031.context.AclDirectionEn" + "um\022!\n\010rule_set\030\003 \001(\0132\017.acl.AclRuleSet\"f\n" + "\021ConfigRule_IPOWDM\022(\n\013endpoint_id\030\001 \001(\0132" + "\023.context.EndPointId\022\'\n\010rule_set\030\002 \001(\0132\025" + ".ipowdm.IpowdmRuleSet\"k\n\023ConfigRule_TAPI" + "_LSP\022(\n\013endpoint_id\030\001 \001(\0132\023.context.EndP" + "ointId\022*\n\010rule_set\030\002 \003(\0132\030.tapi_lsp.Tapi" + "LspRuleSet\"h\n\022ConfigRule_IP_LINK\022(\n\013endp" + "oint_id\030\001 \001(\0132\023.context.EndPointId\022(\n\010ru" + "le_set\030\002 \001(\0132\026.ip_link.IpLinkRuleSet\"\254\002\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\000\022.\n\007ip_link\030\004 \001(\0132\033." + "context.ConfigRule_IP_LINKH\000\0220\n\010tapi_lsp" + "\030\005 \001(\0132\034.context.ConfigRule_TAPI_LSPH\000\022," + "\n\006ipowdm\030\006 \001(\0132\032.context.ConfigRule_IPOW" + "DMH\000B\r\n\013config_rule\"F\n\021Constraint_Custom" + "\022\027\n\017constraint_type\030\001 \001(\t\022\030\n\020constraint_" + "value\030\002 \001(\t\"E\n\023Constraint_Schedule\022\027\n\017st" + "art_timestamp\030\001 \001(\001\022\025\n\rduration_days\030\002 \001" + "(\002\"3\n\014GPS_Position\022\020\n\010latitude\030\001 \001(\002\022\021\n\t" + "longitude\030\002 \001(\002\"\204\001\n\010Location\022\020\n\006region\030\001" + " \001(\tH\000\022-\n\014gps_position\030\002 \001(\0132\025.context.G" + "PS_PositionH\000\022\023\n\tinterface\030\003 \001(\tH\000\022\026\n\014ci" + "rcuit_pack\030\004 \001(\tH\000B\n\n\010location\"l\n\033Constr" + "aint_EndPointLocation\022(\n\013endpoint_id\030\001 \001" + "(\0132\023.context.EndPointId\022#\n\010location\030\002 \001(" + "\0132\021.context.Location\"Y\n\033Constraint_EndPo" + "intPriority\022(\n\013endpoint_id\030\001 \001(\0132\023.conte" + "xt.EndPointId\022\020\n\010priority\030\002 \001(\r\"0\n\026Const" + "raint_SLA_Latency\022\026\n\016e2e_latency_ms\030\001 \001(" + "\002\"0\n\027Constraint_SLA_Capacity\022\025\n\rcapacity" + "_gbps\030\001 \001(\002\"c\n\033Constraint_SLA_Availabili" + "ty\022\032\n\022num_disjoint_paths\030\001 \001(\r\022\022\n\nall_ac" + "tive\030\002 \001(\010\022\024\n\014availability\030\003 \001(\002\"V\n\036Cons" + "traint_SLA_Isolation_level\0224\n\017isolation_" + "level\030\001 \003(\0162\033.context.IsolationLevelEnum" + "\"\242\001\n\025Constraint_Exclusions\022\024\n\014is_permane" + "nt\030\001 \001(\010\022%\n\ndevice_ids\030\002 \003(\0132\021.context.D" + "eviceId\022)\n\014endpoint_ids\030\003 \003(\0132\023.context." + "EndPointId\022!\n\010link_ids\030\004 \003(\0132\017.context.L" + "inkId\"5\n\014QoSProfileId\022%\n\016qos_profile_id\030" + "\001 \001(\0132\r.context.Uuid\"`\n\025Constraint_QoSPr" + "ofile\022-\n\016qos_profile_id\030\001 \001(\0132\025.context." + "QoSProfileId\022\030\n\020qos_profile_name\030\002 \001(\t\"\222" + "\005\n\nConstraint\022-\n\006action\030\001 \001(\0162\035.context." + "ConstraintActionEnum\022,\n\006custom\030\002 \001(\0132\032.c" + "ontext.Constraint_CustomH\000\0220\n\010schedule\030\003" + " \001(\0132\034.context.Constraint_ScheduleH\000\022A\n\021" + "endpoint_location\030\004 \001(\0132$.context.Constr" + "aint_EndPointLocationH\000\022A\n\021endpoint_prio" + "rity\030\005 \001(\0132$.context.Constraint_EndPoint" + "PriorityH\000\0228\n\014sla_capacity\030\006 \001(\0132 .conte" + "xt.Constraint_SLA_CapacityH\000\0226\n\013sla_late" + "ncy\030\007 \001(\0132\037.context.Constraint_SLA_Laten" + "cyH\000\022@\n\020sla_availability\030\010 \001(\0132$.context" + ".Constraint_SLA_AvailabilityH\000\022@\n\rsla_is" + "olation\030\t \001(\0132\'.context.Constraint_SLA_I" + "solation_levelH\000\0224\n\nexclusions\030\n \001(\0132\036.c" + "ontext.Constraint_ExclusionsH\000\0225\n\013qos_pr" + "ofile\030\013 \001(\0132\036.context.Constraint_QoSProf" + "ileH\000B\014\n\nconstraint\"^\n\022TeraFlowControlle" + "r\022&\n\ncontext_id\030\001 \001(\0132\022.context.ContextI" + "d\022\022\n\nip_address\030\002 \001(\t\022\014\n\004port\030\003 \001(\r\"U\n\024A" + "uthenticationResult\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_u" + "uid\030\001 \001(\t\"y\n\rOpticalConfig\0222\n\020opticalcon" + "fig_id\030\001 \001(\0132\030.context.OpticalConfigId\022\016" + "\n\006config\030\002 \001(\t\022$\n\tdevice_id\030\003 \001(\0132\021.cont" + "ext.DeviceId\"C\n\021OpticalConfigList\022.\n\016opt" + "icalconfigs\030\001 \003(\0132\026.context.OpticalConfi" + "g\"g\n\022OpticalConfigEvent\022\035\n\005event\030\001 \001(\0132\016" + ".context.Event\0222\n\020opticalconfig_id\030\002 \001(\013" + "2\030.context.OpticalConfigId\"_\n\021OpticalEnd" + "PointId\022$\n\tdevice_id\030\002 \001(\0132\021.context.Dev" + "iceId\022$\n\rendpoint_uuid\030\003 \001(\0132\r.context.U" + "uid\">\n\017OpticalLinkList\022+\n\roptical_links\030" + "\001 \003(\0132\024.context.OpticalLink\"\304\003\n\022OpticalL" + "inkDetails\022\016\n\006length\030\001 \001(\002\022\020\n\010src_port\030\002" + " \001(\t\022\020\n\010dst_port\030\003 \001(\t\022\027\n\017local_peer_por" + "t\030\004 \001(\t\022\030\n\020remote_peer_port\030\005 \001(\t\022\014\n\004use" + "d\030\006 \001(\010\0228\n\007c_slots\030\007 \003(\0132\'.context.Optic" + "alLinkDetails.CSlotsEntry\0228\n\007l_slots\030\010 \003" + "(\0132\'.context.OpticalLinkDetails.LSlotsEn" + "try\0228\n\007s_slots\030\t \003(\0132\'.context.OpticalLi" + "nkDetails.SSlotsEntry\032-\n\013CSlotsEntry\022\013\n\003" + "key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\0028\001\032-\n\013LSlotsEn" + "try\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\0028\001\032-\n\013S" + "SlotsEntry\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:\002" + "8\001\"\243\001\n\013OpticalLink\022\014\n\004name\030\001 \001(\t\0224\n\017opti" + "cal_details\030\002 \001(\0132\033.context.OpticalLinkD" + "etails\022 \n\007link_id\030\003 \001(\0132\017.context.LinkId" + "\022.\n\021link_endpoint_ids\030\004 \003(\0132\023.context.En" + "dPointId\"0\n\tChannelId\022#\n\014channel_uuid\030\001 " + "\001(\0132\r.context.Uuid\"8\n\rOpticalBandId\022\'\n\020o" + "pticalband_uuid\030\001 \001(\0132\r.context.Uuid\"\247\002\n" + "\013OpticalBand\022.\n\016opticalband_id\030\001 \001(\0132\026.c" + "ontext.OpticalBandId\022,\n\rconnection_id\030\002 " + "\001(\0132\025.context.ConnectionId\022&\n\nchannel_id" + "\030\003 \001(\0132\022.context.ChannelId\022&\n\nservice_id" + "\030\004 \001(\0132\022.context.ServiceId\022#\n\007service\030\005 " + "\001(\0132\020.context.ServiceH\000\022)\n\nconnection\030\006 " + "\001(\0132\023.context.ConnectionH\000\022\021\n\007channel\030\007 " + "\001(\tH\000B\007\n\005field\"=\n\017OpticalBandList\022*\n\014opt" + "icalbands\030\001 \003(\0132\024.context.OpticalBand\"r\n" + "\021ServiceConfigRule\022&\n\nservice_id\030\001 \001(\0132\022" + ".context.ServiceId\0225\n\021configrule_custom\030" + "\002 \001(\0132\032.context.ConfigRule_Custom*j\n\rEve" + "ntTypeEnum\022\027\n\023EVENTTYPE_UNDEFINED\020\000\022\024\n\020E" + "VENTTYPE_CREATE\020\001\022\024\n\020EVENTTYPE_UPDATE\020\002\022" + "\024\n\020EVENTTYPE_REMOVE\020\003*\201\005\n\020DeviceDriverEn" + "um\022\032\n\026DEVICEDRIVER_UNDEFINED\020\000\022\033\n\027DEVICE" + "DRIVER_OPENCONFIG\020\001\022\036\n\032DEVICEDRIVER_TRAN" + "SPORT_API\020\002\022\023\n\017DEVICEDRIVER_P4\020\003\022&\n\"DEVI" + "CEDRIVER_IETF_NETWORK_TOPOLOGY\020\004\022\033\n\027DEVI" + "CEDRIVER_ONF_TR_532\020\005\022\023\n\017DEVICEDRIVER_XR" + "\020\006\022\033\n\027DEVICEDRIVER_IETF_L2VPN\020\007\022 \n\034DEVIC" + "EDRIVER_GNMI_OPENCONFIG\020\010\022\034\n\030DEVICEDRIVE" + "R_OPTICAL_TFS\020\t\022\032\n\026DEVICEDRIVER_IETF_ACT" + "N\020\n\022\023\n\017DEVICEDRIVER_OC\020\013\022\024\n\020DEVICEDRIVER" + "_QKD\020\014\022\033\n\027DEVICEDRIVER_IETF_L3VPN\020\r\022\033\n\027D" + "EVICEDRIVER_IETF_SLICE\020\016\022\024\n\020DEVICEDRIVER" + "_NCE\020\017\022\031\n\025DEVICEDRIVER_SMARTNIC\020\020\022\031\n\025DEV" + "ICEDRIVER_MORPHEUS\020\021\022\024\n\020DEVICEDRIVER_RYU" + "\020\022\022#\n\037DEVICEDRIVER_GNMI_NOKIA_SRLINUX\020\023\022" + "\032\n\026DEVICEDRIVER_OPENROADM\020\024\022$\n DEVICEDRI" + "VER_RESTCONF_OPENCONFIG\020\025*\217\001\n\033DeviceOper" + "ationalStatusEnum\022%\n!DEVICEOPERATIONALST" + "ATUS_UNDEFINED\020\000\022$\n DEVICEOPERATIONALSTA" + "TUS_DISABLED\020\001\022#\n\037DEVICEOPERATIONALSTATU" + "S_ENABLED\020\002*\245\001\n\014LinkTypeEnum\022\024\n\020LINKTYPE" + "_UNKNOWN\020\000\022\023\n\017LINKTYPE_COPPER\020\001\022\022\n\016LINKT" + "YPE_FIBER\020\002\022\022\n\016LINKTYPE_RADIO\020\003\022\024\n\020LINKT" + "YPE_VIRTUAL\020\004\022\027\n\023LINKTYPE_MANAGEMENT\020\005\022\023" + "\n\017LINKTYPE_REMOTE\020\006*\360\002\n\017ServiceTypeEnum\022" + "\027\n\023SERVICETYPE_UNKNOWN\020\000\022\024\n\020SERVICETYPE_" + "L3NM\020\001\022\024\n\020SERVICETYPE_L2NM\020\002\022)\n%SERVICET" + "YPE_TAPI_CONNECTIVITY_SERVICE\020\003\022\022\n\016SERVI" + "CETYPE_TE\020\004\022\023\n\017SERVICETYPE_E2E\020\005\022$\n SERV" + "ICETYPE_OPTICAL_CONNECTIVITY\020\006\022\023\n\017SERVIC" + "ETYPE_QKD\020\007\022\024\n\020SERVICETYPE_L1NM\020\010\022\023\n\017SER" + "VICETYPE_INT\020\t\022\023\n\017SERVICETYPE_ACL\020\n\022\027\n\023S" + "ERVICETYPE_IP_LINK\020\013\022\030\n\024SERVICETYPE_TAPI" + "_LSP\020\014\022\026\n\022SERVICETYPE_IPOWDM\020\r*\304\001\n\021Servi" + "ceStatusEnum\022\033\n\027SERVICESTATUS_UNDEFINED\020" + "\000\022\031\n\025SERVICESTATUS_PLANNED\020\001\022\030\n\024SERVICES" + "TATUS_ACTIVE\020\002\022\032\n\026SERVICESTATUS_UPDATING" + "\020\003\022!\n\035SERVICESTATUS_PENDING_REMOVAL\020\004\022\036\n" + "\032SERVICESTATUS_SLA_VIOLATED\020\005*\251\001\n\017SliceS" + "tatusEnum\022\031\n\025SLICESTATUS_UNDEFINED\020\000\022\027\n\023" + "SLICESTATUS_PLANNED\020\001\022\024\n\020SLICESTATUS_INI" + "T\020\002\022\026\n\022SLICESTATUS_ACTIVE\020\003\022\026\n\022SLICESTAT" + "US_DEINIT\020\004\022\034\n\030SLICESTATUS_SLA_VIOLATED\020" + "\005*]\n\020ConfigActionEnum\022\032\n\026CONFIGACTION_UN" + "DEFINED\020\000\022\024\n\020CONFIGACTION_SET\020\001\022\027\n\023CONFI" + "GACTION_DELETE\020\002*\\\n\020AclDirectionEnum\022\025\n\021" + "ACLDIRECTION_BOTH\020\000\022\030\n\024ACLDIRECTION_INGR" + "ESS\020\001\022\027\n\023ACLDIRECTION_EGRESS\020\002*m\n\024Constr" + "aintActionEnum\022\036\n\032CONSTRAINTACTION_UNDEF" + "INED\020\000\022\030\n\024CONSTRAINTACTION_SET\020\001\022\033\n\027CONS" + "TRAINTACTION_DELETE\020\002*\203\002\n\022IsolationLevel" + "Enum\022\020\n\014NO_ISOLATION\020\000\022\026\n\022PHYSICAL_ISOLA" + "TION\020\001\022\025\n\021LOGICAL_ISOLATION\020\002\022\025\n\021PROCESS" + "_ISOLATION\020\003\022\035\n\031PHYSICAL_MEMORY_ISOLATIO" + "N\020\004\022\036\n\032PHYSICAL_NETWORK_ISOLATION\020\005\022\036\n\032V" + "IRTUAL_RESOURCE_ISOLATION\020\006\022\037\n\033NETWORK_F" + "UNCTIONS_ISOLATION\020\007\022\025\n\021SERVICE_ISOLATIO" + "N\020\0102\274\035\n\016ContextService\022:\n\016ListContextIds" + "\022\016.context.Empty\032\026.context.ContextIdList" + "\"\000\0226\n\014ListContexts\022\016.context.Empty\032\024.con" + "text.ContextList\"\000\0224\n\nGetContext\022\022.conte" + "xt.ContextId\032\020.context.Context\"\000\0224\n\nSetC" + "ontext\022\020.context.Context\032\022.context.Conte" + "xtId\"\000\0225\n\rRemoveContext\022\022.context.Contex" + "tId\032\016.context.Empty\"\000\022=\n\020GetContextEvent" + "s\022\016.context.Empty\032\025.context.ContextEvent" + "\"\0000\001\022@\n\017ListTopologyIds\022\022.context.Contex" + "tId\032\027.context.TopologyIdList\"\000\022=\n\016ListTo" + "pologies\022\022.context.ContextId\032\025.context.T" + "opologyList\"\000\0227\n\013GetTopology\022\023.context.T" + "opologyId\032\021.context.Topology\"\000\022E\n\022GetTop" + "ologyDetails\022\023.context.TopologyId\032\030.cont" + "ext.TopologyDetails\"\000\0227\n\013SetTopology\022\021.c" + "ontext.Topology\032\023.context.TopologyId\"\000\0227" + "\n\016RemoveTopology\022\023.context.TopologyId\032\016." + "context.Empty\"\000\022?\n\021GetTopologyEvents\022\016.c" + "ontext.Empty\032\026.context.TopologyEvent\"\0000\001" + "\0228\n\rListDeviceIds\022\016.context.Empty\032\025.cont" + "ext.DeviceIdList\"\000\0224\n\013ListDevices\022\016.cont" + "ext.Empty\032\023.context.DeviceList\"\000\0221\n\tGetD" + "evice\022\021.context.DeviceId\032\017.context.Devic" + "e\"\000\0221\n\tSetDevice\022\017.context.Device\032\021.cont" + "ext.DeviceId\"\000\0223\n\014RemoveDevice\022\021.context" + ".DeviceId\032\016.context.Empty\"\000\022;\n\017GetDevice" + "Events\022\016.context.Empty\032\024.context.DeviceE" + "vent\"\0000\001\022<\n\014SelectDevice\022\025.context.Devic" + "eFilter\032\023.context.DeviceList\"\000\022I\n\021ListEn" + "dPointNames\022\027.context.EndPointIdList\032\031.c" + "ontext.EndPointNameList\"\000\0224\n\013ListLinkIds" + "\022\016.context.Empty\032\023.context.LinkIdList\"\000\022" + "0\n\tListLinks\022\016.context.Empty\032\021.context.L" + "inkList\"\000\022+\n\007GetLink\022\017.context.LinkId\032\r." + "context.Link\"\000\022+\n\007SetLink\022\r.context.Link" + "\032\017.context.LinkId\"\000\022/\n\nRemoveLink\022\017.cont" + "ext.LinkId\032\016.context.Empty\"\000\0227\n\rGetLinkE" + "vents\022\016.context.Empty\032\022.context.LinkEven" + "t\"\0000\001\022>\n\016ListServiceIds\022\022.context.Contex" + "tId\032\026.context.ServiceIdList\"\000\022:\n\014ListSer" + "vices\022\022.context.ContextId\032\024.context.Serv" + "iceList\"\000\0224\n\nGetService\022\022.context.Servic" + "eId\032\020.context.Service\"\000\0224\n\nSetService\022\020." + "context.Service\032\022.context.ServiceId\"\000\0226\n" + "\014UnsetService\022\020.context.Service\032\022.contex" + "t.ServiceId\"\000\0225\n\rRemoveService\022\022.context" + ".ServiceId\032\016.context.Empty\"\000\022=\n\020GetServi", "ceEvents\022\016.context.Empty\032\025.context.Servi" + "ceEvent\"\0000\001\022?\n\rSelectService\022\026.context.S" + "erviceFilter\032\024.context.ServiceList\"\000\022:\n\014" + "ListSliceIds\022\022.context.ContextId\032\024.conte" + "xt.SliceIdList\"\000\0226\n\nListSlices\022\022.context" + ".ContextId\032\022.context.SliceList\"\000\022.\n\010GetS" + "lice\022\020.context.SliceId\032\016.context.Slice\"\000" + "\022.\n\010SetSlice\022\016.context.Slice\032\020.context.S" + "liceId\"\000\0220\n\nUnsetSlice\022\016.context.Slice\032\020" + ".context.SliceId\"\000\0221\n\013RemoveSlice\022\020.cont" + "ext.SliceId\032\016.context.Empty\"\000\0229\n\016GetSlic" + "eEvents\022\016.context.Empty\032\023.context.SliceE" + "vent\"\0000\001\0229\n\013SelectSlice\022\024.context.SliceF" + "ilter\032\022.context.SliceList\"\000\022D\n\021ListConne" + "ctionIds\022\022.context.ServiceId\032\031.context.C" + "onnectionIdList\"\000\022@\n\017ListConnections\022\022.c" + "ontext.ServiceId\032\027.context.ConnectionLis" + "t\"\000\022=\n\rGetConnection\022\025.context.Connectio" + "nId\032\023.context.Connection\"\000\022=\n\rSetConnect" + "ion\022\023.context.Connection\032\025.context.Conne" + "ctionId\"\000\022;\n\020RemoveConnection\022\025.context." + "ConnectionId\032\016.context.Empty\"\000\022C\n\023GetCon" + "nectionEvents\022\016.context.Empty\032\030.context." + "ConnectionEvent\"\0000\001\0225\n\014GetAllEvents\022\016.co" + "ntext.Empty\032\021.context.AnyEvent\"\0000\001\022@\n\020Ge" + "tOpticalConfig\022\016.context.Empty\032\032.context" + ".OpticalConfigList\"\000\022F\n\020SetOpticalConfig" + "\022\026.context.OpticalConfig\032\030.context.Optic" + "alConfigId\"\000\022I\n\023UpdateOpticalConfig\022\026.co" + "ntext.OpticalConfig\032\030.context.OpticalCon" + "figId\"\000\022I\n\023SelectOpticalConfig\022\030.context" + ".OpticalConfigId\032\026.context.OpticalConfig" + "\"\000\022A\n\023DeleteOpticalConfig\022\030.context.Opti" + "calConfigId\032\016.context.Empty\"\000\022@\n\024DeleteO" + "pticalChannel\022\026.context.OpticalConfig\032\016." + "context.Empty\"\000\0228\n\016SetOpticalLink\022\024.cont" + "ext.OpticalLink\032\016.context.Empty\"\000\0229\n\016Get" + "OpticalLink\022\017.context.LinkId\032\024.context.O" + "pticalLink\"\000\0226\n\021DeleteOpticalLink\022\017.cont" + "ext.LinkId\032\016.context.Empty\"\000\022@\n\022GetOptic" + "alLinkList\022\016.context.Empty\032\030.context.Opt" + "icalLinkList\"\000\022<\n\016GetOpticalBand\022\016.conte" + "xt.Empty\032\030.context.OpticalBandList\"\000\022C\n\021" + "SelectOpticalBand\022\026.context.OpticalBandI" + "d\032\024.context.OpticalBand\"\000\022G\n\027DeleteServi" + "ceConfigRule\022\032.context.ServiceConfigRule" + "\032\016.context.Empty\"\000b\006proto3" };
         descriptor = com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] { com.google.protobuf.AnyProto.getDescriptor(), acl.Acl.getDescriptor(), ipowdm.Ipowdm.getDescriptor(), ip_link.IpLink.getDescriptor(), kpi_sample_types.KpiSampleTypes.getDescriptor(), tapi_lsp.TapiLsp.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/kubernetes/kubernetes.yml b/src/policy/target/kubernetes/kubernetes.yml
index cab8865e0..820135c62 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: 0539e363a3349889ebd7d3d7b0509744e2a4d0aa
-    app.quarkus.io/build-timestamp: 2025-10-28 - 10:10:47 +0000
+    app.quarkus.io/commit-id: 011890de6d6852d8308c9774d504a002cbbeca55
+    app.quarkus.io/build-timestamp: 2025-11-11 - 19:21:22 +0000
     prometheus.io/scrape: "true"
     prometheus.io/path: /q/metrics
     prometheus.io/port: "8080"
@@ -17,18 +17,18 @@ metadata:
   name: policyservice
 spec:
   ports:
-    - name: http
-      port: 9192
+    - name: https
+      port: 443
       protocol: TCP
-      targetPort: 8080
+      targetPort: 8443
     - name: grpc
       port: 6060
       protocol: TCP
       targetPort: 6060
-    - name: https
-      port: 443
+    - name: http
+      port: 9192
       protocol: TCP
-      targetPort: 8443
+      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: 0539e363a3349889ebd7d3d7b0509744e2a4d0aa
-    app.quarkus.io/build-timestamp: 2025-10-28 - 10:10:47 +0000
+    app.quarkus.io/commit-id: 011890de6d6852d8308c9774d504a002cbbeca55
+    app.quarkus.io/build-timestamp: 2025-11-11 - 19:21:22 +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: 0539e363a3349889ebd7d3d7b0509744e2a4d0aa
-        app.quarkus.io/build-timestamp: 2025-10-28 - 10:10:47 +0000
+        app.quarkus.io/commit-id: 011890de6d6852d8308c9774d504a002cbbeca55
+        app.quarkus.io/build-timestamp: 2025-11-11 - 19:21:22 +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:
@@ -75,14 +75,14 @@ spec:
               valueFrom:
                 fieldRef:
                   fieldPath: metadata.namespace
+            - name: MONITORING_SERVICE_HOST
+              value: monitoringservice
             - name: CONTEXT_SERVICE_HOST
               value: contextservice
-            - name: KAFKA_BROKER_HOST
-              value: kafka-service.kafka.svc.cluster.local
             - name: SERVICE_SERVICE_HOST
               value: serviceservice
-            - name: MONITORING_SERVICE_HOST
-              value: monitoringservice
+            - name: KAFKA_BROKER_HOST
+              value: kafka-service.kafka.svc.cluster.local
           image: labs.etsi.org:5050/tfs/controller/policy:0.1.0
           imagePullPolicy: Always
           livenessProbe:
@@ -97,14 +97,14 @@ spec:
             timeoutSeconds: 10
           name: policyservice
           ports:
-            - containerPort: 8080
-              name: http
+            - containerPort: 8443
+              name: https
               protocol: TCP
             - containerPort: 6060
               name: grpc
               protocol: TCP
-            - containerPort: 8443
-              name: https
+            - containerPort: 8080
+              name: http
               protocol: TCP
           readinessProbe:
             failureThreshold: 3
-- 
GitLab


From 276b5c06bf9b0adcbe056f03b6dfda58759f4969 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Thu, 13 Nov 2025 18:21:45 +0000
Subject: [PATCH 101/111] Add missing headers

---
 .../traffic_changer/templates/affect_form.html   | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/src/tests/tools/traffic_changer/templates/affect_form.html b/src/tests/tools/traffic_changer/templates/affect_form.html
index cfdb0296d..204d6ebb2 100644
--- a/src/tests/tools/traffic_changer/templates/affect_form.html
+++ b/src/tests/tools/traffic_changer/templates/affect_form.html
@@ -1,4 +1,20 @@
 
+
+
 
   
     
-- 
GitLab


From 97894f4047466b488ce249576459b72af6170b84 Mon Sep 17 00:00:00 2001
From: gifrerenom 
Date: Thu, 13 Nov 2025 18:28:45 +0000
Subject: [PATCH 102/111] Fix wrong headers

---
 proto/ip_link.proto                                             | 2 +-
 proto/tapi_lsp.proto                                            | 2 +-
 src/automation/service/zsm_handlers/P4INTZSMPlugin.py           | 2 +-
 src/automation/service/zsm_handlers/__init__.py                 | 2 +-
 src/automation/tests/test_automation_handlers.py                | 2 +-
 src/context/service/database/OpticalBand.py                     | 2 +-
 .../service/database/models/OpticalConfig/OpticalBandModel.py   | 2 +-
 src/device/service/drivers/openroadm/OpenROADMDriver.py         | 2 +-
 src/device/service/drivers/openroadm/RetryDecorator.py          | 2 +-
 src/device/service/drivers/openroadm/Tools.py                   | 2 +-
 .../service/drivers/openroadm/templates/Provisioning/common.py  | 2 +-
 .../drivers/openroadm/templates/Provisioning/openroadm.py       | 2 +-
 src/device/tests/dscm/Fixtures.py                               | 2 +-
 .../org/etsi/tfs/policy/context/model/ConstraintExclusions.java | 2 +-
 .../etsi/tfs/policy/context/model/ConstraintTypeExclusions.java | 2 +-
 .../main/java/org/etsi/tfs/policy/context/model/DeviceId.java   | 2 +-
 .../src/main/java/org/etsi/tfs/policy/context/model/LinkId.java | 2 +-
 src/service/service/service_handlers/ipowdm/ConfigRules.py      | 2 +-
 .../service/service_handlers/ipowdm/IpowdmServiceHandler.py     | 2 +-
 src/service/service/service_handlers/ipowdm/__init__.py         | 2 +-
 src/service/service/service_handlers/tapi_lsp/ConfigRules.py    | 2 +-
 .../service/service_handlers/tapi_lsp/Tapi_LSPServiceHandler.py | 2 +-
 src/service/service/service_handlers/tapi_lsp/__init__.py       | 2 +-
 src/service/tests/qkd/test_functional_bootstrap.py              | 2 +-
 src/telemetry/backend/Config.py                                 | 2 +-
 src/telemetry/backend/Tools.py                                  | 2 +-
 src/telemetry/backend/service/ErrorMessages.py                  | 2 +-
 src/telemetry/backend/service/collector_api/DriverFactory.py    | 2 +-
 .../backend/service/collector_api/DriverInstanceCache.py        | 2 +-
 src/telemetry/backend/service/collector_api/Exceptions.py       | 2 +-
 src/telemetry/backend/service/collector_api/FilterFields.py     | 2 +-
 src/telemetry/backend/service/collectors/__init__.py            | 2 +-
 src/tests/ofc24/refresh_op.sh                                   | 2 +-
 src/webui/service/templates/opticalconfig/lightpaths.html       | 2 +-
 src/webui/service/templates/opticalconfig/opticalbands.html     | 2 +-
 src/webui/service/templates/opticalconfig/opticallinks.html     | 2 +-
 36 files changed, 36 insertions(+), 36 deletions(-)

diff --git a/proto/ip_link.proto b/proto/ip_link.proto
index a4f00b0de..9b4294162 100644
--- a/proto/ip_link.proto
+++ b/proto/ip_link.proto
@@ -1,4 +1,4 @@
-// Copyright 2022-2025 ETSI OSG/SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+// Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/proto/tapi_lsp.proto b/proto/tapi_lsp.proto
index 8db84cf7c..da9f1a739 100644
--- a/proto/tapi_lsp.proto
+++ b/proto/tapi_lsp.proto
@@ -1,4 +1,4 @@
-// Copyright 2022-2025 ETSI OSG/SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+// Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/automation/service/zsm_handlers/P4INTZSMPlugin.py b/src/automation/service/zsm_handlers/P4INTZSMPlugin.py
index a16979530..e71e2e6e3 100644
--- a/src/automation/service/zsm_handlers/P4INTZSMPlugin.py
+++ b/src/automation/service/zsm_handlers/P4INTZSMPlugin.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/automation/service/zsm_handlers/__init__.py b/src/automation/service/zsm_handlers/__init__.py
index ae96f895e..6a371461b 100644
--- a/src/automation/service/zsm_handlers/__init__.py
+++ b/src/automation/service/zsm_handlers/__init__.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/automation/tests/test_automation_handlers.py b/src/automation/tests/test_automation_handlers.py
index 16fbcb255..0530e7614 100644
--- a/src/automation/tests/test_automation_handlers.py
+++ b/src/automation/tests/test_automation_handlers.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/context/service/database/OpticalBand.py b/src/context/service/database/OpticalBand.py
index 08b88d55b..6057adaad 100644
--- a/src/context/service/database/OpticalBand.py
+++ b/src/context/service/database/OpticalBand.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/context/service/database/models/OpticalConfig/OpticalBandModel.py b/src/context/service/database/models/OpticalConfig/OpticalBandModel.py
index 735869738..ba69d508d 100644
--- a/src/context/service/database/models/OpticalConfig/OpticalBandModel.py
+++ b/src/context/service/database/models/OpticalConfig/OpticalBandModel.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/openroadm/OpenROADMDriver.py b/src/device/service/drivers/openroadm/OpenROADMDriver.py
index f1a388b84..8468d4723 100644
--- a/src/device/service/drivers/openroadm/OpenROADMDriver.py
+++ b/src/device/service/drivers/openroadm/OpenROADMDriver.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/openroadm/RetryDecorator.py b/src/device/service/drivers/openroadm/RetryDecorator.py
index df37414c1..be86498fe 100644
--- a/src/device/service/drivers/openroadm/RetryDecorator.py
+++ b/src/device/service/drivers/openroadm/RetryDecorator.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/openroadm/Tools.py b/src/device/service/drivers/openroadm/Tools.py
index 45407d38d..33c755d71 100644
--- a/src/device/service/drivers/openroadm/Tools.py
+++ b/src/device/service/drivers/openroadm/Tools.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/openroadm/templates/Provisioning/common.py b/src/device/service/drivers/openroadm/templates/Provisioning/common.py
index 6edaefc2f..55d404f8d 100644
--- a/src/device/service/drivers/openroadm/templates/Provisioning/common.py
+++ b/src/device/service/drivers/openroadm/templates/Provisioning/common.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/openroadm/templates/Provisioning/openroadm.py b/src/device/service/drivers/openroadm/templates/Provisioning/openroadm.py
index 32c03b026..ef51d3a05 100644
--- a/src/device/service/drivers/openroadm/templates/Provisioning/openroadm.py
+++ b/src/device/service/drivers/openroadm/templates/Provisioning/openroadm.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/tests/dscm/Fixtures.py b/src/device/tests/dscm/Fixtures.py
index 458d0d786..ab9e67a90 100644
--- a/src/device/tests/dscm/Fixtures.py
+++ b/src/device/tests/dscm/Fixtures.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/policy/src/main/java/org/etsi/tfs/policy/context/model/ConstraintExclusions.java b/src/policy/src/main/java/org/etsi/tfs/policy/context/model/ConstraintExclusions.java
index 383e14fee..efcf40777 100644
--- a/src/policy/src/main/java/org/etsi/tfs/policy/context/model/ConstraintExclusions.java
+++ b/src/policy/src/main/java/org/etsi/tfs/policy/context/model/ConstraintExclusions.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+ * Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/policy/src/main/java/org/etsi/tfs/policy/context/model/ConstraintTypeExclusions.java b/src/policy/src/main/java/org/etsi/tfs/policy/context/model/ConstraintTypeExclusions.java
index 4436b2b62..b1980c2e2 100644
--- a/src/policy/src/main/java/org/etsi/tfs/policy/context/model/ConstraintTypeExclusions.java
+++ b/src/policy/src/main/java/org/etsi/tfs/policy/context/model/ConstraintTypeExclusions.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+ * Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/policy/src/main/java/org/etsi/tfs/policy/context/model/DeviceId.java b/src/policy/src/main/java/org/etsi/tfs/policy/context/model/DeviceId.java
index fd1352819..facb4c4bf 100644
--- a/src/policy/src/main/java/org/etsi/tfs/policy/context/model/DeviceId.java
+++ b/src/policy/src/main/java/org/etsi/tfs/policy/context/model/DeviceId.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+ * Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/policy/src/main/java/org/etsi/tfs/policy/context/model/LinkId.java b/src/policy/src/main/java/org/etsi/tfs/policy/context/model/LinkId.java
index fe7fcff2a..c7b0c83ce 100644
--- a/src/policy/src/main/java/org/etsi/tfs/policy/context/model/LinkId.java
+++ b/src/policy/src/main/java/org/etsi/tfs/policy/context/model/LinkId.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+ * Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/service/service/service_handlers/ipowdm/ConfigRules.py b/src/service/service/service_handlers/ipowdm/ConfigRules.py
index e36dd7bab..7f48c6071 100644
--- a/src/service/service/service_handlers/ipowdm/ConfigRules.py
+++ b/src/service/service/service_handlers/ipowdm/ConfigRules.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2025 ETSI OSG/SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/service/service/service_handlers/ipowdm/IpowdmServiceHandler.py b/src/service/service/service_handlers/ipowdm/IpowdmServiceHandler.py
index e22c5d28f..db4a41e43 100644
--- a/src/service/service/service_handlers/ipowdm/IpowdmServiceHandler.py
+++ b/src/service/service/service_handlers/ipowdm/IpowdmServiceHandler.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2025 ETSI OSG/SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/service/service/service_handlers/ipowdm/__init__.py b/src/service/service/service_handlers/ipowdm/__init__.py
index 6242c89c7..7363515f0 100644
--- a/src/service/service/service_handlers/ipowdm/__init__.py
+++ b/src/service/service/service_handlers/ipowdm/__init__.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2025 ETSI OSG/SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/service/service/service_handlers/tapi_lsp/ConfigRules.py b/src/service/service/service_handlers/tapi_lsp/ConfigRules.py
index e78379834..d5b4431f9 100644
--- a/src/service/service/service_handlers/tapi_lsp/ConfigRules.py
+++ b/src/service/service/service_handlers/tapi_lsp/ConfigRules.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2025 ETSI OSG/SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/service/service/service_handlers/tapi_lsp/Tapi_LSPServiceHandler.py b/src/service/service/service_handlers/tapi_lsp/Tapi_LSPServiceHandler.py
index f2e1b1de1..31a526fb6 100644
--- a/src/service/service/service_handlers/tapi_lsp/Tapi_LSPServiceHandler.py
+++ b/src/service/service/service_handlers/tapi_lsp/Tapi_LSPServiceHandler.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2025 ETSI OSG/SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/service/service/service_handlers/tapi_lsp/__init__.py b/src/service/service/service_handlers/tapi_lsp/__init__.py
index 6242c89c7..7363515f0 100644
--- a/src/service/service/service_handlers/tapi_lsp/__init__.py
+++ b/src/service/service/service_handlers/tapi_lsp/__init__.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2025 ETSI OSG/SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/service/tests/qkd/test_functional_bootstrap.py b/src/service/tests/qkd/test_functional_bootstrap.py
index daf35f0de..80db786d7 100644
--- a/src/service/tests/qkd/test_functional_bootstrap.py
+++ b/src/service/tests/qkd/test_functional_bootstrap.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/Config.py b/src/telemetry/backend/Config.py
index 73c37610d..02f864a10 100644
--- a/src/telemetry/backend/Config.py
+++ b/src/telemetry/backend/Config.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/Tools.py b/src/telemetry/backend/Tools.py
index 1b047834c..b4f8523e6 100644
--- a/src/telemetry/backend/Tools.py
+++ b/src/telemetry/backend/Tools.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/ErrorMessages.py b/src/telemetry/backend/service/ErrorMessages.py
index 317de8cf6..2a15a75de 100644
--- a/src/telemetry/backend/service/ErrorMessages.py
+++ b/src/telemetry/backend/service/ErrorMessages.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/collector_api/DriverFactory.py b/src/telemetry/backend/service/collector_api/DriverFactory.py
index fd11ca125..23d4c86bd 100644
--- a/src/telemetry/backend/service/collector_api/DriverFactory.py
+++ b/src/telemetry/backend/service/collector_api/DriverFactory.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/collector_api/DriverInstanceCache.py b/src/telemetry/backend/service/collector_api/DriverInstanceCache.py
index 13d43db13..7500bc688 100644
--- a/src/telemetry/backend/service/collector_api/DriverInstanceCache.py
+++ b/src/telemetry/backend/service/collector_api/DriverInstanceCache.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/collector_api/Exceptions.py b/src/telemetry/backend/service/collector_api/Exceptions.py
index 8bc607d95..1871fc2e0 100644
--- a/src/telemetry/backend/service/collector_api/Exceptions.py
+++ b/src/telemetry/backend/service/collector_api/Exceptions.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/collector_api/FilterFields.py b/src/telemetry/backend/service/collector_api/FilterFields.py
index b1d2cb314..103a77105 100644
--- a/src/telemetry/backend/service/collector_api/FilterFields.py
+++ b/src/telemetry/backend/service/collector_api/FilterFields.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/collectors/__init__.py b/src/telemetry/backend/service/collectors/__init__.py
index b2391d623..614870363 100644
--- a/src/telemetry/backend/service/collectors/__init__.py
+++ b/src/telemetry/backend/service/collectors/__init__.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/tests/ofc24/refresh_op.sh b/src/tests/ofc24/refresh_op.sh
index 3a8fca7f9..e3e68fa5e 100644
--- a/src/tests/ofc24/refresh_op.sh
+++ b/src/tests/ofc24/refresh_op.sh
@@ -1,5 +1,5 @@
 #!/bin/bash
-# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (https://tfs.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/webui/service/templates/opticalconfig/lightpaths.html b/src/webui/service/templates/opticalconfig/lightpaths.html
index dba83ca43..3b9346137 100644
--- a/src/webui/service/templates/opticalconfig/lightpaths.html
+++ b/src/webui/service/templates/opticalconfig/lightpaths.html
@@ -1,5 +1,5 @@